Official Porkbun MCP Server
An MCP server that gives AI agents tools to manage Porkbun domains, DNS, and account data via the Porkbun v3 API.
Connectivity & pricing —
pingto verify credentials;check_domain,get_pricing, andlist_marketplacefor availability, TLD pricing, and aftermarket listings.Account & domain reads —
list_domains/get_domain(with filters and labels),get_balance, andget_api_settingsfor spend limits and budget headroom.DNS & registry reads — list nameservers, DNS records, DNSSEC DS records, URL forwards, glue records, inbound transfers (status polling), and fetch a domain's SSL bundle.
Domain lifecycle writes (spend credit) —
register_domain,renew_domain, andtransfer_domain, each requiring a cost that matches the current quote; idempotency-safe retries.Domain settings writes (free) —
update_auto_renewand full-replacementupdate_nameservers.DNS / DNSSEC / forwarding / glue writes (free) — create, update, and delete DNS records; create/delete DNSSEC DS records; create/delete URL forwards; create, update, and delete glue records.
Beyond the schema — the README also documents hosting/WordPress provisioning, Cloudflare connection, webhooks, docs search, and sandbox/mock modes, but none of those tools appear in the supplied schema.
Allows interaction with the Porkbun API, providing tools for domain management including checking availability, pricing, DNS records, DNSSEC, URL forwarding, glue records, domain registration, renewal, transfer, and account settings.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Official Porkbun MCP Servercheck if example.com is available for registration"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Porkbun MCP Server (official)
The official MCP server from Porkbun, built and maintained by Porkbun (by Owen Borseth, Porkbun's CTO). It is published on npm as @porkbunllc/mcp-server and hosted by Porkbun at https://mcp.porkbun.com/mcp. Other "Porkbun MCP" projects on GitHub and in MCP directories are community wrappers around the public API; they are not made or supported by Porkbun. In the official MCP Registry it is listed as com.porkbun/mcp, a name the registry grants only to whoever proves control of porkbun.com; community projects appear under io.github.* names.
A Model Context Protocol server that exposes the Porkbun v3 API as native tools for AI agents — Claude Desktop, Cursor, Cline, and any other MCP-compatible client.
Setup guide, client configs and the full tool list: porkbun.com/mcp
No install: use the hosted connector. Porkbun runs this server at https://mcp.porkbun.com/mcp. Add that URL as a custom connector in ChatGPT or Claude (or claude mcp add --transport http porkbun https://mcp.porkbun.com/mcp in Claude Code), sign in to Porkbun and approve. No API key to copy. Steps per client: Connect ChatGPT or Claude. How it is deployed: deploy/README.md. The ChatGPT and Claude directory listings use a narrower variant, /mcp/no-purchases (no tool that spends money or returns a secret); it changes which tools are offered, not what a connection may do.
Status: full Porkbun v3 coverage (domains, DNS, SSL, hosting, webhooks; current version on the npm badge above). Also runs hosted at
https://mcp.porkbun.com/mcpfor ChatGPT and Claude, with sign-in instead of API keys. Provisions Cloud for WordPress and mints WordPress REST API credentials so an agent can manage the site it just created. Moves domains to a customer's own Cloudflare account and then manages those records, the proxy and zone settings. An isolated sandbox: apk1_sb_key runs every tool against a simulated environment with fake credit — no real registry actions, DNS changes or charges — and still delivers signed webhooks. A credential-free mock server returns schema-accurate example responses for any endpoint.
What's included
Read tools (free, no spend, no state changes)
Tool | Description |
| Verify API connectivity and credentials |
| Check availability and pricing for a single domain |
| TLD registration requirements as JSON Schema — is it API-registerable, the create payload, and registry eligibility fields (.us nexus, .ca legal type, …) |
| Get registration/renewal/transfer pricing for all TLDs (no auth needed) |
| Browse Porkbun Marketplace (names Porkbun customers list themselves); filter by TLD, max price, name substring. For every aftermarket at once, use |
| Search expired-domain closeouts; filter by age, price, TLD, name length; sort by registration date |
| Find taken names that are for sale (Afternic, Sedo, Atom, NameBright, DAX, Porkbun Marketplace), with price, sale type and a link to buy on porkbun.com |
| One closeout plus its binding total (closeout price + the renewal/transfer year) |
| Buy a closeout outright. Spends account credit |
| Paginate through domains; filter by tld, expiry, auto-renew, API access |
| Get metadata for a single domain in the account |
| Get account credit balance |
| Read auto top-up settings, whether a card is on file, and what a top-up would charge |
| Add credit with USDC on Base ($1-$500; Coinbase keeps ~1%, so use |
| Whether a USDC top-up has been paid and credited |
| A payment link an agent pays with the user's card over MPP (Stripe Link agent wallet); credit lands immediately |
| Texts (or calls) a code to the phone on the account, to clear |
| Verifies the phone with the code the user received |
| Emails a code to the address on the account, to clear |
| Verifies the email with the code from that email |
| The account's invoices, newest first: date, paid/refunded state, net total, domains, and a link to each on porkbun.com |
| One invoice as data: bill-to, payment method, lines with terms and expiry dates, and totals |
| The invoice PDF as an embedded file, plus a 15-minute download link that works without signing in |
| The monthly limits actually enforced ( |
| Get current nameservers for a domain |
| List DNS records for a domain |
| Discover what a domain publishes now, from its live nameservers (use before a transfer — a transfer carries no zone data) |
| Bulk-create records from a supplied list or a live scan; idempotent, already-present records are skipped |
| List DNSSEC DS records published at the registry |
| List URL forwarding rules for a domain (incl. exact |
| List email forwards on a domain (address → mailbox), with limits and whether forwarding MX is in place |
| List email hosting mailboxes (including ones waiting to be set up), the price of another, and mail client settings |
| List glue records (host-to-IP mappings) for a domain |
| List in-progress and recent inbound transfers |
| Get status of a specific inbound transfer |
| Retrieve the free Porkbun-issued SSL bundle for a domain |
| Get a domain's four contacts (registrant/admin/tech/billing) with current values |
| List the event types a webhook endpoint can subscribe to |
| List webhook endpoints (URL, events, status, delivery health, secret) |
| Get a single webhook endpoint by id |
| List recent delivery attempts (status, attempts, HTTP, error); ~30-day history |
| Get a single delivery incl. the full signed payload |
| List Porkbun API doc topics (the docs index) |
| Read a doc page as Markdown ( |
| Keyword-search the full reference; returns the most relevant sections |
The list_doc_topics / read_doc / search_docs tools let an agent ground itself in Porkbun's own documentation (the /llms Markdown surface) mid-conversation — no web browsing required, and no API credentials needed. You can add the server purely to research the API, then supply keys when you're ready for live operations.
Account funding (charges a saved card, not credit)
Tool | What it does |
| Turn auto top-up on/off: below |
| Charges the saved card now and adds the credit. Omit |
Domain lifecycle writes (spend account credit)
Tool | Description |
| Register a new domain — call |
| Renew an existing domain |
| Initiate an inbound transfer (returns transferId; takes 5-7 days) |
| Where a held inbound transfer is and what it is waiting on |
| Create the DNS zone for a held transfer, before the domain moves |
| Release a held transfer to the registry (refuses on an empty zone) |
| Cancel a pending inbound transfer and refund it |
| Replace the auth code on a stalled transfer and re-queue it |
Domain settings writes (free)
Tool | Description |
| Turn auto-renewal on or off |
| Replace the nameserver list for a domain (full replace, not append) |
| Edit domain contacts — any subset of registrant/admin/tech/billing; a registrant change fires the new-owner notice email. On address-validated TLDs ( |
DNS / DNSSEC / URL- and email-forwarding / glue writes (free)
Tool | Description |
| Create a new DNS record (A, AAAA, CNAME, MX, TXT, etc.) |
| Update an existing DNS record by its ID |
| Delete a DNS record by its ID |
| Submit a DNSSEC DS record to the registry |
| Remove a DNSSEC DS record by key tag |
| Create a URL forwarding rule (permanent/temporary/masked; optional |
| Delete a URL forwarding rule by ID |
| Forward an address at the domain to another mailbox; asks first ( |
| Delete an email forward; the last one also removes the forwarding MX/SPF |
| Set up a waiting email hosting mailbox (paid, or the free trial every registration includes); generates the password unless one is given |
| Change a mailbox's password |
| Create a glue record (host-to-IP mapping at the registry) |
| Replace the IP list for a glue record |
| Delete a glue record by host |
Secure Static Hosting
Tool | Description |
| List API-provisionable hosting products + plans, with price (cents), interval, trial length, features |
| Provision hosting for a domain by |
| Buy an email hosting mailbox ($36/yr, renews yearly) and set it up in one call; |
| Add a year to a mailbox now at its |
| Get hosting status for a domain (plan, trial, expiry, auto-renew) |
| Upload static files (base64, ≤10MB/call) to a domain's hosting |
| List files under a path in a domain's hosting |
| Delete a file (or empty dir) from a domain's hosting |
| Create a directory (and missing parents) in a domain's hosting (deploy auto-creates dirs in a file path) |
| Deprovision (cancel) hosting for a domain |
Cloud for WordPress
create_hosting with a CLOUDWORDPRESS… sku provisions a managed WordPress site instead of static hosting (the file tools don't apply — manage it through WordPress).
Tool | Description |
| Mint a WordPress Application Password (returned once) so an agent can drive the site via |
| List application passwords on the site (metadata only — passwords can't be re-read) |
| Revoke an application password by uuid, or all of them |
Cloudflare connect (move domains to the customer's own Cloudflare account)
Connecting the Cloudflare account itself is a human step — Cloudflare's consent screen has to be completed in a browser — so get_cloudflare_connection hands you a URL to show your user, then acts as the poll target. Everything after that is automated.
get_cloudflare_connection— connected or not, and where to send the human if not (poll this)list_cloudflare_inventory— every domain with its eligibility and a plain-English reasonpreview_cloudflare_move— exactly which records a move would copy or drop, queueing nothingconnect_domains_to_cloudflare— queue one or many (async: returns queued, never connected)get_cloudflare_queue/get_cloudflare_domain_status— progress, and the audit trailretry_cloudflare_domain/rollback_cloudflare_domain— re-queue a failure, or restore Porkbun nameserversget_cloudflare_records/create_cloudflare_record/edit_cloudflare_record/delete_cloudflare_record— manage DNS in the zone that actually answers once a domain has movedset_cloudflare_proxy— turn the orange cloud on or off, per record (a move always imports DNS-only, on purpose)get_cloudflare_zone— Cloudflare's own zone state, plus nameserver-drift detectionget_cloudflare_zone_settings/set_cloudflare_zone_settings— SSL mode and friendsdisconnect_cloudflare— forget the grant (domains already moved keep working)
Sandbox / test mode
Use a sandbox API key (public key prefixed pk1_sb_, secret sk1_sb_) and every tool above runs against an isolated test environment — same server, you just swap the key. Registrations, renewals, transfers, DNS, contacts, glue, and DNSSEC are all simulated against a separate sandbox datastore: no real registry actions, no DNS changes, no certificates, and no charges. Your sandbox account starts with fake account credit, availability/pricing reflect the real catalog, and every response includes "sandbox": true. Create a sandbox key on porkbun.com/account/api. Or mint one instantly with create_sandbox_key — no signup, no credentials. (Hosting and email endpoints aren't simulated and return SANDBOX_UNSUPPORTED with a sandbox key.)
Tool | Description |
| Start creating a live API key the account holder approves in the browser (optionally with only some permissions); returns the approval link |
| After approval, collect the new key pair once |
| No credentials needed — instantly mint a throwaway sandbox key pair ( |
| Sandbox only — grant fake account credit (default $1000) so paid ops can keep being exercised after funds run out |
| Sandbox only — wipe the sandbox account's domains/DNS/orders/credit and re-grant $1000, for a clean slate between test runs |
| Sandbox only — fire a sample signed webhook event of any type (incl. cron-driven |
Mock server (no credentials)
mock_call returns a schema-accurate example response for any endpoint with no key required — nothing to set up. Pass a path like domain/listAll or dns/create/example.com (omit it to list every mockable endpoint), or set error: true for the error shape. Responses touch no datastore and match the live API's shape exactly, so you can build and test client code before you have any credentials.
Tool | Description |
| No credentials needed — schema-accurate example response for any endpoint ( |
Webhook writes (free)
Tool | Description |
| Register an HTTPS endpoint to receive signed event payloads; returns the signing secret |
| Change an endpoint's URL, events, or status (ACTIVE/DISABLED) |
| Generate a new signing secret for an endpoint |
| Send a |
| Re-queue a past delivery (reuses the original event id) |
| Delete a webhook endpoint |
Porkbun POSTs a signed JSON payload to your endpoint when subscribed events occur (domain.registered, domain.renewed, domain.transfer.completed, domain.expiring, dns.record.created|updated|deleted, cloudflare.connect.completed|failed, account.verification.code_sent|completed; fields per event: https://porkbun.com/llms/webhooks). Verify the X-Porkbun-Signature header — it's sha256= + HMAC-SHA256 of {timestamp}.{rawBody} keyed by the endpoint secret, where {timestamp} is the X-Porkbun-Webhook-Timestamp header.
Related MCP server: domain-suite-mcp
Claude plugin
plugin/ is a Claude plugin (claude.ai, Cowork and Claude Code): the
hosted connector at https://mcp.porkbun.com/mcp/no-purchases plus four skills:
publish-website (publish a site Claude builds to Porkbun Secure Static
Hosting instead of giving upload steps), change-dns-safely, diagnose-domain
(site down, mail bouncing, DNS not updating) and move-dns-to-porkbun. It holds no
code. Install it in Claude Code with /plugin marketplace add oborseth/Porkbun-MCP
then /plugin install porkbun@porkbun (the repo root carries a marketplace file,
.claude-plugin/marketplace.json, pointing at ./plugin), or try a working copy
with claude --plugin-dir ./plugin. Raise version
in plugin/.claude-plugin/plugin.json with every change to the folder.
Gemini CLI
gemini extensions install https://github.com/oborseth/Porkbun-MCPAdds the hosted server (gemini-extension.json at the repo root) and a short
GEMINI.md with usage rules. Then run /mcp auth porkbun to sign in with your
Porkbun account. Keep version in gemini-extension.json in step with
package.json: the extension gallery picks up tagged releases.
Install
You'll need Node.js 18 or newer.
npx -y @porkbunllc/mcp-serverThis downloads and runs the latest version on demand. No global install needed.
Configure your MCP client
Claude Desktop
Add this to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"porkbun": {
"command": "npx",
"args": ["-y", "@porkbunllc/mcp-server"],
"env": {
"PORKBUN_API_KEY": "pk1_your_public_key_here",
"PORKBUN_SECRET_API_KEY": "sk1_your_secret_key_here"
}
}
}
}Restart Claude Desktop. Porkbun tools should appear in the tool picker.
Docs-only, no keys: the documentation tools (
search_docs,read_doc,list_doc_topics) work without credentials, so you can omit theenvblock entirely to use the server just for API research. The authenticated tools return a clear "set PORKBUN_API_KEY" message until you add keys.
Cursor / Cline / Continue
Cursor, one click: Add Porkbun to Cursor adds the hosted server (https://mcp.porkbun.com/mcp); you sign in with Porkbun on first use, no API key. If the link doesn't open from here (some sites strip cursor:// links), use the button on https://porkbun.com/mcp.
For the local server, most MCP-aware editors use the same mcpServers config block as above. See your client's documentation for the exact location. Agents installing it can follow llms-install.md.
Get API keys
Create API keys at porkbun.com/account/api. You'll need both the public key (pk1_…) and the secret key (sk1_…).
Or let the assistant get one: the server starts without keys, and request_api_key (no credentials needed) returns a link where you approve a new key, optionally with only some permissions; retrieve_api_key then hands the assistant the key pair once. Put it in the config below and restart the server.
By default, API access is opt-in per domain. To use the API to manage all your domains, enable the "Opt In All Domains" toggle in the same settings page. Otherwise you'll need to enable API access for each domain individually under Domain Management.
Recommended: scope the key to your agent
Each API key supports three optional restrictions, set at porkbun.com/account/api when you create the key, or later with the gear icon next to it:
Allowed IPs — one entry per line; supports bare IPv4/IPv6 plus CIDR ranges (
198.51.100.0/24,2001:db8::/32). Requests from other IPs fail with HTTP 403IP_NOT_ALLOWEDbefore any other check runs.Allowed domains — one entry per line, exact match. Operations against domains not in the list fail with HTTP 403
DOMAIN_NOT_ALLOWED.Permissions — Full access, Read-only, Manage, but no purchases, or custom scopes (
read,dns,domains,email,hosting,purchase,funding,account). A tool call outside them fails with HTTP 403INSUFFICIENT_SCOPEand changes nothing;pingshows the key'sscopes.
Empty fields = no restriction (matches current behavior). When you give an MCP server a key, the recommended pattern is:
Create a fresh key dedicated to the agent (not your master key).
List the specific domains the agent should manage.
Give it only the permissions it needs (often Manage, but no purchases).
If you know the agent's egress IP, list it too.
The blast radius of an accidentally-leaked key drops to "operations on these domains from this IP" instead of "anything on the account."
Environment variables
Variable | Required | Purpose |
| for live ops | Your Porkbun public API key. Omit to use only the credential-free tools (documentation, |
| for live ops | Your Porkbun secret API key. Omit to use only the credential-free tools (documentation, |
| no | Override the API base URL (e.g. for testing against |
| no | Override the docs host used by the |
| no | Private key ( |
| no | Largest single USDC payment the server will sign, in cents (default |
Local development
git clone https://github.com/oborseth/Porkbun-MCP.git
cd Porkbun-MCP
npm install
npm run build
npm start # or: node dist/index.jsThe server speaks JSON-RPC 2.0 over stdio. Smoke test from a shell:
(printf '%s\n' \
'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}' \
'{"jsonrpc":"2.0","method":"notifications/initialized"}' \
'{"jsonrpc":"2.0","id":2,"method":"tools/list"}') \
| PORKBUN_API_KEY=pk1_… PORKBUN_SECRET_API_KEY=sk1_… node dist/index.jsPaying for purchases directly in USDC (x402)
register_domain, renew_domain, transfer_domain, buy_closeout, create_hosting, create_mailbox and renew_mailbox take pay_with_usdc: true, which skips account credit entirely. The API answers with an x402 payment requirement (USDC on Base, the exact price), and:
with
PORKBUN_X402_PRIVATE_KEYset, this server signs it and the purchase completes in the same tool call. It only signs terms that are exactly the quoted price in USDC on Base, and never abovePORKBUN_X402_MAX_CENTS;without it (and always on the hosted connector, which holds no one's key), the tool returns
status: PAYMENT_REQUIREDwith acheckoutId, anx402Urland apayUrl. Pay thex402Urlwith a wallet tool (for example Coinbase'sawal x402 pay <x402Url> --scheme auth-capture) or have the user pay thepayUrlpage, then call the same tool again withusdc_checkout_id.
If a purchase fails after payment, the payment is not sent back to the wallet: it stays on the Porkbun account as credit (the error says so, with the new balance), ready to retry from credit or spend on anything else. Guide: Pay with USDC (x402).
Paying for purchases by card, with a hold (Stripe MPP)
The same five tools take pay_with_card: true for a user with a Stripe Link agent wallet. The tool returns status: PAYMENT_REQUIRED with a single-use payUrl and a cardPaymentId; pay the link with an MPP wallet tool (link-cli mpp pay <payUrl> -X POST --context "..."; the user approves in Link), which only authorizes the card. Call the same tool again with card_payment_id: the card is charged if the purchase succeeds, and the hold is released (nothing charged) if it fails. Guide: Pay with the user's card (MPP).
Money parameters are in cents, and say so
Every money parameter ends in _cents and takes integer US cents: cost_cents: 1108 is $11.08, amount_cents: 803 is $8.03. The unit is in the name because some clients build their approval prompt from the raw arguments, and a bare amount: 803 was shown to a user as "$803". The old names (cost, amount, threshold, acknowledged_cost, price_min, price_max) are still accepted in the same unit; sending both names with different values is refused before anything reaches the API.
Reliability
Write operations automatically attach a per-call Idempotency-Key header. Retried calls within 24 hours return the cached response, so your agent can safely retry on network errors without double-charging or double-registering.
Privacy
This MCP server is a thin client that runs locally (on your machine, or wherever you host it) and relays your requests directly to the Porkbun API over HTTPS. It does not add any data collection of its own:
What it sends, and to whom. Your API key/secret and the arguments of each tool call are sent only to
https://api.porkbun.com(and, for the credential-free documentation and mock tools, tohttps://porkbun.com). Nothing is sent anywhere else.Storage. The server keeps your credentials in memory for the lifetime of the process (read from environment variables); it does not write them to disk, log them, or cache your data.
Hosted connector. At
mcp.porkbun.comthe same code runs on Porkbun's infrastructure. It holds no API keys: each request carries the user's OAuth access token, which is forwarded to the Porkbun API and kept in memory only briefly (a 30-second validity cache). Request logs record method, path, status and timing, never tokens or request bodies.No telemetry. There is no analytics, tracking, or third-party sharing performed by this connector.
Data you access through it (domains, DNS, contacts, billing, etc.) is your Porkbun account data, handled by Porkbun under its policy.
Full data-handling, retention, third-party, and contact details are in Porkbun's privacy policy: https://porkbun.com/legal/agreement/privacy_policy
License
MIT
Links
Available Tools
107 toolsbuy_closeoutBuy CloseoutAIdempotentInspect
Spends account credit. Buys a closeout at its current price and claims the name. Confirm the total with the user first. cost_cents must equal totalPrice from get_closeout exactly — any other value is refused, so you cannot accidentally charge a price the user did not agree to. Use dry_run with cost 0 to quote without charging. The domain is reserved, not delivered. The provider releases it over the following days, so do not tell the user it is in their account: poll list_domains or watch the domain.registered webhook. Every post-charge failure refunds automatically and reports refunded:true. Losing the race to another buyer (CLOSEOUT_UNAVAILABLE) is not worth retrying on the same name — closeouts are first-come at a fixed price. CLOSEOUT_NOT_ELIGIBLE means support has blocked this account from auctions and closeouts over past-due invoices or an auction terms violation — do not retry, tell the user to contact support. There is no account-age or order-history requirement: eligibility is the same as registering a domain, plus verified email and phone.
| Name | Required | Description | Default |
|---|---|---|---|
| cost | No | Deprecated alias of `cost_cents`, same unit (integer US cents). Send `cost_cents` instead. | |
| domain | Yes | Domain to buy, e.g. `example.com` | |
| dry_run | No | Validate and price without charging or claiming. | |
| cost_cents | No | Exact totalPrice from get_closeout. Use 0 only with dry_run. Required. Integer US cents: 803 means $8.03, not $803. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag readOnlyHint=false and idempotentHint=true; the description goes well beyond them by disclosing that the domain is reserved rather than delivered, that the provider releases it over following days, that post-charge failures auto-refund with refunded:true, and how to observe completion (poll list_domains or the domain.registered webhook). It never contradicts the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the money-spending consequence, then layers workflow, delivery caveat, refund behavior, and error routing as distinct short blocks. Every sentence carries operational information; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-idempotent-feeling purchase with four parameters, no output schema, and real financial consequences, the description covers charging semantics, quoting, delivery timing, verification path, failure/refund handling, and error-code triage. Nothing an agent needs to call it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3; the description adds real value by explaining the enforcement rule ('cost_cents must equal totalPrice from get_closeout exactly — any other value is refused') and the dry_run/cost-0 pairing. It adds little on the deprecated `cost` alias or the `domain` parameter, which the schema already covers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource plus the exact effect: 'Spends account credit. Buys a closeout at its current price and claims the name.' This clearly separates it from get_closeout and search_closeouts, which read rather than purchase.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit preconditions (confirm total with the user, use dry_run with cost 0 to quote) and explicit do-not-retry rules keyed to error codes (CLOSEOUT_UNAVAILABLE, CLOSEOUT_NOT_ELIGIBLE). It also states the eligibility requirements, so the agent knows when this call is valid at all.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_transferCancel TransferADestructiveInspect
Cancels a paid inbound transfer and refunds the order. Confirm with the user first. The order is deliberate: mark cancelled locally, withdraw at the registry, verify the registry accepted the withdrawal, then refund. If the registry state cannot be confirmed it restores the transfer and returns TRANSFER_STATE_UNCONFIRMED rather than refunding something that may still be live — escalate to support in that case rather than retrying. The response reports withdrawnAtRegistry, registryResultCode, refunded and refundAmount.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain whose pending inbound transfer should be cancelled. | |
| dry_run | No | Preview what would happen without cancelling or refunding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructive/openWorld annotations by disclosing the internal sequence (mark cancelled locally, withdraw at registry, verify, refund), the restore-on-failure semantics, the TRANSFER_STATE_UNCONFIRMED outcome, and escalation policy. This is exactly the kind of behavior an agent cannot infer from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the what and the confirm-first rule in bold, then walks through the ordering and failure path. Mostly every sentence earns its place, though 'The order is deliberate' is slightly chatty filler around otherwise load-bearing detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-idempotent mutation with no output schema, it supplies the safety preface, the failure/rollback behavior, the error code to expect, and the response fields (withdrawnAtRegistry, registryResultCode, refunded, refundAmount). An agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are self-documented, so the baseline is 3. The description never mentions 'domain' or 'dry_run' and adds no syntax or selection meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (cancels) plus a precise resource and effect (paid inbound transfer, refunds the order). An agent can distinguish this from list_transfers, get_transfer_status, and start_transfer without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operative context: 'Confirm with the user first' and, on the unconfirmed path, 'escalate to support rather than retrying.' It does not name alternative siblings such as get_transfer_status for inspection, so it stops short of full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_domainCheck DomainARead-onlyIdempotentInspect
Check 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. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Fully qualified domain name to check, e.g. `example.com` |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld/non-destructive, so the safety bar is low, yet the description adds real behavioral context beyond them: concrete rate limits (10 checks/10s here vs 200/min on check_domains), the rationale (Porkbun chunks per registry, batching is cheaper), currency (USD), and a hard downstream constraint that register_domain rejects a mismatched `cost_cents`. None of that is derivable from the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and return values, then the cost-match warning, then the sibling routing. Every sentence carries actionable weight — the return-field list, the USD note, the register_domain constraint, and the budget rationale each earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by enumerating the return fields (availability, registration/renewal/transfer price, premium pricing details) and currency. For a single-parameter read tool, an agent has everything needed to call it and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With one parameter at 100% schema coverage, the schema already documents the FQDN format and example, so the baseline is 3. The description reinforces the single-domain scope ('a single domain', 'Checking more than one name?'), which is useful but does not add syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (check availability) plus resource (a single domain) and even names the sibling it must not be confused with: 'Checking more than one name? Use `check_domains` instead'. The agent can distinguish check_domain from check_domains, get_pricing, and preflight_domain without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit prerequisite ('Use this BEFORE register_domain to confirm cost'), an explicit exclusion, and an explicit alternative with the condition that selects it (batch of up to 25 names → check_domains). Nothing about when-to-use or when-not-to-use is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_domainsCheck DomainsARead-onlyIdempotentInspect
Check 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.
| Name | Required | Description | Default |
|---|---|---|---|
| domains | Yes | Fully qualified domain names to check, e.g. [`example.com`, `example.net`]. Max 25; duplicates are ignored. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnly/idempotent/openWorld). The description adds the budget model (200 domains/60s counted per domain vs the single check's 10/10s), failure modes (BULK_CHECK_TOO_MANY, BULK_CHECK_TOO_SLOW, RATE_LIMIT_EXCEEDED with reason SUSTAINED_BULK_CHECKING), timing (~3s, no polling), and the critical semantic that `unresolved` is neither available nor taken.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then bolded sections for result lists, limits, and error handling. Despite its length, every paragraph carries distinct operational information (budgets, error codes, TLD handling) with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates fully by enumerating the three result lists and their distinct meanings, including the subtle 'unresolved is neither available nor taken, retry those' trap. Nothing needed for correct invocation or interpretation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so 3 is the baseline; the description goes beyond by explaining the consequence of exceeding maxItems (error, checks nothing, no silent truncation) and that duplicates are stripped before the budget is charged. That adds meaning over the schema's terse 'Max 25; duplicates are ignored.'
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb, resource, and scope: 'Check up to 25 domains for availability and price in ONE call.' It explicitly distinguishes itself from the sibling `check_domain` and frames the batch-vs-single tradeoff, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('more than one name'), when-not ('not in a loop' for sustained scanning volume), and prerequisite grouping rules (isolate .de names, split lists over 25). The registry-chunking rationale makes the guidance actionable rather than arbitrary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
configure_auto_topupConfigure Auto TopupADestructiveIdempotentInspect
Set the top-up amount, and/or turn auto top-up on or off.
amount_cents (integer US cents) is what a top-up adds, and it stands on its own: top_up_account_credit charges this same figure on demand, so setting it without enabling automation is a normal thing to do. Capped at $500 (50000) with a $5 floor when set through the API; a larger figure has to be set by the account holder at https://porkbun.com/account/api and is honoured as-is.
enabled: true (with threshold_cents) additionally makes it fire by itself: an order that drops the balance below threshold_cents charges the saved payment method for the amount and adds it — the way to stop an unattended workflow dead-ending on INSUFFICIENT_FUNDS. enabled: false stops it firing on a threshold but KEEPS the amount on file.
Confirm the numbers with the user before calling: this authorises charges to their card. No card is added or changed here, and none can be added over the API. Supports dry_run.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | No | Deprecated alias of `amount_cents`, same unit (integer US cents). Send `amount_cents` instead. | |
| dry_run | No | If true, validate only — returns wouldSucceed and changes nothing. | |
| enabled | No | True to switch auto top-up on (threshold required, plus an amount either here or already on file), false to switch it off. Omit it to change only the amount. | |
| threshold | No | Deprecated alias of `threshold_cents`, same unit (integer US cents). Send `threshold_cents` instead. | |
| amount_cents | No | What a top-up adds, 500-50000 when set via the API. Can be sent on its own. E.g. 10000 = $100. Integer US cents: 803 means $8.03, not $803. | |
| threshold_cents | No | Balance below which a top-up fires. Required when enabling. E.g. 2000 = $20. Integer US cents: 803 means $8.03, not $803. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this destructive/non-read-only/idempotent, and the description adds context the annotations cannot: it authorises real card charges, requires user confirmation, neither adds nor changes cards (nor can a card be added over the API), and that disabling keeps the amount on file. This is exactly the behavioral detail that goes beyond structured hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then structured into per-parameter paragraphs using backticked names. It is on the long side and repeats some cent-unit examples that also appear in the schema, but each paragraph carries usable information rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still discloses the dry_run return (`wouldSucceed`) and what changes vs. persists for each flag combination, covering the interaction model an agent needs for a 6-parameter opt-in/opt-out mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description genuinely adds meaning beyond it: `amount_cents` stands on its own and can be set without enabling, the $500 cap/$5 floor behave differently via API vs. account settings, and `enabled: false` preserves the stored amount — none of which the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a precise verb+resource: setting the top-up amount and/or toggling auto top-up. The body further distinguishes this from `top_up_account_credit` (on-demand charge of the same figure) and from reading state via `get_auto_topup`, so an agent can place it among its siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly covers the when-to-use conditions: setting `amount_cents` alone is normal, `enabled: true` with a threshold makes it fire, `enabled: false` stops firing but keeps the amount, and dry_run validates. It also names the alternative tool (`top_up_account_credit`) and gives an instruction to confirm with the user before calling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
confirm_phone_verificationConfirm Phone VerificationAIdempotentInspect
Verify the account's phone number with the code the user received from send_phone_verification_code. On success, retry what failed with VERIFICATION_REQUIRED; emailVerified: false in the response means the email still needs verifying, which the user does by clicking the link in the verification email (resendable from account settings on porkbun.com). PHONE_CODE_INVALID means a wrong or expired code: check it with the user, or send a new one.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | The code the user received, exactly as texted (case does not matter). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety hints (readOnly=false, idempotent=true, openWorld=true), but the description goes well beyond them by disclosing post-success behavior (retry VERIFICATION_REQUIRED failures), the meaning of emailVerified: false, and the PHONE_CODE_INVALID failure semantics. This is exactly the contextual layer structured fields cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and prerequisite are front-loaded in the first clause, followed by success and error handling. It is a dense multi-clause paragraph but each clause carries actionable information; only slight tightening would help.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with no output schema, the description supplies the missing return semantics (emailVerified flag, PHONE_CODE_INVALID error) and the follow-up workflow. An agent has everything needed to call it and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single parameter whose format constraints (4-12 chars, case-insensitive) are fully documented in the schema. The description only restates that the code comes from the sibling tool, adding no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (verify) and resource (the account's phone number) plus the required input (the code), and explicitly ties the code's origin to the sibling tool send_phone_verification_code. An agent can distinguish it from send_phone_verification_code without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly states when to use it (after the user receives a code from send_phone_verification_code), what to do on success (retry the VERIFICATION_REQUIRED failure), and how to recover from failure (check code with user or send a new one). Both the success path and the error path route the agent to the correct next action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connect_domains_to_cloudflareConnect Domains To CloudflareADestructiveIdempotentInspect
Queue domains to move into the customer's own Cloudflare account: Porkbun creates the zone there, copies over the DNS records it holds, and repoints the registry nameservers at Cloudflare. ASYNCHRONOUS — a successful call means QUEUED, never connected; the work runs in the background over the next few minutes, so poll get_cloudflare_queue afterwards. Results are PER DOMAIN: each name comes back under queued, skipped or alreadyQueued with its own reason. A non-empty skipped is a NORMAL outcome (DNSSEC live, custom nameservers, already connected), NOT a failed call — report the reasons rather than calling the whole thing an error. Eligibility is re-checked right before each domain is acted on, so a queued domain can still be skipped later. Requires the Cloudflare account to be connected first (see get_cloudflare_connection). Use dry_run to preview verdicts without queueing. Max 500 domains per call.
| Name | Required | Description | Default |
|---|---|---|---|
| domains | Yes | Domain names to move into the customer's Cloudflare account. | |
| dry_run | No | Preview the per-domain verdicts without queueing anything. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructive=true and idempotent=true, but the description adds far more: it is ASYNCHRONOUS and a success means QUEUED not connected, results are per-domain with individual reasons, a non-empty `skipped` is normal rather than an error, and eligibility is re-checked before each domain acts. These are exactly the behavioral traits annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the async/queued caveat and the poll-it-next instruction come early where they matter most, and each subsequent sentence adds a distinct fact (per-domain results, skipped-is-normal, eligibility re-check, dry_run, domain cap). No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, yet the description tells the agent the exact result shape (`queued`, `skipped`, `alreadyQueued`) and how to interpret it, plus the async handoff to get_cloudflare_queue. Nothing an agent needs to invoke and correctly interpret this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the schema. The description's dry_run guidance and 500-domain limit largely restate the schema's description and maxItems constraint rather than adding new semantics, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action (queue domains to move into the customer's own Cloudflare account) and then spells out the mechanics: Porkbun creates the zone, copies DNS records, repoints registry nameservers. This is clearly distinguishable from siblings like preview_cloudflare_move or retry_cloudflare_domain.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the prerequisite (Cloudflare account must be connected first, see get_cloudflare_connection), the follow-up action (poll get_cloudflare_queue), the preview path (use dry_run), and the boundary (max 500 domains per call). When-to-use and what-comes-next are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_cloudflare_recordCreate Cloudflare RecordAInspect
Create a DNS record in a domain's Cloudflare zone. IMPORTANT: for a domain that has been moved to Cloudflare this is the tool that changes what actually resolves — create_dns_record writes Porkbun's zone, which no longer answers for it. name accepts "@" for the apex or a bare label like "www". ttl: 1 means Cloudflare-automatic. MX requires priority. proxied (orange cloud) applies to A/AAAA/CNAME only. Record types Cloudflare models as structured objects (SRV, CAA, …) need a data object instead of content. Supports dry_run.
| Name | Required | Description | Default |
|---|---|---|---|
| ttl | No | 1 = automatic (default), otherwise 60-86400. | |
| data | No | Structured value for SRV/CAA/etc, shaped as Cloudflare documents it. | |
| name | No | "@" for the apex, a bare label like "www", or a full hostname. Defaults to the apex. | |
| type | Yes | A, AAAA, CNAME, TXT, MX, NS, PTR or SPF for a plain value; structured types need `data`. | |
| domain | Yes | Domain whose Cloudflare zone to write to. | |
| comment | No | Note stored on the record. | |
| content | No | The value the record points at. Required unless `data` is given. | |
| dry_run | No | ||
| proxied | No | Route through Cloudflare's proxy. A/AAAA/CNAME only. | |
| priority | No | Required for MX; lower is preferred. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive, non-idempotent, closed-world mutation, so the safety baseline is covered. The description adds useful behavior the annotations cannot: dry_run support and the per-type constraints (MX needs priority, proxied only for A/AAAA/CNAME, structured types need data). It does not discuss auth requirements or duplicate-record behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The critical migration caveat is front-loaded as IMPORTANT before the per-parameter rules, which is the right ordering. Density is high and appropriate for 10 parameters, though the back-to-back constraint clauses read as a run-on list rather than cleanly grouped guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter mutation with a nested data object and no output schema, the description covers type-conditional rules, defaults, and dry_run well. It omits any statement about what the call returns or how to verify the record landed, which is the remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high (90%), so the baseline is 3, but the description meaningfully supplements it: "@" for apex, ttl 1 = automatic, priority required for MX only, proxied applicability, and the content-vs-data split for structured record types. This is more than restating the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Create a DNS record in a domain's Cloudflare zone") and explicitly distinguishes itself from the sibling create_dns_record by naming which zone actually resolves. An agent can select between the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear when-to-use rule against the closest alternative ("for a domain that has been moved to Cloudflare this is the tool that changes what actually resolves"), including the consequence of picking the wrong one. It stops short of naming when-not to use it (e.g. for existing records where edit/delete apply), so it is clear context rather than full routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_dns_recordCreate DNS RecordAIdempotentInspect
Create a DNS record on a domain in the authenticated account. Returns the new record's id so it can be referenced by update_dns_record and delete_dns_record. For the name field: omit or pass empty string for the apex/root, otherwise pass the subdomain prefix only (e.g. www, not www.example.com). For MX and SRV records, set prio (priority). Free, doesn't spend account credit. If a record with this exact name, type and content already exists the call fails with DUPLICATE_RECORD and returns that record's id in existingId — use it rather than retrying or creating a variant. If a CNAME would share a name with another record type (forbidden by RFC 1034) the call fails with RECORD_CONFLICT and lists the blocking rows in conflictingRecords; delete those or pick another name.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| ttl | No | Time-to-live in seconds. Minimum 60. Defaults to 600 if omitted. | |
| name | No | Subdomain prefix (no domain). Empty string or omitted = apex. Examples: `www`, `mail`, `api.staging`. | |
| prio | No | Priority — required for MX and SRV records, ignored otherwise. | |
| type | Yes | Record type. Common: A, AAAA, CNAME, MX, TXT. | |
| domain | Yes | Domain to add the record to, e.g. `example.com` | |
| content | Yes | Record value (e.g. an IP for A, a hostname for CNAME, the text body for TXT). | |
| dry_run | No | If true, validate only — returns wouldSucceed without creating the record. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations, which only declare non-readOnly, non-destructive, idempotent, closed-world. The description discloses cost ('free, doesn't spend account credit'), the two error codes and their payload fields, the dry_run validation path, and the important quirk that a write can return SUCCESS with a warnings string when the zone is not actually authoritative. Minor ding: it never reconciles the duplicate-fails behavior with the idempotentHint=true annotation, leaving a small ambiguity about repeat-call semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose and return value before drilling into edge cases, and every paragraph addresses a real failure mode. It is still fairly long with heavy bolding and a mid-paragraph meta-instruction ('Check warnings in the response and pass it on'), which is slightly awkward but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must carry return semantics — and it does: id for downstream update/delete, existingId on DUPLICATE_RECORD, conflictingRecords on RECORD_CONFLICT, warnings on non-authoritative zones, and wouldSucceed under dry_run. Combined with full schema coverage, an agent has everything needed to invoke and interpret the call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so ttl, name, prio, domain and content are already documented in the schema; per the rubric that sets a baseline of 3. The description restates the apex/prefix rule for `name` and the MX/SRV requirement for `prio`, which corroborates but adds no syntax or format detail beyond what the schema already carries.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create a DNS record on a domain') and immediately disambiguates from siblings by naming update_dns_record and delete_dns_record as consumers of the returned id. An agent can distinguish this from create_cloudflare_record or import_dns_records without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete routing conditions: duplicate content → reuse existingId instead of retrying or creating a variant; CNAME name clash → delete conflictingRecords or pick another name; non-Porkbun nameservers → make the change at the other provider or call update_nameservers. It states both when to use and when not to, plus named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_dnssec_recordCreate DNSSEC RecordAIdempotentInspect
Submit a DNSSEC DS record to the registry for a domain. Use when you sign DNS yourself (custom nameservers running BIND/Knot/PowerDNS/etc.) and need to publish the chain-of-trust at the parent zone. Required: keyTag, algorithm, digestType, digest. Optional key-data fields for registries that require full DNSKEY (rare). Algorithms and digest types are validated per registry, not globally: registries are retiring the values deprecated by RFC 9904/9905/9906 on their own schedules, so a value one registry has already dropped may still be accepted by another. A refused value returns DNSSEC_ALGORITHM_DEPRECATED naming a replacement, and retrying the same values will not help. Use alg 8 (RSA/SHA-256) or 13 (ECDSA/SHA-256) with digestType 2 (SHA-256) to be accepted everywhere. A SUCCESS response may carry a warnings array when a value still works but is being retired: the record WAS created. Deprecation never affects list_dnssec_records or delete_dnssec_record.
| Name | Required | Description | Default |
|---|---|---|---|
| alg | Yes | Algorithm number, e.g. `13` for ECDSA P-256 SHA-256, `8` for RSA SHA-256. Algorithms 1, 3, 5, 6, 7 and 12 are deprecated (RFC 9904/9905/9906) and are already refused by some registries. | |
| digest | Yes | Hex-encoded DS digest value. | |
| domain | Yes | Domain to add the DS record to. | |
| keyTag | Yes | DNSSEC key tag (16-bit identifier of the key). | |
| digestType | Yes | Digest type, e.g. `2` for SHA-256, `4` for SHA-384. Digest types 1 (SHA-1) and 3 (GOST R 34.11-94) are deprecated and are being refused registry by registry; 2 is accepted everywhere. | |
| maxSigLife | No | Maximum signature lifetime in seconds (registry-specific, optional). | |
| keyDataAlgo | No | DNSKEY algorithm (optional). | |
| keyDataFlags | No | DNSKEY flags (optional — typically 256 or 257). | |
| keyDataPubKey | No | Base64-encoded public key (optional). | |
| keyDataProtocol | No | DNSKEY protocol (optional — almost always 3). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, but the description goes well beyond them: registry-specific (not global) validation, the DNSSEC_ALGORITHM_DEPRECATED refusal and that retrying identical values won't help, and that a SUCCESS response may include a warnings array even though the record WAS created.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and usage, then escalation-relevant operational detail; every sentence carries information (error code, safe defaults, sibling scope). It is dense and slightly long, but there is no filler or repetition of the schema field list.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter mutation with no output schema, the description supplies the missing behavioral layer: failure semantics (named error code, non-retryable), partial-success semantics (warnings array on SUCCESS), and a universal safe default. Nothing an agent needs to call this correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description adds real meaning: it separates the five required DS fields from the rare optional key-data fields, and recommends safe values (alg 8 or 13 with digestType 2) that are accepted everywhere. It does not cover fields like maxSigLife or keyDataFlags, which the schema handles alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a specific verb+resource: 'Submit a DNSSEC DS record to the registry for a domain.' It is clearly distinguishable from siblings like create_dns_record (zone records), list_dnssec_records, and delete_dnssec_record, and it even scopes the difference by naming the latter two.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it: 'Use when you sign DNS yourself (custom nameservers running BIND/Knot/PowerDNS/etc.) and need to publish the chain-of-trust at the parent zone.' It also tells the agent where the tool does NOT apply by noting deprecation never affects list_dnssec_records or delete_dnssec_record.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_glue_recordCreate Glue RecordAIdempotentInspect
Create a glue record for a host on a domain. Used when running your own nameservers on the same domain they serve (e.g. ns1.example.com serving example.com). The subdomain is just the host part (e.g. ns1), not the full FQDN. Provide IPs as an array of IPv4 and/or IPv6 addresses. Idempotent.
| Name | Required | Description | Default |
|---|---|---|---|
| ips | Yes | Array of IPv4 and/or IPv6 addresses to associate with the host. | |
| domain | Yes | Parent domain, e.g. `example.com` | |
| subdomain | Yes | Host portion only (no domain), e.g. `ns1`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, readOnlyHint=false, and destructiveHint=false. The description's only behavioral note, 'Idempotent', merely repeats the annotation and adds no new information such as auth requirements, error behavior, or conflict handling. With annotations covering the safety profile, a 3 is appropriate as the minimum viable, though the description adds little beyond them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and use case, and the four sentences are generally tight. The final sentence 'Idempotent.' is redundant because the annotation already declares idempotency, and the IPs sentence repeats the schema. Still, it is appropriately sized and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a create operation with full schema coverage and annotations covering safety and idempotency, the description supplies the essential purpose and usage context. It does not explain return values or error behavior, and there is no output schema to compensate. However, the combination of description, schema, and annotations is sufficient for an agent to call the tool correctly, making it nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters. The description's notes that 'subdomain is just the host part' and 'Provide IPs as an array of IPv4 and/or IPv6 addresses' mirror the schema descriptions exactly, adding no new syntax or format constraints. The 'domain' parameter is not mentioned at all in the description. Baseline 3 is correct when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (Create) and resource (glue record for a host on a domain), and the term 'glue record' distinguishes it from the sibling create_dns_record. The example clarifies the exact scenario, allowing an agent to differentiate it from update_glue_record and delete_glue_record.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear use case: 'Used when running your own nameservers on the same domain they serve (e.g. ns1.example.com serving example.com).' This tells the agent when to choose this over a regular DNS record. However, it does not explicitly name an alternative tool or state when not to use it, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_hostingCreate HostingADestructiveInspect
Provision hosting for a domain in the account — Secure Static Hosting OR Cloud for WordPress (a managed WordPress site), chosen by sku. The domain's FIRST provision starts a 15-day FREE trial that auto-renews at the plan price ($3/mo or $30/yr) when it ends; a re-provision after deprovision is charged to account credit (one free trial per domain). Provisioning switches the domain to Porkbun nameservers if it isn't already — set agree_to_nameserver_change: true to allow that. You MUST echo the price in acknowledged_cost_cents (300 monthly / 3000 yearly) so the human is told about the auto-renew/charge. Use dry_run to preview. Provisioning can be async: status may be PENDING — poll get_hosting until ACTIVE before deploying. For a WordPress plan, the file tools (deploy_site/list_hosting_files/…) do NOT apply — manage the site through WordPress instead, using create_wp_credentials to get REST API credentials.
| Name | Required | Description | Default |
|---|---|---|---|
| sku | Yes | The hosting plan SKU to provision. Discover the provisionable SKUs (and each one's price/interval/trial) via list_hosting_plans, then pass the row's `sku`. Secure Static Hosting: `PIXIESECURESTATICM2` ($3.00/mo) / `PIXIESECURESTATICY2` ($30.00/yr). Cloud for WordPress: `CLOUDWORDPRESSM1` ($12.00/mo) / `CLOUDWORDPRESSY1` ($120.00/yr) and the Pro/Business tiers. | |
| domain | Yes | Domain to provision hosting for, e.g. `example.com`. | |
| dry_run | No | Validate + preview without provisioning or charging. | |
| agree_to_terms | Yes | Must be "yes". | |
| acknowledged_cost | No | Deprecated alias of `acknowledged_cost_cents`, same unit (integer US cents). Send `acknowledged_cost_cents` instead. | |
| acknowledged_cost_cents | No | The chosen plan's price — take the `price` field of the SAME row you took `sku` from in list_hosting_plans (e.g. 300 static monthly, 3000 static yearly, 1200 WordPress Starter monthly, 12000 WordPress Starter yearly). Must match exactly or the call is rejected — this confirms the human was told the cost. Required. Integer US cents: 803 means $8.03, not $803. | |
| agree_to_nameserver_change | No | Set true to allow switching the domain to Porkbun nameservers (required when it isn't already on them). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a destructive, non-readonly mutation, and the description adds substantial context beyond them: the 15-day free trial with auto-renew, re-provision charging, one-trial-per-domain limit, mandatory nameserver switch, the cost-acknowledgment gate, and async PENDING status. This is a genuinely informative behavioral profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then sequenced into trial/billing, nameserver, cost-ack, dry-run, async, and WordPress caveats. Dense but nearly every clause carries operational weight; slightly long for a single tool description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description covers the async lifecycle, the polling target, the SKU-dependent tooling difference, and the billing implications. An agent has everything needed to call this correctly and handle the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents sku, domain, dry_run, agree_to_terms, acknowledged_cost_cents, and agree_to_nameserver_change in detail. The description reinforces the cost-echo requirement and nameserver consent but adds little syntax or format detail beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (provision hosting for a domain) and explicitly scopes the two plan families (Secure Static Hosting vs Cloud for WordPress) selected by `sku`. It cleanly distinguishes itself from siblings like list_hosting_plans, get_hosting, and deploy_site.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use `dry_run` to preview, poll get_hosting until ACTIVE before deploying, and for WordPress plans use create_wp_credentials instead of the file tools. Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_sandbox_keyCreate Sandbox KeyAInspect
Instantly create a free SANDBOX API key — NO credentials or approval needed (works before you have any keys). Returns a pk1_sb_ / sk1_sb_ pair for a throwaway test account seeded with $1000 fake credit. Set the returned keys as PORKBUN_API_KEY / PORKBUN_SECRET_API_KEY (or pass them to any tool) and the whole API runs against an isolated sandbox: no real registry actions, DNS changes, certificates, or charges. Ideal for rehearsing register → DNS → renew end-to-end before using a live key. Optional name labels the key.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional label/title for the sandbox key. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-read-only, non-destructive creation, but the description adds rich context beyond them: no credentials or approval needed, returns a pk1_sb_ / sk1_sb_ pair, seeds $1000 fake credit, and runs against an isolated sandbox with no real registry actions or charges.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and key benefit, then details follow logically. Slightly dense but every sentence earns its place with no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description fully explains the return values (pk1_sb_ / sk1_sb_ pair) and how to use them via PORKBUN_API_KEY / PORKBUN_SECRET_API_KEY. It covers all an agent needs to call and apply the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one optional parameter (`name`) with 100% schema description coverage. The description merely restates that it labels the key, adding no syntax or format details beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (create) and resource (sandbox API key), and distinguishes it from siblings by emphasizing it is the bootstrap step that works before any keys exist. An agent can immediately tell it apart from tools like sandbox_reset or sandbox_topup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context: use it for rehearsing register → DNS → renew end-to-end before using a live key, and notes no credentials are needed. No explicit when-not or direct alternative is named, but the sandbox-only scope is implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_url_forwardCreate URL ForwardAIdempotentInspect
Add a URL forwarding rule for a domain. Forwards a subdomain (or apex if subdomain is empty/omitted) to an arbitrary destination URL. Useful for redirects without setting up a web server. Free.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | `permanent` = HTTP 301; `temporary` = HTTP 302 (default); `masked` = loads the destination in a frame (URL masking). For a precise code — including a 307 temporary redirect — use `redirect_type`. | |
| domain | Yes | Domain to add the forward to, e.g. `example.com` | |
| location | Yes | Destination URL to forward visitors to, e.g. `https://newsite.example.com` | |
| wildcard | Yes | `yes` also forwards all sub-subdomains; `no` forwards only the exact subdomain. | |
| subdomain | No | Subdomain prefix to forward. Empty/omitted = the apex (root domain). Examples: `www`, `shop`. | |
| includePath | Yes | `yes` appends the request URI path to the forward target; `no` always sends to the bare destination. | |
| redirect_type | No | Optional exact redirect type; takes precedence over `type`. 301 = permanent, 302 or 307 = temporary (pass 307 here to get a 307), masked = URL masking. Omit to derive from `type` (temporary→302, permanent→301). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety and repeat-safety profile is covered. The description adds a useful cost signal ('Free') and the apex default, but says nothing about required permissions, whether an existing forward on the same domain is overwritten, or rate limits. With annotations doing most of the work, this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with zero waste: the action, the apex-vs-subdomain scope, the rationale, and the cost note. The key behavior is front-loaded and nothing is repeated from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter mutation tool with no output schema, the description covers purpose, scope, and cost, and the annotations carry the safety profile. The schema fully documents the parameters, so omission of redirect_type precedence in prose is not a real gap; only the overwrite/existing-rule behavior is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter including type, wildcard, includePath, and redirect_type is already documented in the schema with enums and precedence rules. The description only echoes the subdomain/apex default, adding no syntax or format detail beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add a URL forwarding rule for a domain') and clarifies the apex-vs-subdomain behavior up front. It cleanly separates itself from the hosting tools by noting it avoids running a web server, but it does not explicitly differentiate from create_dns_record, which an agent might also consider for redirects.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a use case ('redirects without setting up a web server') and a cost note, which implies when to reach for it. However, it names no alternatives and states no conditions under which another tool (e.g. create_dns_record) should be preferred, leaving the routing decision partly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_webhookCreate WebhookAInspect
Register a webhook endpoint. Porkbun will POST a signed JSON payload to url whenever a subscribed event occurs. Returns the new endpoint including its secret — store it securely; it's used to verify the X-Porkbun-Signature header (HMAC-SHA256 over {timestamp}.{rawBody}). url must be a publicly reachable HTTPS endpoint: https:// on port 443, no credentials embedded in the URL, and a hostname that resolves to a public internet address. Private, loopback (including tricks like 127.0.0.1.sslip.io), link-local, CGNAT and reserved addresses are rejected with INVALID_WEBHOOK_URL — do not try to point this at localhost or an internal host. For local development use a public HTTPS tunnel (ngrok, Cloudflare Tunnel) or a sandbox key with sandbox_trigger_webhook. A hostname that does not resolve yet is accepted so you can register before the receiver is deployed, but the rules are re-checked before every delivery. Omit events (or pass ['*']) to subscribe to all event types; you can also pass prefix wildcards like dns.*.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Publicly reachable HTTPS URL Porkbun will POST event payloads to. Port 443 only; the hostname must resolve to a public internet address (private/loopback/reserved targets are rejected). | |
| events | No | Event types to subscribe to, e.g. `['domain.registered','dns.*']`. Omit or use `['*']` for all events. Call get_webhook_event_types for the catalog. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, openWorldHint=true), the description discloses the returned secret, the HMAC-SHA256 signature scheme over {timestamp}.{rawBody}, the exact validation rules, the INVALID_WEBHOOK_URL failure mode, and that rules are re-checked before every delivery. This is unusually rich operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the secret-handling warning, and each sentence carries real information. It is dense and somewhat long, but nearly every clause earns its place; only minor tightening is possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by explaining what is returned (the endpoint including its secret). Combined with the URL constraints and event subscription rules, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds rules the schema omits: no credentials embedded in the URL, port 443 only, and the note that an unresolved hostname is accepted at registration. It also restates the events wildcard semantics already in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Register a webhook endpoint') and immediately scopes the behavior (Porkbun POSTs signed JSON on subscribed events). It is clearly distinguishable from siblings like update_webhook, delete_webhook, and list_webhooks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance and named alternatives: use a public HTTPS tunnel (ngrok, Cloudflare Tunnel) or sandbox_trigger_webhook for local development, and it warns against pointing at localhost/internal hosts. Exclusions are concrete rather than implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_wp_credentialsCreate WP CredentialsAInspect
CLOUD FOR WORDPRESS ONLY. Mint a WordPress Application Password for a domain's managed WordPress site so you can drive it over the WP REST API at https:///wp-json/ using HTTP Basic auth. The password is returned ONCE (WordPress stores only a hash) — save it immediately. Defaults to a dedicated least-privilege porkbun-agent user with the editor role (created on first use), which can manage content but cannot install code. role: "administrator" grants FULL site control including plugin installation (i.e. arbitrary code execution on the site) and therefore requires acknowledge_full_access: true — only request it if the user explicitly asked for admin-level access. The site must be provisioned and ACTIVE (poll get_hosting) — this works on any Cloud for WordPress site in the account however it was provisioned, but free $0 preview sites are excluded. Revoke any time with delete_wp_credentials. Rate limit: 20 mints per account per hour.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Label shown in wp-admin (letters, digits, dashes), e.g. `Acme-Agent`. | |
| role | No | `editor` (default) = content only, recommended for agents. `administrator` = full control incl. plugin install; requires acknowledge_full_access. | |
| domain | Yes | Domain whose WordPress site to mint credentials for. | |
| dry_run | No | Validate without creating anything. | |
| acknowledge_full_access | No | Required when role=administrator: confirms the user understands the credential can run arbitrary code on the site. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the generic safety profile; the description adds the operationally critical facts: the password is returned once and must be saved, the default is a least-privilege porkbun-agent/editor user, administrator implies arbitrary code execution and requires acknowledge_full_access, and there is a 20-per-hour rate limit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the CLOUD FOR WORDPRESS ONLY scope and the core action, then the caveats. Dense but every sentence carries a distinct constraint; only the restated 'save it immediately' warning is mildly redundant with the one-time-return statement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description covers what matters about the return value (one-time password, save immediately) plus the credential semantics. For a 5-param mutation with full schema coverage and annotations, nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3, but the description reinforces the role/acknowledge_full_access coupling with consequences the schema cannot encode (full site control, code execution). It adds risk semantics beyond the enum labels rather than merely restating them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (mint), resource (WordPress Application Password for a domain's managed WP site), and the downstream purpose (drive it over the WP REST API with Basic auth). An agent can distinguish this instantly from list_wp_credentials, delete_wp_credentials, and deploy_site.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit prerequisites (site provisioned and ACTIVE, poll get_hosting), explicit exclusion (free $0 preview sites), explicit routing to a sibling for cleanup (delete_wp_credentials), and an escalation condition for the administrator role. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_cloudflare_recordDelete Cloudflare RecordADestructiveIdempotentInspect
Delete a DNS record from a domain's Cloudflare zone. This changes live DNS for a domain Cloudflare is authoritative for, so confirm with the user first — deleting the wrong record can take a site or its mail offline. Get record_id from get_cloudflare_records. The record is read before deletion, so the response reports exactly what was removed. Supports dry_run.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain whose Cloudflare zone to write to. | |
| dry_run | No | ||
| record_id | Yes | Cloudflare record id from get_cloudflare_records. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive and non-readOnly, but the description adds real context beyond them: live DNS impact, the risk of taking a site or its mail offline, the confirmation requirement, the read-before-delete behavior that makes the response authoritative, and dry_run support.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences with the destructive warning front-loaded and no wasted clauses; every sentence carries operational information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by explaining that the response reports exactly what was removed, plus confirmation and dry_run behavior — everything needed to call this destructive tool safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and dry_run has no schema description, so the description's 'Supports dry_run' supplies the missing meaning. The record_id provenance is echoed from the schema but reinforced with the sibling tool name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a DNS record from a domain's Cloudflare zone') and scopes it to Cloudflare-authoritative zones, which distinguishes it from the sibling delete_dns_record.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear preconditions ('confirm with the user first') and routes the agent to get_cloudflare_records for the record_id. It does not, however, state when to prefer this over the sibling delete_dns_record, so the alternative selection is left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_dns_recordDelete DNS RecordADestructiveIdempotentInspect
Delete a single DNS record by its numeric record_id (obtained from list_dns_records). Idempotent: deleting an already-deleted record returns success. Free.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain the record belongs to, e.g. `example.com` | |
| dry_run | No | If true, validate only — confirms the record exists and is deletable, returns wouldSucceed without deleting it. | |
| record_id | Yes | Numeric record ID (as a string). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it explains that Porkbun hosts a zone for every domain regardless of delegation, that the write succeeds either way, that success may still carry a `warnings` string, and that the agent must not report plain success in that case. It adds cost ('Free') and the exact idempotency semantics (already-deleted returns success), which contextualizes the idempotentHint annotation rather than contradicting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action in the first sentence, then layers idempotency, cost, and the warnings caveat. The warnings paragraph is long but every sentence carries actionable information (what a SUCCESS+warnings means and what to do), so little is waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by explaining the response's `warnings` field and its implications, plus the dry_run preflight. For a destructive, idempotent mutation with annotations covering safety, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so `domain`, `record_id`, and `dry_run` are already fully documented. The description reinforces record_id's provenance (from list_dns_records) but adds no syntax or format detail beyond the schema; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Delete') and resource ('a single DNS record') and identifies the required key 'record_id' plus where to obtain it (`list_dns_records`). An agent can distinguish it from create_dns_record/update_dns_record and from the DNSSEC/Cloudflare/glue delete siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational guidance: delete by record_id from list_dns_records, expect idempotent success, and when the response carries `warnings`, either change the record at the answering provider or offer `update_nameservers`. It routes decisively to a sibling, though it does not explicitly say when NOT to use this tool (e.g., versus delete_cloudflare_record).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_dnssec_recordDelete DNSSEC RecordADestructiveIdempotentInspect
Remove a DNSSEC DS record from the registry for a domain, identified by key tag. Use when retiring a key. Idempotent: deleting a non-existent key tag returns success.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain to remove the DS record from. | |
| keyTag | Yes | Key tag of the DS record to remove (from `list_dnssec_records`). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds real value beyond that by spelling out what idempotency means concretely ('deleting a non-existent key tag returns success') and by scoping the effect to the registry. It stops short of noting downstream consequences such as the domain losing DNSSEC validation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and scope, then the use condition, then the idempotency guarantee. Every sentence carries distinct information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with no output schema, the description covers scope, use case, and idempotency behavior, which is sufficient to call it correctly. It omits any note on required permissions or the fact that removing a DS record disables DNSSEC for the domain, a relevant consequence for a destructive registry operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for both parameters, so the schema carries the burden. The description adds no syntax or format detail beyond noting the record is 'identified by key tag', which merely restates the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource ('Remove a DNSSEC DS record from the registry for a domain') that unambiguously separates it from sibling deletions like delete_dns_record, delete_glue_record, and delete_cloudflare_record. It does not explicitly name a sibling or contrast scope, so it falls short of the top tier.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use when retiring a key' gives an explicit condition for invocation, which is more than implied usage. It does not name alternatives or state when NOT to use it (e.g., when the key is still active), so 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_glue_recordDelete Glue RecordADestructiveIdempotentInspect
Delete a glue record by host on a domain. Idempotent: deleting a non-existent glue record returns success.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Parent domain, e.g. `example.com` | |
| subdomain | Yes | Host portion only, e.g. `ns1`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description usefully spells out what idempotency concretely means ('deleting a non-existent glue record returns success'), but it restates what the annotation hints at and omits the operational consequence of removing a glue record (e.g., nameserver resolution breaking).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the action and identifier front-loaded and the idempotency caveat immediately after. Nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter delete with no output schema and annotations covering destructiveness and idempotency, the description supplies what an agent needs to call it correctly. The only gap is the real-world impact of deleting a glue record, which is a minor omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both domain and subdomain fully documented including examples, so the schema carries the burden. The phrase 'by host on a domain' loosely maps to the two params but adds no format or constraint detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Delete) and resource (glue record), plus the identifying key (by host on a domain). This clearly distinguishes it from sibling tools like create_glue_record, update_glue_record, and list_glue_records.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says what the tool does but gives no guidance on when to choose it over alternatives or what prerequisites exist (e.g., that the glue record must currently exist, or implications for the domain's nameservers). No when/when-not context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_hostingDelete HostingADestructiveIdempotentInspect
Deprovision (cancel) Secure Static Hosting for a domain; teardown is scheduled by Porkbun. Note: the domain has already used its one free trial, so provisioning it again later will be charged (no second free trial).
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain to deprovision hosting for. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, consistent with 'deprovision'. The description adds genuinely new behavioral context beyond them: teardown is asynchronous ('scheduled by Porkbun') and irreversible in cost terms (re-provisioning is charged, no second free trial).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and resource, then a short parenthetical and one 'Note:' clause. Every clause carries information, though the sentence is slightly dense and could be split for clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-param destructive mutation with no output schema, the description covers the safety-relevant facts an agent needs: what is destroyed, that teardown is deferred, and that re-provisioning incurs cost. It lacks only explicit when-to-use/alternative routing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter, and schema coverage is 100%, so the schema fully documents 'domain' (minLength 3, target of deprovisioning). The description adds no format, constraint, or meaning beyond what the schema already provides, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb plus resource ('Deprovision (cancel) Secure Static Hosting') and scopes it to a domain, which distinguishes it from siblings like delete_hosting_file or create_hosting. An agent can identify the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage (cancelling hosting) but never states when to use this versus alternatives such as delete_hosting_file or create_hosting, nor prerequisites like ownership of the domain. The free-trial note gives consequence context but not selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_hosting_fileDelete Hosting FileADestructiveIdempotentInspect
Delete a file or directory at path in a domain's Secure Static Hosting space. Idempotent: a path that is already gone succeeds with alreadyAbsent: true, so there is no need to re-check before retrying. A directory that still has files fails with HOSTING_DIR_NOT_EMPTY and lists its contents; pass recursive: true to delete a directory with everything in it in one call (up to 2,000 items; the site root can never be deleted). To clear out a site, delete its top-level entries with recursive: true rather than file by file. Calls the Porkbun Hosting API (https://porkbun.com/llms/hosting).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to delete, e.g. `old/page.html` or `assets`. | |
| domain | Yes | Domain whose hosting file to delete. | |
| recursive | No | Delete a directory together with everything inside it. Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (destructive/idempotent hints) by disclosing concrete semantics: already-absent paths return alreadyAbsent: true, non-empty directories fail with HOSTING_DIR_NOT_EMPTY and list contents, recursive caps at 2,000 items, and the site root is undeletable. This is exactly the failure/limit context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then each subsequent sentence carries distinct load: idempotency, error behavior, recursive semantics, and the recommended bulk strategy. No filler or restatement of the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still communicates what the call returns on the interesting cases (alreadyAbsent flag, error code plus contents list) and the practical limits. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (baseline 3), and the description adds real meaning on top: it explains what recursive actually does (delete a directory with everything inside, up to 2,000 items) and constrains path (root cannot be deleted). It adds little on domain, hence not a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (delete) and resource (file or directory) and scopes it precisely to 'a domain's Secure Static Hosting space', which separates it from service-level tools like delete_hosting and from make_hosting_dir/list_hosting_files. An agent can select it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational guidance: no need to pre-check because of idempotency, use recursive instead of file-by-file to clear a site, and recursive handles directories with contents. It does not explicitly name sibling tools (e.g., delete_hosting vs. this) or state prerequisites such as domain ownership, so it stops just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_url_forwardDelete URL ForwardADestructiveIdempotentInspect
Delete a URL forwarding rule by its id (obtained from list_url_forwards). Idempotent.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain the forward belongs to. | |
| record_id | Yes | Numeric forward record ID from `list_url_forwards`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description restating 'Idempotent' is redundant with the annotation but does not contradict it, and it adds no new behavioral context such as irreversibility of the domain or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single tight sentence, front-loaded with the verb and resource, one clause for the id source and one word for idempotency. No waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, no-output schema delete tool, the definition is adequate but thin: it omits whether deletion has side effects, what the response confirms, or error behavior when the id is stale. Annotations carry the safety bits, leaving the agent to infer the rest.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both domain and record_id are already documented, including the note that record_id comes from list_url_forwards. The description repeats the id sourcing but adds no syntax or format beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb 'Delete' on specific resource 'URL forwarding rule', with the identifier named. Distinguishes from siblings like delete_webhook, delete_dns_record, delete_glue_record by naming the exact resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Points to list_url_forwards as the source of the id, which implies you must list first, but gives no explicit when-to-use vs alternatives or preconditions (e.g., that the rule must exist, or what happens to the domain if it's the only rule).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_webhookDelete WebhookADestructiveIdempotentInspect
Delete a webhook endpoint by id. Deliveries stop immediately. Idempotent in effect: deleting a non-existent endpoint returns an error you can safely ignore.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The webhook endpoint id to delete. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark destructiveHint=true and idempotentHint=true, but the description adds that deliveries stop immediately and clarifies idempotent behavior—a non-existent id returns an error that is safe to ignore. These are useful nuances beyond the annotations, though auth requirements and permanence details remain unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and followed by impact and idempotency clarification. No redundant or filler text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter delete with rich annotations and no output schema, the description covers the essential effects. However, it lacks details about whether deletion is reversible or what happens to webhook secrets/events, leaving minor gaps for a destructive operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the single parameter is fully documented in the schema. The description only restates 'by id' without adding format, range, or source-of-id guidance, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Delete') and resource ('webhook endpoint') and identifies the key parameter ('by id'). The action is unmistakably distinct from sibling reads (get_webhook, list_webhooks) and other mutations (update_webhook, create_webhook).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance or alternatives are given. The description does not say when deletion is preferable to disabling via update_webhook, nor does it mention prerequisites such as ownership or authentication.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_wp_credentialsDelete WP CredentialsADestructiveIdempotentInspect
CLOUD FOR WORDPRESS ONLY. Revoke a WordPress application password by uuid (from list_wp_credentials), or every one for the user with all: true. Anything using that credential stops authenticating immediately.
| Name | Required | Description | Default |
|---|---|---|---|
| all | No | Revoke every application password for the user. | |
| uuid | No | The application password uuid to revoke. | |
| domain | Yes | Domain whose WordPress site to revoke on. | |
| dry_run | No | Validate without revoking. | |
| wp_user | No | WordPress username (defaults to `porkbun-agent`). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds a consequence that structured fields cannot express: 'Anything using that credential stops authenticating immediately.' That instant-effect disclosure is exactly the kind of behavioral context an agent needs before choosing to revoke.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the hard constraint (Cloud for WordPress only) and the instant-effect warning. Every clause carries information; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, single-domain revocation tool with no output schema, the definition covers the applicable context, both revocation modes, the uuid source, and the operational consequence. Minor gaps remain around wp_user defaults and the dry_run validation path, though the schema covers those fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the schema documents each parameter. The description still adds value by linking uuid to its origin (list_wp_credentials) and clarifying that all: true revokes every credential for the user, which is more meaningful than the bare schema text. It says nothing about domain, wp_user, or dry_run, so it is not fully additive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (revoke), a specific resource (WordPress application password), and a scope qualifier (CLOUD FOR WORDPRESS ONLY). It also distinguishes the two revocation modes (single uuid vs all: true), so an agent can tell exactly what this does versus siblings like list_wp_credentials.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly bounds the applicable context with 'CLOUD FOR WORDPRESS ONLY' and points at list_wp_credentials as the source of the uuid, which tells the agent when this tool applies. It does not name an explicit alternative for the non-revocation case or mention prerequisites/permissions, so it falls just short of full guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deploy_siteDeploy SiteADestructiveInspect
Upload static files to a domain's Secure Static Hosting. files is an array of { path, content } where content is the file's bytes base64-encoded. A path may include directories (e.g. assets/css/style.css) — missing parent directories are created automatically. ≤10MB total per call (split larger sites across calls). Only static-web file types are accepted (html/css/js/images/fonts/…); server-executable types are rejected. Hosting must be ACTIVE (check get_hosting first). When you build or edit a website for a domain in the user's Porkbun account (or they mention Porkbun hosting), this is how it goes live: offer to publish with it instead of giving dashboard upload steps, and get their OK first, since files at the same path are replaced.
| Name | Required | Description | Default |
|---|---|---|---|
| files | Yes | Files to upload. | |
| domain | Yes | Domain whose hosting to deploy to. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true / idempotentHint=false, and the description adds the concrete consequence: files at the same path are replaced, so prior content is lost. It also discloses size limits (≤10MB per call), accepted file types, rejection of server-executable types, and automatic parent-directory creation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and constraint data, then the routing/consent guidance. Every sentence carries information, though the final sentence is long and could be split for readability. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers operation, encoding, path semantics, size limit, file-type restrictions, host-state prerequisite, destructive overwrite behavior, and agent routing/consent behavior. With no output schema needed for an upload tool, nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: base64 encoding of content is restated helpfully, path values may include directories, and missing parents are auto-created. The ≤10MB total constraint on files is also a semantic constraint the schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (upload) and resource (static files to a domain's Secure Static Hosting), and is clearly distinguishable from siblings like delete_hosting_file, make_hosting_dir, and create_hosting. An agent can identify the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the prerequisite (hosting must be ACTIVE; check get_hosting first), the alternative to avoid (giving dashboard upload steps), the trigger context (building/editing a site for a Porkbun domain), and the consent requirement (get their OK first). This is about as complete as usage guidance gets.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diff_dns_restore_pointDiff DNS Restore PointARead-onlyIdempotentInspect
Compare a DNS restore point with the live zone before changing anything. Always do this before restore_dns_zone — it is free and it is the difference between fixing a zone and finding out afterwards.
missing is in the restore point but not live: these are the records a restore would ADD BACK. extra is live but not in the restore point: a restore LEAVES THESE ALONE unless you pass prune. inSync is true when both lists are empty.
Records are matched on name, type, content and priority rather than id, because an id means nothing across a delete and re-create. SOA and NS are excluded — the zone's own delegation is not what anyone means by their DNS records. For masked records (parking, ALIAS, HTTPS) the value shown is the one that was configured, not the internal host it resolves to.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain, e.g. `example.com` | |
| snapshot_id | Yes | Restore point id from `list_dns_restore_points`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantial non-obvious behavior: the meaning of missing/extra/inSync, that `extra` records survive a restore unless prune is passed, matching on name/type/content/priority rather than id, SOA/NS exclusion, and masked-record value semantics. This is rich context well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and the imperative ordering before expanding into result semantics. Dense but every sentence carries distinct, useful information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description fully explains the return shape (missing/extra/inSync) and matching rules, which is exactly what the agent needs to interpret results. Nothing material is missing for a read-only diff tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage and only 2 required params, the schema already documents domain and snapshot_id (including the list_dns_restore_points reference). The description adds interpretive semantics (matching rules) but no parameter syntax or format detail, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (compare) and resource (DNS restore point vs live zone), and explicitly distinguishes itself from restore_dns_zone as the safe pre-flight step. An agent can tell exactly what this does and why it differs from its nearest sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs 'Always do this before restore_dns_zone', naming the alternative and the ordering condition. It also notes it is free, giving the agent a clear when-to-use signal with no inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
disconnect_cloudflareDisconnect CloudflareADestructiveIdempotentInspect
Remove this account's stored Cloudflare connection. Domains already moved stay on Cloudflare and keep resolving — this only stops Porkbun making further changes on the customer's behalf. Reconnecting requires the human browser authorization again, so confirm before calling.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Validate without disconnecting. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false. The description adds valuable context beyond annotations: that domains already moved remain resolving on Cloudflare, and reconnecting requires browser authorization again — information not derivable from annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly written sentences front-load the core action, follow with important consequences, and end with a practical caution. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, no-output-schema tool with rich annotations, the description covers the key behavioral nuances: what persists, what stops, and what reconnection entails. Minor gap: does not clarify whether the dry_run parameter triggers any actual state changes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the single dry_run parameter is already described in the schema. The description adds no syntax or format details for the parameter, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Remove) and resource (this account's stored Cloudflare connection), clearly distinguishing it from sibling connection-management tools like get_cloudflare_connection and connect_domains_to_cloudflare.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context on consequences (domains stay on Cloudflare, no further changes made on customer's behalf) and a caution to confirm before calling. No explicit when-not-to-use or naming of alternative tools, but the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_cloudflare_recordEdit Cloudflare RecordADestructiveIdempotentInspect
Update a DNS record in a domain's Cloudflare zone. Partial: fields you omit keep their current value. Get record_id from get_cloudflare_records. The response includes both the new record and the previous one, so you can tell the user exactly what changed. Supports dry_run.
| Name | Required | Description | Default |
|---|---|---|---|
| ttl | No | 1 = automatic, otherwise 60-86400. | |
| data | No | ||
| name | No | "@" for the apex, or a bare label. | |
| type | No | ||
| domain | Yes | Domain whose Cloudflare zone to write to. | |
| comment | No | ||
| content | No | ||
| dry_run | No | ||
| proxied | No | A/AAAA/CNAME only. | |
| priority | No | ||
| record_id | Yes | Cloudflare record id from get_cloudflare_records. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true; the description adds genuinely useful behavior beyond them: partial-update semantics, that the response returns both the new and previous record, and that dry_run is supported. It does not explain what dry_run actually does or what authorization is required, keeping it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the core action, then prerequisites, return behavior, and dry_run. No filler; each sentence carries information. Slightly terse on dry_run rather than verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and 11 parameters including a nested object param, the description does cover return shape ('new record and the previous one'), which is valuable. However it omits what dry_run does, the meaning of the free-form `data` object, and validation constraints, leaving real gaps for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 45% across 11 params, so the description must compensate. It clarifies partial-update behavior and where record_id comes from, but leaves several parameters (data, comment, content, type, priority) unelaborated in the description while the schema also omits descriptions for them. Baseline 3 for partial compensation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: 'Update a DNS record in a domain's Cloudflare zone.' An agent can distinguish this from create_cloudflare_record and delete_cloudflare_record by name and verb. It does not explicitly differentiate from the non-Cloudflare sibling update_dns_record, but the scope wording ('Cloudflare zone') largely covers that.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear prerequisite/context: 'Get `record_id` from get_cloudflare_records.' It states the partial-update contract (omitted fields keep current value), which tells the agent how to invoke it. It lacks any explicit when-not or alternative-tool routing, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_api_settingsGet API SettingsARead-onlyIdempotentInspect
Get the account's API spend controls and the limits actually enforced, in cents. spendLimit caps everything bought over the API in a calendar month (registrations, renewals, transfers, closeouts, paid hosting): limit, source (account = set by the account holder, default = none set so $100 applies, none = no cap), spent and remaining. topupLimit caps credit added over the API (card, auto top-up, MPP, USDC together): limit, source, added. settings is what the account holder configured. Check remaining before an expensive operation: a purchase over it fails with MONTHLY_SPEND_LIMIT_EXCEEDED, and only the account holder can raise the limit, on the website.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/non-destructive safety, yet the description adds real behavioral context: the semantics of `source` (account/default/none with the $100 fallback), the exact error code a purchase over the cap raises, and the authorization constraint that only the account holder can raise the limit. This is value well beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and dense with useful specifics, but the field enumeration is long and slightly list-like. Nearly every clause earns its place, so it stays efficient despite the length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no parameters, the description must carry the full burden of explaining what comes back and how to act on it, and it does so thoroughly — field meanings, fallback defaults, error code, and remediation path are all present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description instead documents the response field semantics in detail (limit/source/spent/remaining, added), which is extra helpful given there is no output schema, though it is not strictly parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource: retrieving the account's API spend controls and the limits actually enforced. It enumerates the three top-level result groups (spendLimit, topupLimit, settings) so the agent knows exactly what the tool surfaces, distinguishing it from balance/pricing siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to check `remaining` before an expensive operation and describes the resulting failure mode (MONTHLY_SPEND_LIMIT_EXCEEDED) plus the escalation path (only the account holder can raise it, on the website). It lacks an explicit pointer to sibling tools (e.g. get_balance) for related needs, keeping it short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_auto_topupGet Auto TopupARead-onlyIdempotentInspect
Read 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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safe-read profile (readOnlyHint, idempotentHint, destructiveHint=false), so the bar is lower. The description adds genuinely useful context beyond them: the inert-when-no-payment-method behavior and the constraint that a card can only be saved on porkbun.com, never through the API. It could go further on how effectiveAmount is computed, but this is solid added value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with what the tool reads before the caveats. Every clause carries information, though the second sentence stacks two distinct warnings and is a little dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must explain return values, and it does so by naming the key fields and the meaning of effectiveAmount. Combined with annotations covering the safety profile, an agent has enough to call and interpret it, though it does not describe the concrete type/format of the numeric fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so the baseline is 4. Though there is nothing to disambiguate on input, the description explains the semantics of the returned fields (notably `effectiveAmount` and `paymentMethodOnFile`), which compensates for the absence of any other field documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Read') and resource ('auto top-up configuration') and enumerates exactly what is returned: on/off state, threshold, amount, payment-method-on-file, and effectiveAmount. This cleanly distinguishes it from siblings like configure_auto_topup and top_up_account_credit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: it clarifies that effectiveAmount is what top_up_account_credit would charge, which hints at the read-before-write relationship, and warns that settings are inert without a payment method. But it never explicitly says when to call this versus configure_auto_topup or the other top-up siblings, nor any preconditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_balanceGet BalanceARead-onlyIdempotentInspect
Get 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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the description is not required to establish safety. It does add genuinely non-schema behavior: the balance is denominated in cents as an integer with a parallel display string, and it explains the side-effect-free but decision-critical role of the value in the purchase flow. It stops short of stating auth prerequisites or refresh/staleness behavior, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and return format in the first two sentences, with the routing guidance after. The final sentence about the card-less fallback and the top-up branch is dense and slightly run-on, but each clause corresponds to a real decision the agent must make, so nothing is decorative padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read with no output schema, the description covers everything an agent needs: what is returned and in what unit, when to call it, and where to route the user when the balance is insufficient. No return-value gap is left open because the description itself supplies the response shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description usefully compensates for the absent output schema by describing the returned fields (integer cents and a human-readable string such as `$12.34`), which is more than the empty input schema conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ('Get the available account credit balance for the authenticated Porkbun account') and immediately distinguishes it from related sibling operations by scoping it to prepaid credit rather than card charges. The return shape (integer cents plus display string) is stated up front, so an agent knows exactly what this tool produces versus get_auto_topup or get_pricing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when ('Call it before offering to buy anything'), the reason (purchases are paid from prepaid balance, so this decides whether a registration/renewal/transfer goes through), and named alternatives with conditions: top_up_account_credit when the account has a saved card, get_auto_topup to check whether a card is on file. It even covers the negative case (no card, or agent does not charge cards on the user's behalf) with a concrete fallback URL.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_closeoutGet CloseoutARead-onlyIdempotentInspect
Get one closeout plus totalPrice — the binding amount, which is the closeout price plus the registration year that comes with it. Always call this before buy_closeout: totalPrice is what you must pass as cost_cents, and it cannot be derived from search results because a name already at Porkbun is renewed while anything else is transferred in, and those price differently. available: false means somebody already claimed it. Quote the user totalPrice, never the search price.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain offered as a closeout, e.g. `example.com` |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the read-only/idempotent/safe profile, and the description adds substantial context beyond them: the renew-vs-transfer pricing rationale, the `available: false` sentinel meaning, and the warning not to quote the search `price`. This is exactly the non-obvious behavior an agent cannot infer from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose in the first clause, then layers contract, rationale, and sentinel meaning. Dense and mostly waste-free, though the pricing explanation sentence is long and slightly hard to parse in one reading.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly takes on return-value explanation: it defines `totalPrice` and `available`, and warns that `totalPrice` (not the search `price`) is user-facing. Nothing needed to call and use the result correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single documented `domain` parameter, so the schema carries the load. The description references `cost_cents` (a parameter of the sibling `buy_closeout`, not this tool) and adds no syntax or format detail for `domain`; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (get) and resource (one closeout), and immediately qualifies it with the derived `totalPrice` field that makes the tool distinct. An agent can distinguish it from `search_closeouts` and `buy_closeout` without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit sequencing rule: 'Always call this before buy_closeout' plus the exact contract (pass totalPrice as `cost_cents`). It also explains why search results are insufficient, and gives an exclusion condition (`available: false` means already claimed).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cloudflare_connectionGet Cloudflare ConnectionARead-onlyIdempotentInspect
Check whether this Porkbun account is connected to a Cloudflare account, and which one. THIS IS THE POLL TARGET for the connect flow. Connecting is a HUMAN action: Cloudflare's consent screen must be completed in a browser and the authorization is bound to the Porkbun web session that starts it, so it cannot be driven over the API. When connected is false the response includes a connectUrl — show that URL to the user, ask them to authorize, then call this tool again every few seconds until connected is true. Everything else in the Cloudflare flow is fully automatable once this is true.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it as a safe, idempotent, read-only, non-open-world call, and the description adds the crucial non-obvious behavior: authorization is bound to the web session and cannot go over the API, plus the polling contract and the connectUrl fallback. This is well beyond what the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose and the poll-target role, then adds the human-action caveat and the loop. Slightly dense but every sentence carries operational weight; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description explains the key return values and the state machine (connected false → connectUrl → poll). For a zero-parameter read tool this covers everything an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description goes further by describing response fields (connected, connectUrl) and the conditional when connectUrl is present, which is useful though not strictly a parameter concern.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Check whether this Porkbun account is connected to a Cloudflare account, and which one') and immediately identifies its role in the larger connect flow. It is clearly distinguishable from siblings like disconnect_cloudflare and connect_domains_to_cloudflare.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames itself as 'THIS IS THE POLL TARGET for the connect flow', states when connecting is not API-drivable (human browser consent), and prescribes the exact loop: show connectUrl, ask user to authorize, re-call every few seconds until connected is true. Also notes everything else is automatable downstream.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cloudflare_domain_statusGet Cloudflare Domain StatusARead-onlyIdempotentInspect
Get the Cloudflare move status for ONE domain, including the Cloudflare zone id once created and the nameservers Porkbun replaced (kept so the move can be undone). Returns NOT_QUEUED if the domain has never been queued.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain to check. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds real behavioral value beyond that: it discloses the return payload (zone id, replaced nameservers kept for undo) and the NOT_QUEUED sentinel for unqueued domains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no waste, with the scope constraint and purpose front-loaded before the return-value detail. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must carry return-value meaning, and it does name the key fields plus the NOT_QUEUED case. It stops short of describing the full status enumeration or the error/missing-domain behavior, leaving a small gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single 'domain' parameter, so the schema already documents it. The description adds no format, casing, or validation detail beyond what the schema supplies, matching the baseline for a fully covered parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (get), resource (Cloudflare move status) and narrows scope to ONE domain, which cleanly separates it from batch siblings like get_cloudflare_queue and get_cloudflare_zone. The two key payload fields are named, so an agent knows what it retrieves.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The NOT_QUEUED sentence implies when the tool is meaningful (a domain that has been queued for a Cloudflare move), but there is no explicit guidance on when to use this versus get_cloudflare_queue, get_cloudflare_zone, or preview_cloudflare_move. Usage is inferable, not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cloudflare_queueGet Cloudflare QueueARead-onlyIdempotentInspect
List every Cloudflare move this account has requested, with per-domain status and message. Use this to poll progress after connect_domains_to_cloudflare. Queue rows are never deleted, so this is also the audit trail of past moves.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered structurally. The description adds real behavioral context beyond that: rows are never deleted, making this the audit trail, and each row carries per-domain status plus a message.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, all front-loaded: what it returns, when to call it, and a durability/audit property. No filler, and each sentence adds a distinct piece of information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully signals the return shape ('per-domain status and message'), and annotations cover the safety profile. It stops short of describing ordering, grouping, or volume of rows, but for a zero-parameter read tool this is close to complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the schema carries no parameter semantics to document and the baseline is 4. Nothing is missing on this dimension.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List'), resource ('every Cloudflare move this account has requested'), and output content ('per-domain status and message'). The account-wide scope cleanly separates it from per-domain siblings like get_cloudflare_domain_status and get_cloudflare_connection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the triggering workflow: 'Use this to poll progress after connect_domains_to_cloudflare.' That is clear when-to-use guidance, but it offers no when-not-to-use or explicit alternative (e.g., when to prefer get_cloudflare_domain_status for a single domain).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cloudflare_recordsGet Cloudflare RecordsARead-onlyIdempotentInspect
List a domain's LIVE DNS records as Cloudflare holds them, each with its orange-cloud (proxied) state and whether it is proxiable at all. Once a domain has moved to Cloudflare THIS is the authoritative record set — list_dns_records reads the Porkbun zone, which is no longer answering queries for it. Returns ZONE_NOT_READY if the zone does not exist yet.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain whose Cloudflare zone to inspect. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so safety is covered. The description adds real behavioral context beyond that: the returned fields (proxied state, proxiable flag) and a specific error condition (ZONE_NOT_READY when the zone does not exist). Not fully exhaustive, but meaningfully additive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core action and result shape, with the sibling-disambiguation and error case following. No wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description compensates by naming the key returned attributes (proxied, proxiable) and the failure mode. Adequate for a single-param read tool, though return-shape detail is only partial.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single well-described 'domain' parameter, so the schema does the heavy lifting. The description adds nothing about the parameter's format or constraints, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (list a domain's LIVE DNS records) with scope qualifiers, and explicitly distinguishes itself from the sibling list_dns_records by naming which zone each reads. An agent can select correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('Once a domain has moved to Cloudflare THIS is the authoritative record set') and names the alternative (list_dns_records reads the Porkbun zone, no longer answering queries). The selection condition is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cloudflare_zoneGet Cloudflare ZoneARead-onlyIdempotentInspect
Get what CLOUDFLARE currently says about a domain's zone (status, paused, its nameservers, activation date) rather than what Porkbun's queue row remembers. These drift: if someone repoints the nameservers elsewhere after the move, the Porkbun row still says done while Cloudflare has stopped serving the domain. The response includes the live public nameservers and a nameserversDrifted boolean so you don't have to diff them yourself.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain whose Cloudflare zone to inspect. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so the safety profile is covered. The description adds genuine behavioral context beyond that: it explains why live data can disagree with the stored row and discloses the nameserversDrifted boolean, though it says nothing about auth, rate limits, or freshness guarantees.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause and each sentence contributes (what it returns, why drift matters, what the response adds). The drift example is slightly long-winded, but nothing is pure filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the burden of describing returns, and it does so by listing status, paused, nameservers, activation date, and the nameserversDrifted flag. Combined with annotations covering safety, an agent has everything needed to call this single-parameter read correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single 'domain' parameter, so the baseline is 3. The description only paraphrases the parameter ('a domain's zone') and adds no format or constraint detail beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get what CLOUDFLARE ... says about a domain's zone') and enumerates what it returns (status, paused, nameservers, activation date). It also distinguishes the source of truth from the Porkbun queue row, so an agent can tell it apart from get_cloudflare_queue and get_cloudflare_domain_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the drift scenario that motivates using this over the remembered queue row, which is clear contextual guidance. It stops short of naming the alternative tool or an explicit when-not-to-use condition, leaving that inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cloudflare_zone_settingsGet Cloudflare Zone SettingsARead-onlyIdempotentInspect
Read the Cloudflare zone settings that matter after a move: ssl mode, always_use_https, automatic_https_rewrites, min_tls_version, development_mode, cache_level. Warns when SSL mode is off or flexible, which means Cloudflare fetches the origin over plain HTTP while visitors still see a padlock. If this returns CLOUDFLARE_REAUTHORIZE_REQUIRED the customer's Cloudflare connection predates this permission — show them the connectUrl and ask them to reconnect (one click; domains already moved are unaffected).
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain whose zone settings to read. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/idempotent/non-destructive profile, and the description adds genuinely new behavior: it warns when SSL mode is `off` or `flexible` (origin fetched over plain HTTP) and documents the CLOUDFLARE_REAUTHORIZE_REQUIRED error with a concrete one-click reconnect remedy.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the resource and the settings list, then the warning and the error remediation. Dense but every sentence carries distinct information; minor length from the enumerated settings list.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so by naming the settings returned, the warning condition, and the error code with recovery steps. An agent has what it needs to call and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (domain) with 100% schema description coverage, so the schema already fully documents it. The description adds no format or syntax detail beyond the schema, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read) and resource (Cloudflare zone settings) and enumerates the exact settings returned (ssl mode, always_use_https, min_tls_version, etc.), which distinguishes it from siblings like get_cloudflare_zone and set_cloudflare_zone_settings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Anchors usage to a clear context ('settings that matter after a move') and gives explicit remediation for the CLOUDFLARE_REAUTHORIZE_REQUIRED case. It does not, however, contrast this with get_cloudflare_zone or get_cloudflare_connection, so the alternative-selection guidance is incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_contactsGet ContactsARead-onlyIdempotentInspect
Get the four contacts (registrant, admin, tech, billing) for a domain in the authenticated account, with their current field values (name, organization, address, phone, email). Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Fully qualified domain name, e.g. `example.com` |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds that the contacts are for an authenticated account and lists the returned field values, but it repeats 'Read-only' from the annotations and does not disclose error behavior or handling for domains not in the account.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded and compact, using one main sentence plus a short 'Read-only' note. The final note is somewhat redundant with the annotations, slightly reducing the score from a perfect 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter read tool with rich safety annotations, the description provides enough context about what is retrieved and what fields are returned. It could mention not-found or permission behavior, but no output schema exists and the essential retrieval semantics are covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single domain parameter, which already documents the expected fully qualified domain name format. The description adds the context that the domain belongs to the authenticated account, but it does not provide additional syntax or parameter-level semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Get the four contacts ... for a domain in the authenticated account.' It further enumerates the exact contact types and field values returned, making the tool clearly distinguishable from siblings such as update_contacts or get_domain.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly implies a read-only lookup for an authenticated domain, but it does not explicitly say when to use this tool versus alternatives like update_contacts, get_domain, or list_domains. The usage context is adequate but not directive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_domainGet DomainARead-onlyIdempotentInspect
Get 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.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Fully qualified domain name in the account, e.g. `example.com` | |
| include_labels | No | Include user-defined domain labels in the response. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds real value beyond that by naming the DOMAIN_NOT_FOUND error code and the exact fields returned, giving the agent behavioral detail the annotations do not carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core verb and resource, followed by a compact field list and a second sentence on the error case. Every clause carries information, though the long enumeration in the first sentence is slightly dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description sensibly enumerates the returned fields and documents the not-found error, which is exactly what an agent needs to interpret results. Nothing material is missing for a two-parameter read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters (domain, include_labels) are already documented in the schema. The description only lightly reinforces include_labels ('optionally labels') without adding format or constraint detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (get a single domain's metadata) and enumerates exactly what is returned: status, TLD, dates, lock, privacy, auto-renew, API opt-in, labels. The word 'single' cleanly distinguishes it from the sibling list_domains.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Signals the scope ('a single domain in the authenticated account') and gives the failure condition (DOMAIN_NOT_FOUND when the domain isn't in the account), which tells the agent when the call is appropriate. It stops short of explicitly routing to list_domains for bulk needs, so it is clear context without named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_hostingGet HostingARead-onlyIdempotentInspect
Get Secure Static Hosting status for a domain (plan, server, trial, expiry, auto-renew), or null if the domain has no hosting. When ACTIVE, deploy_site publishes site files to it.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain to check. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and non-open-world, so the safety profile is covered. The description adds genuinely new behavior: it returns null when the domain has no hosting and it enumerates the field set returned when hosting exists—useful given no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with zero filler, front-loading the resource and scope before the null case and the deploy_site relationship. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-param, read-only lookup with no output schema, the description supplies the return-field list and the null case, which is what an agent needs to interpret results. It lacks only explicit guidance on alternative status-check tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter with 100% schema coverage, so the baseline is 3. The description only restates 'for a domain' and adds no format, validation, or lookup nuance beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (Secure Static Hosting status) scoped to a domain, and enumerates the returned fields (plan, server, trial, expiry, auto-renew). It even distinguishes itself from deploy_site by naming the deployment relationship, so an agent can place it among the many sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The clause 'When ACTIVE, deploy_site publishes site files to it' implies the workflow (check status before deploying) but never states when to call this versus alternatives like get_domain or list_hosting_plans. Usage is inferable rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_invoiceGet InvoiceARead-onlyIdempotentInspect
Get one invoice as data: who it is billed to, how it was paid (card brand and last four only), each line with its product, term, resulting domain expiry and status, and the gross, refunded and net totals in cents. The same figures as the PDF. url and pdfUrl open it on porkbun.com (the user must be signed in); downloadUrl downloads the PDF without signing in for 15 minutes, which is the link to hand a user who wants the file. Invoice IDs come from list_invoices; an ID not on this account returns INVOICE_NOT_FOUND.
| Name | Required | Description | Default |
|---|---|---|---|
| invoice_id | Yes | Invoice (order) ID from `list_invoices`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds meaningful behavior beyond them: url and pdfUrl require a signed-in user while downloadUrl works unauthenticated for only 15 minutes, amounts are normalized to cents, and an ID from another account yields INVOICE_NOT_FOUND. These are operational details an agent cannot derive from the schema or annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with what the call returns, then the differing URL behaviors, then the ID source and error case. Dense but no filler; the field enumeration is long yet each item is load-bearing for understanding the payload.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must carry the return contract — and it does, naming the principal response fields, their units, and link lifetimes, plus auth requirements and the failure mode. The only material omission is differentiation from the get_invoice_pdf sibling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter with 100% schema description coverage, so the schema already carries its meaning; the description's cross-reference that IDs come from list_invoices reinforces the schema text rather than adding new semantics. Baseline for a fully documented small parameter set.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Get one invoice as data') followed by an enumeration of exactly what comes back: bill-to, payment method with card brand/last four, line items with term and resulting domain expiry, and gross/refunded/net totals in cents. It also states the source of valid IDs ('Invoice IDs come from list_invoices'), which separates it from the list sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives the prerequisite for obtaining an invoice_id (list_invoices) and the error behavior for a foreign ID, plus practical guidance on which URL to hand a user. However, it never addresses the obvious alternative sibling get_invoice_pdf — an agent choosing between retrieving invoice data and fetching the PDF gets no explicit when-to-use/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_invoice_pdfGet Invoice PdfARead-onlyIdempotentInspect
Get an invoice PDF: the same document as Download PDF on porkbun.com. The file comes back as an embedded PDF resource (for clients that can show or save files), alongside filename, sizeBytes and downloadUrl, a link that downloads it without signing in for 15 minutes (downloadExpires). To give the user the file, hand them downloadUrl; do not try to reproduce the file's bytes yourself. get_invoice also returns a downloadUrl if you only need the link.
| Name | Required | Description | Default |
|---|---|---|---|
| invoice_id | Yes | Invoice (order) ID from `list_invoices`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds material context beyond them: the PDF arrives as an embedded resource, the accompanying fields (filename, sizeBytes, downloadUrl), and crucially that downloadUrl is unauthenticated and expires in 15 minutes. The warning against re-emitting bytes is a genuine behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then layered with return-shape and expiry facts – all of which earn their place for a tool whose output has no schema. It runs slightly long with three dense clauses in one sentence, but nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden of the return contract and does so: embedded resource, field names, unauthenticated 15-minute link, and expiry field. An agent has everything needed to retrieve and hand off the file correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter has 100% schema description coverage, and the schema already states it is an 'Invoice (order) ID from `list_invoices`.' The description adds no parameter-level syntax or format detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (get an invoice PDF) and anchors it to a concrete user-facing equivalent ('the same document as Download PDF on porkbun.com'), which removes ambiguity about what artifact is produced. It also differentiates from the sibling get_invoice by noting that tool only returns a link.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use this when you need the file, hand the user `downloadUrl`, and use `get_invoice` 'if you only need the link.' It also gives a direct instruction on what NOT to do (do not reproduce the file's bytes yourself), which is exactly the kind of when/when-not guidance that helps selection and invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_nameserversGet NameserversARead-onlyIdempotentInspect
Get the current nameservers configured for a domain in the authenticated account. Returns an array of nameserver hostnames, read live from the registry. Read-only complement to update_nameservers. Treat the result as an unordered set — registries return nameservers in whatever order they like, so this will often not match the order passed to update_nameservers. Order is meaningless in DNS; never report a reordering as a change.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Fully qualified domain name, e.g. `example.com` |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent annotations by disclosing that data is read live from the registry and that ordering is non-deterministic and semantically meaningless. The warning never to report a reordering as a change is exactly the kind of operational context annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, followed by return shape and then the ordering caveat; every sentence earns its place. The heavy bold emphasis is slightly noisy but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even without an output schema, the description states the return shape (array of nameserver hostnames), its source (registry), and the key interpretation rule. Nothing an agent needs to call and correctly use this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter with 100% schema description coverage (fully qualified domain name with an example), so the schema already carries the semantics. The description adds nothing about the domain argument itself, which is the expected baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get the current nameservers configured for a domain') and explicitly frames itself as the 'read-only complement to update_nameservers', so an agent can separate it from the sibling write tool without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear that this is the read side of the nameserver pair versus update_nameservers, and it gives a concrete handling instruction (treat as unordered set). It doesn't spell out a general when-to-use/when-not-to-use rule beyond that pairing, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pricingGet PricingARead-onlyIdempotentInspect
Get 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.
| Name | Required | Description | Default |
|---|---|---|---|
| tlds | No | TLDs to price, e.g. ["com", "io", "dev"]. Omit for every TLD. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, idempotent, non-destructive), and the description layers on genuinely non-derivable behavior: no authentication required, unsupported TLDs returned in an `unsupported` field rather than priced, and a hard INVALID_TLD failure when no requested TLD is sold. It also discloses that input normalization (case, leading dot, IDN) is handled server-side.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Roughly four sentences, front-loaded with the purpose and version-free output shape, then the parameter advice, then edge-case handling. No filler; each sentence carries either routing, parameter, or error information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description takes on return-shape disclosure and does it: pricing categories, currency, the `unsupported` list, and the INVALID_TLD error. Combined with annotation-covered safety and a fully documented single parameter, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantic value beyond the schema: acceptance of mixed case, leading dots, and IDN forms, plus why the parameter matters (response size). It does not mention the schema's 200-item cap, which is the only gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource (get Porkbun pricing) and enumerates exactly which prices are returned: registration, renewal, transfer, per TLD, in USD. It further separates itself from the closest sibling by noting premium name pricing lives in check_domain, so an agent can route correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance ('Pass `tlds` whenever you know which TLDs matter') plus the consequence of omitting it (a ~900-entry response). It also names the alternative tool and the condition that selects it: premium names go to check_domain. Both the when and the alternative are spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_registration_requirementsGet Registration RequirementsARead-onlyIdempotentInspect
Get 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.
| Name | Required | Description | Default |
|---|---|---|---|
| tld | Yes | TLD without a leading dot, e.g. `com`, `us`, `ca`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/openWorldHint=false, so the safety profile is covered. The description adds real value by disclosing what is returned (registerability flag, request-body schema, registry eligibility fields) — significant given there is no output schema. It stops short of error/auth behavior, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then the return shape, then the usage directive. It is a dense single paragraph but each clause carries distinct information; only the long parenthetical about .us/.ca could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must explain what comes back, and it does so thoroughly — including the two-schema structure and the registry-requirements edge case. An agent has everything needed to call it correctly before register_domain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single `tld` parameter is fully documented in the schema (including the no-leading-dot format), so the baseline of 3 applies. The description only refers to 'a TLD' generically and adds no syntax beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (get) and resource (TLD registration requirements) and enumerates the concrete payload contents (apiRegisterable, register_domain body schema, privacy/address/registrant flags, registryRequirements). This clearly separates it from siblings like check_domain, preflight_domain, and register_domain.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs '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.' That is a named alternative plus the condition and the anti-pattern to avoid — no inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ssl_bundleGet SSL BundleARead-onlyIdempotentInspect
Retrieve the free Porkbun-issued SSL certificate bundle for a domain. Returns the certificate chain, private key, and public key (PEM-encoded strings). Porkbun automatically provisions Let's Encrypt certificates for all registered domains using Porkbun nameservers. Use this to install TLS on a server you control.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Fully qualified domain name registered at Porkbun, e.g. `example.com` |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description adds genuinely useful behavioral context beyond them: that the response includes a private key, that it is PEM-encoded, and that certificates are auto-provisioned only for domains on Porkbun nameservers — a precondition the annotations say nothing about.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with what is returned, then the provisioning condition, then the use case. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by describing the return payload (certificate chain, private key, public key, PEM-encoded). Combined with 100% parameter coverage and full annotations, an agent has everything needed to call and consume the result correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single 'domain' parameter, so the schema already carries the semantics. The description adds only the implicit constraint that the domain must be Porkbun-registered; baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Retrieve the free Porkbun-issued SSL certificate bundle for a domain') and enumerates what the bundle contains. No sibling tool touches SSL certificates, so it is trivially distinguishable from the rest of the family.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use this to install TLS on a server you control' gives a clear use context, and the note about Porkbun nameservers implies a prerequisite. It does not name an alternative or an explicit when-not-to-use, but with no competing sibling that is a minor gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transfer_setupGet Transfer SetupARead-onlyIdempotentInspect
Report where a held inbound transfer is and what it is waiting on: whether it is held at PENDINGDNS, whether its DNS zone exists, how many records it holds, what the domain currently delegates to, and the next step. Use this to resume a no-downtime transfer instead of tracking that state yourself.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain with a pending inbound transfer, e.g. `example.com` |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is handled. The description adds genuine behavioral value by disclosing the specific states it inspects (PENDINGDNS hold, DNS zone existence, record count, current delegation, next step), which is beyond what the annotations provide. It stops short of explaining timing or any failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the purpose before the enumerated state list and the usage note. The colon-separated inventory is dense but each clause is informative; slightly long, though nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must describe what comes back — and it does, enumerating the transfer state, DNS zone existence, record count, delegation target, and the recommended next step. For a single-parameter read tool with annotations carrying the safety profile, an agent has everything needed to call it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter carries its own description including an example value, so the schema fully documents the input. The description adds no syntax or constraint detail beyond that, making the baseline 3 correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (report) and a precisely scoped resource (where a held inbound transfer is and what it's waiting on), then enumerates the exact state dimensions inspected. An agent can distinguish this from get_transfer_status, list_transfers, and prepare_transfer without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames the use case: 'Use this to resume a no-downtime transfer instead of tracking that state yourself.' That gives clear context for when to reach for it, but it never names the alternative tools (e.g. get_transfer_status) or a when-not condition, so routing is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transfer_statusGet Transfer StatusARead-onlyIdempotentInspect
Get the status of a specific inbound transfer for a domain. Useful for polling after transfer_domain to know when the transfer completes (typical window: 5-7 days). Returns the same status values as list_transfers, plus a human-readable description.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain whose transfer status to check, e.g. `example.com` |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive, so the safety profile is covered. The description adds meaningful context beyond that: the polling pattern, the multi-day completion window, and that status values match list_transfers plus a human-readable description. It doesn't cover error/edge behavior (e.g. unknown domain) but is solid for a read tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the action and then the usage rationale and return shape. No filler or repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by explaining what comes back (same status values as list_transfers plus a human-readable description). For a one-parameter read tool with full annotation coverage, nothing an agent needs is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single `domain` parameter is fully documented in the schema, so the baseline is 3. The description restates the resource being looked up but adds no format or syntax detail beyond the schema's `example.com` example.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get the status of a specific inbound transfer for a domain') and distinguishes itself from siblings like list_transfers (single vs list) and transfer_domain (poll vs initiate). An agent can route correctly without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames the use case: poll after `transfer_domain` to know when the transfer completes, and names the typical 5-7 day window. It implies but never states the exclusion (use list_transfers for a broad view), so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_usdc_topup_statusGet Usdc Topup StatusARead-onlyIdempotentInspect
Check a USDC top-up from top_up_with_usdc: state is ACTIVE (not paid yet), PROCESSING (paid, being credited), COMPLETED (credited: credited true), EXPIRED or FAILED. Also returns the current balance, so once COMPLETED you can retry the purchase that needed it.
| Name | Required | Description | Default |
|---|---|---|---|
| checkout_id | Yes | The `checkoutId` returned by `top_up_with_usdc`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive, and closed-world behavior. The description adds useful status semantics (ACTIVE, PROCESSING, COMPLETED, EXPIRED, FAILED) and discloses that the current balance is returned, which goes beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences with no filler. The status meanings are front-loaded and the key follow-up action (retry purchase once COMPLETED) is placed at the end.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read tool with no output schema, the description provides the necessary return-value context by explaining the possible `state` values and the balance. Nothing required for correct invocation or interpretation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the single `checkout_id` parameter is fully documented in the schema. The description reinforces its origin from `top_up_with_usdc` but adds no extra syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Check') and resource ('USDC top-up'), and explicitly ties the tool to the sibling `top_up_with_usdc`. The enumerated states make the resource and operation unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly indicates the tool is used after `top_up_with_usdc` and explains how to act on a COMPLETED result. It does not explicitly mention when not to use it or point to alternatives like `get_balance`, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_webhookGet WebhookARead-onlyIdempotentInspect
Fetch a single webhook endpoint by its numeric id, including its signing secret and delivery health (consecutive failures, last success/failure).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The webhook endpoint id (from list_webhooks or create_webhook). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds useful behavioral context by disclosing that the response includes the signing secret and delivery health metrics (consecutive failures, last success/failure).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single front-loaded sentence with no wasted words. The core action and notable return details are delivered immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is a simple read-by-id operation with rich annotations, a fully described parameter, and no output schema. The description compensates for the missing output schema by naming the important returned fields, making it complete enough for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the single id parameter is already fully documented in the schema. The description adds only 'by its numeric id', which confirms the type but does not extend parameter meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Fetch') and resource ('a single webhook endpoint by its numeric id') and adds the notable return contents (signing secret and delivery health). It distinguishes itself from list_webhooks by being singular and by returning secret/health rather than a collection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not state when to use this tool versus siblings such as list_webhooks, get_webhook_delivery, or get_webhook_event_types. It only implies usage by requiring a numeric id, which the schema already tells the agent is obtained from list_webhooks or create_webhook.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_webhook_deliveryGet Webhook DeliveryARead-onlyIdempotentInspect
Fetch a single webhook delivery by id, including the full JSON payload that was (or will be) sent and its delivery status. Get delivery ids from list_webhook_deliveries.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The delivery id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful behavioral content beyond that: it discloses that the returned payload is what 'was (or will be) sent', clarifying that deliveries may be pending, and that status is included.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and return content, followed by the id-sourcing hint. Every clause earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with no output schema, the description supplies the essentials: what is fetched, what the response contains (payload and status), and how to obtain the id. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and there is only one parameter, whose schema description ('The delivery id.') already covers it. The description confirms the id is the identifier but adds no format, range, or sourcing detail beyond what the schema and the id-source sentence provide. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Fetch) and resource (a single webhook delivery by id), and explicitly names what it returns: the full JSON payload plus delivery status. This clearly distinguishes it from the sibling list_webhook_deliveries, which enumerates rather than retrieves one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description tells the agent where the required argument comes from: 'Get delivery ids from list_webhook_deliveries.' That is clear routing context for the primary use case. It stops short of explicit when-not or exclusion guidance, so it is not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_webhook_event_typesGet Webhook Event TypesARead-onlyIdempotentInspect
List the event types you can subscribe a webhook endpoint to. Returns event-type strings like domain.registered, domain.renewed, domain.transfer.completed, domain.expiring, and dns.record.created|updated|deleted. Use these values (or * for all, or a prefix wildcard like dns.*) when calling create_webhook.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, safe behavior, and closed-world scope. The description adds useful behavioral context by specifying the exact shape of the returned data (event-type strings, wildcard patterns), which goes beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose, efficiently covering return values and usage. Every sentence earns its place without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only listing tool with no output schema, the description is complete enough: it states what is returned, gives real examples, and explains how to use the values in create_webhook. Annotations cover safety and idempotency.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so the baseline score is 4. There is no parameter semantics to clarify beyond what the empty schema already communicates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: list the event types available for webhook subscription. Gives concrete return examples (domain.registered, dns.record.created|updated|deleted) and distinguishes the tool from create_webhook by noting the values are meant to be used there.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use the returned values (or `*` or a prefix wildcard like `dns.*`) when calling create_webhook. This gives a clear context for invocation, though it does not name any alternative tools or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_dns_recordsImport DNS RecordsAIdempotentInspect
Create many DNS records on a Porkbun domain in one call — the companion to scan_dns_records for keeping a transferred domain working. Pass records to import an exact list (preferred when you read the zone from the old registrar's API), or omit it entirely to import whatever a live scan of the domain discovers. Idempotent: a record that already exists is reported in skipped, not failed, so this is safe to re-run and safe as a converge step. Individual failures are listed in failures while everything else still imports. NS and SOA entries are ignored on purpose — they describe the delegation, not the zone. Important: imported records have no effect until the domain actually points at Porkbun's nameservers, so check get_nameservers afterwards and use update_nameservers when the user is ready to cut over — when the domain is delegated elsewhere the response also says so in warnings. Maximum 500 records per call.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Porkbun domain to create the records on, e.g. `example.com` | |
| records | No | Exact records to create. Omit to import what a live scan of the domain finds. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare idempotentHint=true and destructiveHint=false, but the description goes well beyond them: it explains that existing records land in `skipped` rather than `failed`, that partial failures are isolated in `failures`, that NS/SOA are deliberately ignored, that records are inert until nameservers point at Porkbun, that `warnings` reports delegation, and that the cap is 500 records. This is exactly the behavioral context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core verb and resource, and every sentence carries operational information (idempotency, failure isolation, nameserver caveat, limit). It is dense but slightly long, with the 500-record limit and NS/SOA note arriving after several other clauses.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the full burden of explaining returns and it does so: `skipped`, `failures`, and `warnings` are all defined. Combined with the nameserver prerequisite and the batch limit, an agent has everything needed to invoke and interpret this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the schema already documents the omit-to-scan behavior of `records`. The description nonetheless adds decision value by stating when the explicit-list path is preferred (reading the zone from the old registrar's API), which is not in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create many DNS records on a Porkbun domain in one call') and immediately distinguishes itself from siblings by naming the batch nature and its companion scan_dns_records. An agent can separate it from create_dns_record (single) and list_dns_records (read) without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit branch conditions: pass `records` for an exact list (preferred when reading the zone from the old registrar's API), or omit it to import a live scan. It also spells out the follow-up workflow (check get_nameservers, then update_nameservers when cutting over), so when-to-use and sequencing are unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_cloudflare_inventoryList Cloudflare InventoryARead-onlyIdempotentInspect
List every domain in the account with its Cloudflare eligibility: state is eligible / warn / blocked / connected / inprogress, each with a human-readable reason (DNSSEC live, custom nameservers, uses Porkbun hosting, etc). Read this BEFORE queueing so you can tell the user what will move and what won't. Works even when the Cloudflare account isn't connected yet, so you can plan while the user authorizes.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and non-destructive, so safety is covered. The description adds genuinely useful non-obvious behavior: it works even when the Cloudflare account isn't connected, letting the agent plan during authorization. It does not discuss pagination or ordering for a full-account listing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, well front-loaded with the resource and the state vocabulary before the workflow guidance. Slightly dense with the parenthetical reason examples, but every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description takes on the burden of describing the return shape, and does so by specifying the `state` enum and the accompanying human-readable reason. For a zero-param read tool this leaves nothing an agent needs missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the schema-baseline is 4. There are no arguments whose semantics need explaining, though the description usefully characterizes the returned `state` field values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List every domain in the account') and immediately scopes the output to Cloudflare eligibility. The enumeration of state values (eligible/warn/blocked/connected/inprogress) makes clear this is not the plain list_domains sibling but a Cloudflare-readiness view.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to 'read this BEFORE queueing so you can tell the user what will move and what won't,' establishing a clear ordering relative to the queue step. It does not name the specific sibling (get_cloudflare_queue / connect_domains_to_cloudflare) it precedes, so it stops short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_dns_recordsList DNS RecordsARead-onlyIdempotentInspect
List all DNS records for a domain in the authenticated account. Returns each record's id, type (A, AAAA, CNAME, MX, TXT, etc.), name (subdomain or empty for apex), content, ttl, and priority (where applicable). The id field is required when editing or deleting a specific record.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Fully qualified domain name registered at Porkbun, e.g. `example.com` |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish this as a safe, read-only, idempotent operation. The description adds useful behavioral detail by enumerating the returned fields and noting that the id field is required for editing or deleting a specific record, though it does not cover pagination or ordering behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, then efficiently lists return fields and closes with a practical note about the id field. Every sentence earns its place with no redundant or vague filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does the heavy lifting by describing the returned record fields. It is nearly complete for a simple list tool, though it omits pagination, sorting, and empty-result behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the domain parameter is fully documented as a fully qualified domain name. The description adds only the scoping phrase 'in the authenticated account', so it does not meaningfully expand parameter semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: list DNS records for a domain in the authenticated account. It clearly distinguishes DNS records from other domain metadata, but does not explicitly differentiate from close siblings such as scan_dns_records or list_dnssec_records.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the verb 'list' and the scoping to a domain, and the note about the id field hints at the edit/delete workflow. However, it does not state when to prefer this tool over scan_dns_records, import_dns_records, or list_dnssec_records.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_dns_restore_pointsList DNS Restore PointsARead-onlyIdempotentInspect
List the saved versions of a domain's DNS zone, newest first. DNS is the one layer with no undo built in, and this is it — if a record was deleted or edited by mistake you do not need to know what it used to say, you can look.
Restore points are captured automatically before the first write to a zone in each hour (so a run of edits costs one point, not one per record), before any bulk import or zone wipe, and before any restore.
Read two fields carefully. recordCount is the size of the zone AS IT WAS at that moment, not now — a drop between consecutive points is where records were lost. matchesLive marks the point the zone currently sits on, which is where you are, not where you want to go. Up to 50 are returned.
Restore points only cover the zone as Porkbun held it; a domain on someone else's nameservers has nothing here.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain whose zone history to list, e.g. `example.com` |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive), yet the description adds substantial behavioral context: automatic capture timing (before first hourly write, bulk import, zone wipe, restore), a 50-point return cap, and a real coverage limit (only zones Porkbun holds). This is exactly the beyond-annotation detail that earns top marks.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then organized into usage, capture triggers, field warnings, and limits. The bolded motivational clause is slightly rhetorical, but every paragraph carries information an agent needs, so waste is minimal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining return semantics and does so by interpreting `recordCount` (size as-it-was, drops signal lost records) and `matchesLive` (which point is current), plus the 50-item cap and non-Porkbun-nameserver exclusion. Nothing needed to interpret results is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter ('domain') and schema description coverage is 100%, so the schema already documents it fully; the description adds no format or syntax detail beyond it. Baseline 3 applies when the schema does the parameter work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the saved versions of a domain's DNS zone, newest first'), and the ordering scoping distinguishes it from the live-zone siblings like list_dns_records. An agent can tell it apart from list_dns_records, diff_dns_restore_point, and restore_dns_zone without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the trigger for use ('if a record was deleted or edited by mistake you do not need to know what it used to say, you can look') and describes when points are captured relative to restores. It stops short of explicitly naming diff_dns_restore_point or restore_dns_zone as the adjacent actions, so it lacks full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_dnssec_recordsList DNSSEC RecordsARead-onlyIdempotentInspect
List the DNSSEC DS records currently submitted to the registry for a domain. Returns key tag, algorithm, digest type, and digest. Use this to verify DNSSEC chain-of-trust setup. Empty array = DNSSEC not configured.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Fully qualified domain name, e.g. `example.com` |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description adds genuine value by enumerating the returned fields and, crucially, interpreting the empty array ('DNSSEC not configured') — behavior an agent cannot get from the schema since no output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and scope, followed by the return payload and the sentinel empty-array case. Every sentence carries distinct information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-param read tool with no output schema, the description covers purpose, the returned fields, and the meaning of an empty result. Nothing an agent needs to invoke or interpret the call correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter and 100% schema description coverage (which documents the FQDN format and example). The description adds no syntax or format detail beyond 'for a domain', so the schema is doing the heavy lifting — baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (DNSSEC DS records submitted to the registry for a domain), with scope made explicit. An agent can instantly distinguish it from create_dnssec_record and delete_dnssec_record among the many siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear purpose-driven context: 'Use this to verify DNSSEC chain-of-trust setup,' and defines the empty-array outcome. It does not name the create/delete DNSSEC siblings as alternatives, so the when-to-use-vs-alternative routing is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_doc_topicsList Doc TopicsARead-onlyIdempotentInspect
List the available Porkbun API documentation topics. Returns the docs index (Markdown) — every per-topic page (e.g. dns, domain, webhooks, ssl, pricing) with a one-line description and endpoint count, plus links to the full reference and the OpenAPI spec. Use this first to discover what docs exist, then read_doc to read one. Grounds an agent in Porkbun's own docs without leaving the conversation.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower; the description still adds real value by disclosing the exact return shape (Markdown index, one-line descriptions, endpoint counts, links to full reference and OpenAPI spec). With no output schema, this disclosure carries meaningful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: purpose, return payload, then the routing instruction to read_doc. Front-loaded with the most decision-relevant information and no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-parameter, read-only discovery tool with no output schema, the description fully covers what is returned and how it fits into the docs-reading workflow. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so the baseline is 4; the description implicitly communicates that no input is required to enumerate the docs index. There is nothing further a parameter section could add.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List the available Porkbun API documentation topics') and immediately specifies the returned content — an index of per-topic pages with descriptions and endpoint counts. This clearly separates it from the sibling read_doc/search_docs tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly prescribes ordering and the alternative: 'Use this first to discover what docs exist, then read_doc to read one.' The when-to-use condition and the follow-up tool are both named, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_domainsList DomainsARead-onlyIdempotentInspect
List 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 — eliminatesAPI_ACCESS_DISABLEDerrors 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.
| Name | Required | Description | Default |
|---|---|---|---|
| tlds | No | Limit to these TLDs (no leading dot). Example: ['com', 'io'] | |
| start | No | Pagination offset. Default 0. | |
| domain | No | Exact domain match — returns 0 or 1 result. | |
| sort_name | No | Sort field. | |
| api_access | No | Filter to domains opted in to API access. | |
| auto_renew | No | Filter to domains with auto-renew on or off. | |
| name_contains | No | Case-insensitive substring on the full domain name. | |
| include_labels | No | Include user-defined domain labels in the response. | |
| sort_direction | No | Sort direction. | |
| expiring_within_days | No | Only domains expiring within this many days from now. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and non-destructive, so the safety profile is covered. The description adds real behavioral context the annotations do not: the one-page/1000-item pagination semantics, the specific fields returned, and the downstream error-avoidance rationale for the api_access filter. It does not state what happens when results exceed 1000 (truncation vs. needing `start`), which is the remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose and pagination, then a scannable filter list with the sibling redirect last — logical ordering with no filler. It is dense but each bullet carries a distinct constraint or default; only the metadata enumeration is arguably restating return fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the returned metadata fields, and it covers pagination, filtering, sorting and the sibling alternative. An agent has everything needed to call it correctly and interpret the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description genuinely enriches several params beyond the schema: defaults for sort_name/sort_direction, the 'no leading dot' constraint on tlds, the exact-match cardinality of domain, and the practical rationale for api_access. It omits any mention of `start` and `include_labels`, which are schema-only.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List domains in the authenticated Porkbun account') and immediately scopes the return (one page up to 1000 with named metadata). It also names the sibling it is not, get_domain, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use routing ('For a single domain by name, use get_domain instead — cleaner shape and 404-on-not-found semantics') plus per-filter intent, e.g. expiring_within_days 'useful for renewal automation' and api_access to eliminate API_ACCESS_DISABLED errors downstream.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_glue_recordsList Glue RecordsARead-onlyIdempotentInspect
List glue records for a domain. Glue records associate a host (e.g. ns1.example.com) with one or more IP addresses at the registry, used when running your own nameservers on the same domain they serve. Returns the host, IPv4 addresses, and IPv6 addresses for each glue record.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain to list glue records for, e.g. `example.com` |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive, so the safety profile is covered. The description adds genuine value by specifying the returned fields (host, IPv4, IPv6), which matters since there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the action, then the concept, then the return shape. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with a full annotation set and no output schema, the description covers purpose and returns adequately. The only gap is the absence of when-to-use routing against sibling tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single 'domain' parameter is fully documented in the schema with an example. The description adds no syntax or format detail beyond what the schema already provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List glue records for a domain') and goes further to define what a glue record is, so an agent understands the domain concept without prior knowledge. It is clearly distinguishable from siblings like get_nameservers or list_dns_records.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what glue records are but never says when to reach for this tool versus adjacent ones like list_dns_records, get_nameservers, or list_dnssec_records. Usage is implied by the concept rather than stated, leaving the agent to infer the routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_hosting_filesList Hosting FilesARead-onlyIdempotentInspect
List file/directory names under an optional path in a domain's Secure Static Hosting space. Calls the Porkbun Hosting API (https://porkbun.com/llms/hosting).
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Subdirectory to list (default: root). | |
| domain | Yes | Domain whose hosting files to list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false and destructiveHint=false, so the safe-read profile is fully covered by structured data. The description adds only the upstream API reference and that it returns names rather than metadata; it does not describe pagination, ordering, empty-directory behavior, or error conditions for a missing path.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the operation and its scoping constraint come first, with the API reference trailing. Nothing is redundant and every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only listing tool with no output schema, the description plus annotations cover what an agent needs to call it: what it lists, what path defaults to, and that it is a safe idempotent read. Minor gaps remain around result shape and pagination, but the essential information is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both `path` and `domain` are already documented at the same level of detail the description offers. The description only restates that `path` is optional and `domain` scopes the listing, adding no syntax, format, or behavioral meaning beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) plus the exact resource (file/directory names) and its scope (under an optional path in a domain's Secure Static Hosting space). An agent can distinguish this read-listing tool from siblings like delete_hosting_file and make_hosting_dir without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the purpose and by its position among hosting siblings, but the description never states when to use this versus alternatives (e.g., list_hosting_plans, get_hosting) or any precondition such as the domain having active hosting. No explicit when/when-not guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_hosting_plansList Hosting PlansARead-onlyIdempotentInspect
List the hosting plans provisionable via the API, with price (cents — pass as acknowledged_cost_cents to create_hosting), interval, trial length, and features. Use this to discover plans + costs before create_hosting rather than hardcoding them. Currently Secure Static Hosting; more products are added over time.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the description's job is to add beyond that. It does: it discloses that the catalog is volatile ('Currently Secure Static Hosting; more products are added over time'), which is behavior an agent cannot infer from annotations. It does not describe ordering or result shape limits, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with what is returned, then when to use it, then the volatility caveat. Every sentence carries distinct information with no repetition of the title or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and no output schema, the description carries the burden of describing the return payload, and it does so by naming the fields returned. It leaves out ordering/pagination details, which is minor for a small fixed catalog but is the only real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline is 4. The mention of acknowledged_cost_cents is a cross-tool handoff hint rather than a parameter on this tool, but it usefully links the output to create_hosting's input.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (hosting plans provisionable via the API), and enumerates the returned fields (price, interval, trial length, features). It is immediately distinguishable from neighbors like get_hosting or create_hosting.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use it to discover plans and costs before calling create_hosting rather than hardcoding them, naming the sibling it feeds into. This gives the agent a clear action sequence, not just context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_invoicesList InvoicesARead-onlyIdempotentInspect
List the account's invoices (one per order), newest first, with each one's date, state (PAID, PARTIALLY_REFUNDED, REFUNDED or UNPAID), net total in cents and the domains on it. total_cents is what the customer was left paying: refunds are netted out. Each invoice has url, its page on porkbun.com, which is the easiest thing to hand a user who wants to see or print one. Use get_invoice for the lines and get_invoice_pdf for the file.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | Only invoices from this year, e.g. 2026. | |
| limit | No | Invoices per page, max 100. Default 50. | |
| start | No | Paging offset. Default 0. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety burden is light. The description adds real context: newest-first ordering, that total_cents is refund-netted, the set of state values, and the presence of a print-ready url. It stops short of describing pagination behavior across pages.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the action and its scope, then return-field nuances, then sibling routing. No wasted wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description must describe results — and it does: ordering, per-invoice fields, refund semantics, and the url. Combined with the fully-documented input schema, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so year, limit, and start are fully documented in the schema. The description adds nothing about these parameters beyond what the schema already states, which is the baseline expectation when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the account's invoices'), scopes it ('one per order'), and characterizes the return shape (date, state, net total, domains, url). It is clearly distinguishable from get_invoice and get_invoice_pdf, which it names.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'Use get_invoice for the lines and get_invoice_pdf for the file,' and notes that the url is the easiest thing to hand a user who wants to see or print one. When-to-use-this vs alternatives is fully covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_marketplaceList MarketplaceARead-onlyIdempotentInspect
Browse domains for sale on the Porkbun marketplace (aftermarket — domains owned by other users, not new registrations). 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).
| Name | Required | Description | Default |
|---|---|---|---|
| tlds | No | Limit to these TLDs (no leading dot). Example: `['com', 'io', 'ai']`. | |
| limit | No | Page size (no-filter mode only). Default 1000, max 5000. | |
| query | No | SLD substring search. Use `-word` to exclude. Example: `'ai -test'`. | |
| start | No | Pagination offset (no-filter mode only). Default 0. | |
| sort_name | No | Sort field. Default: `sld_length` asc when query is set, else `create_date` desc. | |
| sld_length_max | No | Maximum SLD character length. | |
| sld_length_min | No | Minimum SLD character length. | |
| sort_direction | No | Sort direction. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, so the safety profile is covered. The description adds real behavioral context beyond them: server-side filtering, a 1000-result cap in filter mode, and a 5000 max page size in no-filter mode. No auth or rate-limit disclosure, hence not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose sentence followed by a return-value list and a scannable bullet list of filters; each element earns its place. Slight redundancy with the schema's parameter descriptions keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description steps in to enumerate returned fields (domain, TLD, SLD length, price, listing date) and the pagination/cap behavior, which is everything an agent needs to invoke and interpret results correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes further by spelling out the `-word` exclusion syntax and the mode-conditional semantics of filtering vs pagination that the schema only hints at. It largely mirrors the schema's own parameter descriptions, so it doesn't fully distinguish itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb + resource ('browse domains for sale on the Porkbun marketplace') with an explicit disambiguation from sibling flows: 'aftermarket — domains owned by other users, not new registrations.' An agent can distinguish this from register_domain/list_domains without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly states the two operating modes (filtered search vs raw pagination) and the conditions that select them, plus the server-side filter semantics. It does not name a competing sibling tool or say when *not* to use it, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_transfersList TransfersARead-onlyIdempotentInspect
List all in-progress and recent inbound domain transfers for the authenticated account. Returns each transfer's domain, status (NEW, PENDINGAUTH, PENDINGSUBMIT, PENDINGTRANSFER, DONE, CANCELED, etc.), and create date. Use this to monitor transfers initiated by transfer_domain.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive, so safety is covered. The description adds behavioral value beyond that: the lifecycle statuses (NEW, PENDINGAUTH, ... CANCELED) and the fact that results are limited to 'in-progress and recent' transfers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences that front-load scope and returned fields, followed by a short routing sentence. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering the safety profile and no output schema present, the description carries the return-value burden and does so by naming the fields and status enum. It omits pagination or result-limit behavior for a 'list all' tool, which is a minor remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there are no parameter semantics to explain and the baseline is 4. The description does not need to compensate for anything in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (List) plus resource (inbound domain transfers) scoped to 'in-progress and recent' for the authenticated account, and it enumerates the fields returned (domain, status, create date). An agent can distinguish it from get_transfer_status and transfer_domain immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent with 'Use this to monitor transfers initiated by transfer_domain', giving clear usage context. It does not, however, state when to prefer the sibling get_transfer_status for a single transfer, so exclusions are absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_url_forwardsList URL ForwardsARead-onlyIdempotentInspect
List all URL forwarding rules configured for a domain. Each entry includes its id (used by delete_url_forward), the source subdomain, the destination URL, the redirect type (permanent/temporary/masked), the exact redirectType code (301/302/307/masked — distinguishes 302 from 307), and whether the request path and wildcards are forwarded.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Fully qualified domain name, e.g. `example.com` |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds value beyond annotations by enumerating what each returned entry contains and calling out a subtle behavioral detail (302 vs 307 disambiguation), which matters since there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core purpose before the field enumeration. The field list is somewhat dense but earns its place because there is no output schema to document the return shape.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with annotations carrying the safety profile and a fully documented single parameter, the description is nearly complete: it explains the returned fields, which no output schema provides. It stops short of stating ordering or handling of empty results, a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single 'domain' parameter, and the description adds no syntax or format guidance beyond what the schema provides. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List all URL forwarding rules configured for a domain') and explicitly scopes it to a single domain's forwarding rules, distinguishing it from siblings like create_url_forward/delete_url_forward by naming delete_url_forward as the consumer of the returned id.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied (call this to enumerate rules before deleting one, since it mentions the id is used by delete_url_forward), but there is no explicit when-to-use/when-not statement or comparison to alternatives beyond that incidental link.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_webhook_deliveriesList Webhook DeliveriesARead-onlyIdempotentInspect
List recent webhook delivery attempts (newest first), across all endpoints or filtered to one. Each row reports event type, event id, status (PENDING|PROCESSING|DELIVERED|FAILED), attempt count, HTTP status, and last error. Delivery history is retained ~30 days. Use this to audit what was sent and to find a delivery id to resend. The payload is omitted here — use get_webhook_delivery for the full signed payload.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Page size, 1-200 (default 50). | |
| start | No | Offset for pagination (default 0). | |
| status | No | Filter by delivery status. | |
| endpointId | No | Only deliveries for this endpoint. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered; the description goes further with retention (~30 days), result ordering, the exact status lifecycle values, and the explicit note that payloads are omitted and where to get them. With no output schema, this added context is genuinely load-bearing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and ordering, then fields, retention, and the sibling redirect. Every sentence supplies distinct information with no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the returned row fields, status enum, retention window, and ordering, and it points to the right tool for payload data. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and all four params (limit, start, status, endpointId) are documented in the schema itself. The description only alludes to filtering ('filtered to one') and repeats the status values, adding little beyond the schema — baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List recent webhook delivery attempts') plus ordering (newest first) and scope (all endpoints or filtered to one). It is clearly distinguishable from get_webhook_delivery, list_webhooks, and resend_webhook, which sit in the same sibling group.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to reach for it ('audit what was sent', 'find a delivery id to resend') and routes the agent elsewhere for the payload ('use get_webhook_delivery for the full signed payload'). That is a concrete when-to-use plus a named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_webhooksList WebhooksARead-onlyIdempotentInspect
List the webhook endpoints registered on the authenticated account. Each endpoint includes its id, URL, subscribed events, status (ACTIVE|DISABLED), consecutive failure count, last success/failure timestamps, last error, and signing secret. Porkbun POSTs a signed JSON payload to each endpoint when subscribed events occur; deliveries are signed with the endpoint's secret via HMAC-SHA256 over {timestamp}.{rawBody} and sent in the X-Porkbun-Signature header.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so safety is covered. The description goes beyond them by explaining the webhook delivery model, the HMAC-SHA256 signing scheme over `{timestamp}.{rawBody}`, and the `X-Porkbun-Signature` header — genuinely useful context an agent could not get from annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence and the response fields are enumerated compactly. The second sentence on signing mechanics is longer than strictly needed for a listing tool, but it is informative rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema present, the description carries the return-value burden and does so thoroughly — id, URL, events, status enum, failure count, timestamps, last error, and secret are all named. Together with the delivery semantics, an agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4; there is nothing for the description to disambiguate. It correctly does not invent parameter detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (webhook endpoints) with an explicit scope constraint ('registered on the authenticated account'), and enumerates the returned fields. However, it never distinguishes itself from close siblings like get_webhook or list_webhook_deliveries, so the agent must infer the boundary from the name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no indication of when to prefer get_webhook or list_webhook_deliveries, and no mention of prerequisites or pagination behavior. The zero-parameter list shape implies basic usage, but nothing is stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_wp_credentialsList WP CredentialsARead-onlyIdempotentInspect
CLOUD FOR WORDPRESS ONLY. List the WordPress application passwords on a domain's site (uuid, name, created, last used) so you can audit them or pick one to revoke. Metadata only — the passwords themselves can never be re-read.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain whose WordPress site to inspect. | |
| wp_user | No | WordPress username (defaults to the dedicated `porkbun-agent` user). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior. The description adds genuinely new context: that the secrets themselves can never be re-read ('Metadata only'), which prevents an agent from expecting retrievable passwords, and it flags the Cloud-for-WordPress platform restriction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero filler; the platform restriction is front-loaded and the returned-fields list is compact. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only tool with no output schema, the description covers purpose, scope, returned fields, and the metadata-only limitation. Only pagination or empty-state behavior is unaddressed, a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both 'domain' and 'wp_user' are already documented with their defaults in the schema. The description adds no parameter-level detail beyond what is structured, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (List) plus resource (WordPress application passwords) with an explicit scope qualifier ('CLOUD FOR WORDPRESS ONLY') and an enumeration of returned fields. It is clearly distinguishable from the sibling create_wp_credentials and delete_wp_credentials tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the two motivating use cases ('audit them or pick one to revoke'), which gives an agent a clear reason to select this over the create/delete siblings. It lacks an explicit when-not or prerequisite statement, but the usage context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
make_hosting_dirMake Hosting DirAIdempotentInspect
Create a directory (and any missing parent directories) at path in a domain's Secure Static Hosting space. deploy_site already auto-creates the directories in a file's path, so use this only to stand up an empty directory explicitly. Calls the Porkbun Hosting API (https://porkbun.com/llms/hosting).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Directory path to create, e.g. `assets/img`. | |
| domain | Yes | Domain whose hosting to create the directory in. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds meaningful context beyond that: recursive parent creation and the interaction with deploy_site's auto-create behavior. It stops short of error/naming-collision behavior, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with what the tool does, followed by the disambiguating when-not rule and a reference link. Every sentence earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and for a simple two-param directory creation the description covers purpose, scope, the key alternative, and behavior (recursive creation). Auth/permission requirements and error behavior on existing dirs are unstated but minor for this tool given the annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both params are documented in the schema, including the `assets/img` path example. The description adds only the domain-scoping context implied by 'in a domain's Secure Static Hosting space', so the baseline 3 for schema-heavy definitions is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource+scope: creates a directory, recursively including parents, inside a domain's Secure Static Hosting space. It also distinguishes itself from the sibling tool deploy_site, which auto-creates directories, so an agent can route correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-not guidance: 'deploy_site already auto-creates the directories in a file's path, so use this only to stand up an empty directory explicitly.' It names the alternative and the exact condition that selects this tool, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mock_callMock CallARead-onlyIdempotentInspect
Get a schema-accurate EXAMPLE response for any API endpoint with NO credentials — nothing to set up. Mirrors the real path under /mock (e.g. path domain/listAll or dns/create/example.com). Touches no datastore and returns the exact shape the live API would. Set error: true to see the error-response shape instead. Use it to learn/verify response shapes before wiring up real or sandbox keys. Omit path (or pass empty) to list every mockable endpoint.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | The real endpoint path to mock, without leading slash — e.g. `domain/listAll`. Omit to list all mockable endpoints. | |
| error | No | Return the error-response shape instead of success. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false. The description adds important behavior beyond annotations: no credentials needed, no datastore touched, returns the exact shape the live API would, and the `error: true` flag reveals the error response shape. This is rich, non-redundant context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then examples, behavior, usage, and the path-omission trick. Slightly repetitive with the schema's parameter descriptions, but every sentence is otherwise useful and the structure is logical.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter, no-output-schema tool, the description covers purpose, usage context, behavioral guarantees (no datastore, no credentials), error-shape option, and listing behavior. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already explains both parameters fully. The description repeats the path examples and omit-to-list behavior, adding no syntax or format details beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get a schema-accurate EXAMPLE response') and resource ('any API endpoint'), and immediately distinguishes itself from all sibling tools by noting it requires NO credentials and touches no datastore. The agent can tell this is a mock/example tool, not a real API operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use it 'to learn/verify response shapes before wiring up real or sandbox keys,' and explains how to list all mockable endpoints by omitting `path`. It does not name specific alternative tools or say when not to use it, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pingPingARead-onlyIdempotentInspect
Verify the Porkbun API connection and credentials. Returns the caller's public IP and whether the API key is valid. Use this as a first sanity check before making other calls.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, no open-world access, so the safety profile is covered. The description adds real value by disclosing the return contents (caller's public IP and API key validity), which matters because there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with purpose, then return contents, then usage guidance. Zero waste and appropriately sized for a simple ping.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-parameter, no-output-schema diagnostic call, the description supplies purpose, return contents, and usage context. An agent has everything required to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the schema requires no explanation and the baseline is 4. Nothing in the description is needed to clarify inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Verify the Porkbun API connection and credentials.' It clearly distinguishes itself from all siblings, which are domain/DNS/webhook/cloudflare operations rather than a connectivity health check.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to 'use this as a first sanity check before making other calls,' giving clear triggering context. It does not name a when-not condition or an alternative, but for a diagnostic tool the intended usage is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preflight_domainPreflight DomainARead-onlyIdempotentInspect
Ask whether a change is about to break a domain, BEFORE making it. Read-only, free, and the right thing to call before changing nameservers, transferring a domain out, or enabling DNSSEC.
Every check comes from a real incident, so these are the failures where a zone looks fine and stops working anyway. Read blockers first — those will break something. warnings will not break outright but are usually what the user notices next. safe is true only when both are empty. Each check names the rule it comes from and carries a next_action, so you can explain the finding rather than just report it.
The two an agent should treat as hard stops:
dnssec-active— DS records are published at the registry, so new nameservers will serve answers that do not match them and validating resolvers will refuse the WHOLE zone. The domain goes dark rather than degrading. DNSSEC has to be removed and the DS TTL waited out BEFORE the nameservers change. Never move delegation past this one.spf-duplicate/spf-lookups— RFC 7208 permerrors that make SPF fail for every sender, so the domain's mail is already being degraded whether or not the user has noticed.
Check nameservers-ours before you read anything else: it says whether this zone is what the world resolves at all. A domain delegated to another provider still accepts every DNS write here and none of them take effect, and the mixed case (some of the delegated nameservers are Porkbun's, some are not) means resolvers disagree query to query.
The one worth explaining because nobody expects it: wildcard-shadowed. Under RFC 4592 a wildcard answers only names that do NOT exist in the zone, so a name holding just an MX or TXT record stops inheriting the wildcard's address and stops resolving — with nothing in the zone looking wrong.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain to check, e.g. `example.com` | |
| intent | No | What you are about to do; scopes the checks. Defaults to general, which runs everything applicable. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior, but the description adds substantial operational context: output sections (blockers, warnings, safe), hard-stop checks with real consequences, nameserver delegation gotchas, and DNSSEC/SPF failure modes. This is rich behavioral disclosure beyond structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but for a high-stakes preflight tool with several hard-stop failure modes, most detail earns its place. It is front-loaded with the core purpose and then structured into output interpretation, hard stops, and notable edge cases.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, yet the description explains the return shape (`blockers`, `warnings`, `safe`, `next_action`) and how to interpret it. Combined with the annotations and schema, it gives the agent enough context to call and reason about the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameter documentation is already carried by the schema. The description reinforces intent-related use cases by naming the operations that map to the intent enum, but it does not add syntax, defaults, or meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific purpose: preflight whether an upcoming domain change is about to break something, before making it. It names the relevant operations (changing nameservers, transferring out, enabling DNSSEC), which clearly distinguishes it from mutation siblings like update_nameservers and transfer_domain.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear when-to-use guidance: call before changing nameservers, transferring a domain out, or enabling DNSSEC. It does not explicitly name alternatives or when-not-to-use cases, but the usage context is strong and front-loaded.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_transferPrepare TransferAIdempotentInspect
Create the Porkbun DNS zone for a domain whose inbound transfer is held, so records can be added before the domain moves. Step 2 of the no-downtime sequence (transfer_domain with hold_for_dns_setup, prepare_transfer, import_dns_records, start_transfer). Returns the Porkbun nameservers. The zone is created deliberately, not as a side effect of the first record write, which is why this call exists.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain with a held inbound transfer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, destructiveHint=false and openWorldHint=true, so the mutation-safety profile is covered. The description adds genuine context beyond that: the return value (Porkbun nameservers) and the rationale that the zone is created deliberately rather than as a write side effect, though it does not state what happens if the zone already exists or what auth is required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each earning its place, with the core purpose front-loaded ahead of the sequence context, the return value, and the rationale. No repetition of the title or restated annotation hints.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description discloses the return value (nameservers) and anchors the call in its multi-step workflow, so an agent has everything needed to invoke it correctly in context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With a single parameter at 100% schema description coverage, the schema already documents 'Domain with a held inbound transfer.' The description reinforces the held-transfer precondition but adds no format or syntax detail beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: create the Porkbun DNS zone for a domain with a held inbound transfer. It distinguishes itself from siblings by naming itself as step 2 of a defined sequence and explaining it is not the same as the first record write that would otherwise create the zone implicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly places the tool as 'Step 2 of the no-downtime sequence', naming the upstream sibling (transfer_domain with hold_for_dns_setup), itself, and the downstream calls (import_dns_records, start_transfer). The condition selecting this tool versus its siblings is left to no inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_cloudflare_movePreview Cloudflare MoveARead-onlyIdempotentInspect
Show exactly which DNS records would be copied into Cloudflare for a domain, and which would be dropped, WITHOUT queueing anything. Use this to tell a user what a move will do to their DNS before committing. Records are always created DNS-only (grey cloud); proxying is a separate step via set_cloudflare_proxy.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain to preview. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds valuable context by specifying what the preview shows (records copied vs. dropped) and that records are created DNS-only, but it does not mention return format details, auth requirements, or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: first states the core action and key constraint, second gives usage context, third clarifies a behavioral detail. The purpose is front-loaded and there is no redundant text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only preview tool with a single simple parameter and no output schema, the description adequately covers what is returned, what side effects are avoided, and how the step relates to proxying. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with one parameter, and the description adds no meaning beyond the schema's 'Domain to preview.' Baseline 3 is appropriate when the schema fully documents the parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Show') and resource ('DNS records would be copied into Cloudflare'), and it distinguishes this preview from the actual move by stating 'WITHOUT queueing anything' and from proxying by referencing set_cloudflare_proxy. An agent can immediately tell what this tool does and how it differs from siblings like connect_domains_to_cloudflare.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use this 'to tell a user what a move will do to their DNS before committing', and it names set_cloudflare_proxy as the alternative for proxying. These instructions make the when-to-use and when-not-to-use clear without inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_docRead DocARead-onlyIdempotentInspect
Read a Porkbun documentation page as Markdown. Pass a topic from list_doc_topics (e.g. dns, domain, webhooks, ssl, pricing, account, marketplace). Special values: overview (the llms.txt orientation), full (the entire flat reference — every endpoint), or index (the topic list). Returns the page's full Markdown, including endpoint signatures, parameters, and curl examples.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | Doc topic, e.g. `dns`, `webhooks`, `domain`; or `overview` / `full` / `index`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotent/non-destructive, so safety is covered. The description adds genuinely useful behavioral context absent from structured fields: what the response contains (endpoint signatures, parameters, curl examples) and the semantic difference between overview, full, and index modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: purpose, valid input with examples, special values, and return shape. Zero filler, with the core action front-loaded ahead of the enumerations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so ('full Markdown, including endpoint signatures, parameters, and curl examples'). For a single-param read tool with strong annotations, nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description goes beyond the schema by expanding the unenumerated special values with their actual meaning – 'overview' (the llms.txt orientation), 'full' (entire flat reference), 'index' (topic list) – which the schema only names without explaining.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource ('Read a Porkbun documentation page as Markdown') and immediately distinguishes itself from siblings by pointing to list_doc_topics as the source of valid topics, rather than duplicating that listing capability.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Routes the agent to list_doc_topics for topic discovery and explains the three special modes, which is clear usage context. It stops short of explicitly contrasting with search_docs (the other doc-reading sibling), so the choice between lookup-by-topic and keyword search is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
register_domainRegister DomainAIdempotentInspect
Spends account credit. Registers a new domain on the authenticated Porkbun account. The cost_cents parameter must exactly match the current registration price returned by check_domain (in cents) — Porkbun rejects mismatched quotes. Workflow: call check_domain first to get availability + price, confirm the spend with the user, then call this. The order is idempotency-safe: retries within 24 hours via the same Idempotency-Key return the original response without re-charging. Premium domains, .uk, and a handful of registry-specific TLDs cannot be registered via API and must be done on the website. The account's email and phone number must be verified. A single API registration cannot exceed $100 (ORDER_TOO_LARGE); above that the user has to register on the website.
Money comes from prepaid account credit. The purchase itself charges the credit balance, never a card. If the balance is short, the call fails with INSUFFICIENT_FUNDS carrying cost, balance, shortfall and topUpAvailable (dry_run: true reports the same without charging). When topUpAvailable is true a card is saved: tell the user the shortfall and offer to top up — with their OK, call top_up_account_credit (amount_cents at least topUpAmountToCover, or omit it for their configured amount) and then retry this exact call. When it is false there is no card saved: top_up_with_card_mpp gives a link you pay with the user's card from a Stripe Link agent wallet, or top_up_with_usdc works: open it for the error's usdcAmountToCover (the shortfall plus Coinbase's ~1% fee; $1 minimum), then pay its x402Url with a wallet tool if you have one, with the user's OK, or hand the user its payUrl. Or the user adds credit at https://porkbun.com/account/credit. If a purchase fails with VERIFICATION_REQUIRED, send_phone_verification_code then confirm_phone_verification verifies the phone without leaving the conversation. Suggest configure_auto_topup if they want this to happen automatically next time. Money parameters are integer cents: state amounts to the user in dollars (cost_cents: 1108 is $11.08). If you do not charge cards on a user's behalf, hand it back instead: tell them the shortfall and that they can add it with buy account credit at https://porkbun.com/account/credit, then retry once they have.
| Name | Required | Description | Default |
|---|---|---|---|
| cost | No | Deprecated alias of `cost_cents`, same unit (integer US cents). Send `cost_cents` instead. | |
| domain | Yes | Fully qualified domain name to register, e.g. `example.com` | |
| dry_run | No | If true, validate everything (availability, price match, eligibility, funds, the monthly spend limit) and return a preview with `dryRun: true` and `wouldSucceed` WITHOUT registering or charging. Use to safely confirm before committing. | |
| cost_cents | No | Registration price. Must match the value returned by `check_domain` for this domain (multiplied by years if duration > 1). Required. Integer US cents: 803 means $8.03, not $803. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far exceeds the annotations: it discloses credit-spend semantics, idempotency-safe retries within 24h via the same Idempotency-Key, specific error codes (INSUFFICIENT_FUNDS with cost/balance/shortfall/topUpAvailable, ORDER_TOO_LARGE, VERIFICATION_REQUIRED), and prerequisites (verified email/phone). This is rich operational context an agent needs before committing money.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The 'Spends account credit' warning is well front-loaded, but the body is very long and repeats guidance: the https://porkbun.com/account/credit fallback appears twice, and the top-up branching is dense. Content mostly earns its place, but some condensation is possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a purchase tool with no output schema and four parameters, the description fully equips an agent: prerequisites, quote matching, failure modes, funding recovery paths, and verification workflow are all covered. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: cost_cents must match the check_domain quote, integer-cents unit interpretation ('cost_cents: 1108 is $11.08'), and dry_run's preview behavior. It does not re-explain the deprecated cost alias but that is documented in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Registers a new domain on the authenticated Porkbun account') and immediately distinguishes the operation from siblings like renew_domain, transfer_domain, and buy_closeout by noting which domains it cannot handle. An agent can tell it apart without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit ordering workflow ('call check_domain first... confirm the spend with the user, then call this') and names when-not conditions (premium domains, .uk, registry-specific TLDs, >$100 orders must be done on the website). Alternatives for funding failures are routed to specific sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
renew_domainRenew DomainAIdempotentInspect
Spends account credit. Renews an existing domain in the authenticated account. The cost_cents parameter must exactly match the current renewal price returned by check_domain (in cents). The domain must be opted in to API access (per-domain or global toggle in account settings). Domains registered within the last 30 days, or already renewed within the last 30 days, cannot be renewed yet — the API returns RENEWAL_TOO_SOON. Premium domain renewals are not supported via API. Idempotency-safe: retries within 24 hours don't double-charge.
Money comes from prepaid account credit. The purchase itself charges the credit balance, never a card. If the balance is short, the call fails with INSUFFICIENT_FUNDS carrying cost, balance, shortfall and topUpAvailable (dry_run: true reports the same without charging). When topUpAvailable is true a card is saved: tell the user the shortfall and offer to top up — with their OK, call top_up_account_credit (amount_cents at least topUpAmountToCover, or omit it for their configured amount) and then retry this exact call. When it is false there is no card saved: top_up_with_card_mpp gives a link you pay with the user's card from a Stripe Link agent wallet, or top_up_with_usdc works: open it for the error's usdcAmountToCover (the shortfall plus Coinbase's ~1% fee; $1 minimum), then pay its x402Url with a wallet tool if you have one, with the user's OK, or hand the user its payUrl. Or the user adds credit at https://porkbun.com/account/credit. If a purchase fails with VERIFICATION_REQUIRED, send_phone_verification_code then confirm_phone_verification verifies the phone without leaving the conversation. Suggest configure_auto_topup if they want this to happen automatically next time. Money parameters are integer cents: state amounts to the user in dollars (cost_cents: 1108 is $11.08). If you do not charge cards on a user's behalf, hand it back instead: tell them the shortfall and that they can add it with buy account credit at https://porkbun.com/account/credit, then retry once they have.
| Name | Required | Description | Default |
|---|---|---|---|
| cost | No | Deprecated alias of `cost_cents`, same unit (integer US cents). Send `cost_cents` instead. | |
| domain | Yes | Domain name to renew, e.g. `example.com`. Must already be in your account. | |
| dry_run | No | If true, validate and preview (`dryRun: true`, `wouldSucceed`) WITHOUT renewing or charging. | |
| cost_cents | No | Renewal price. Must match the value returned by `check_domain`. Required. Integer US cents: 803 means $8.03, not $803. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as a non-readonly, idempotent mutation, but the description adds substantial behavioral context: it spends prepaid credit (never a card), retries within 24 hours are idempotency-safe, and specific failure modes are disclosed (RENEWAL_TOO_SOON, INSUFFICIENT_FUNDS with cost/balance/shortfall/topUpAvailable, VERIFICATION_REQUIRED). This far exceeds what the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The critical 'Spends account credit' warning is front-loaded and the bold callouts aid scanning. It is quite long and the top-up workflow detail borders on boilerplate that could live in shared docs, but for a money-spending tool the content largely earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description documents the error codes and the fields carried in failures (cost, balance, shortfall, topUpAvailable, topUpAmountToCover) plus what dry_run returns. An agent has everything needed to call this correctly and recover from failures.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description reinforces that cost_cents must exactly match check_domain and repeats the deprecated `cost` alias, but both points are already present in the schema, so it adds only marginal value beyond structured data.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Renews an existing domain in the authenticated account') and a bolded cost warning. An agent can distinguish this from register_domain, transfer_domain, and check_domain purely from the text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the prerequisite (cost_cents must match check_domain output), the opt-in requirement, the 30-day eligibility windows, and the unsupported cases (premium domains). It also routes to alternatives (top_up_account_credit, top_up_with_card_mpp, top_up_with_usdc, configure_auto_topup) with conditions for each.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resend_webhookResend WebhookADestructiveInspect
Re-queue a past webhook delivery to its endpoint. Clones the delivery into a fresh attempt, reusing the ORIGINAL event id — so a consumer that dedupes on X-Porkbun-Webhook-Id treats the resend as the same event. The endpoint must still exist and be ACTIVE. Use after fixing a downstream bug to replay a delivery that previously FAILED.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The delivery id to resend (from list_webhook_deliveries). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive=true and idempotent=false, and the description adds substantial context beyond them: the delivery is CLONED into a fresh attempt, the original event id is reused, and consumers deduping on X-Porkbun-Webhook-Id will treat it as the same event. The endpoint-existence/ACTIVE prerequisite is also disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the action, then the dedupe-critical behavior, then the precondition and use case. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation with no output schema, the description covers the essential mechanics (clone, event-id reuse, endpoint liveness, replay-after-bug scenario). It omits what happens on failure when the endpoint is missing/inactive or whether the response returns the new delivery id, but these are minor gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there is only one parameter, whose meaning is fully documented in the schema ('delivery id to resend, from list_webhook_deliveries'). The description adds no format or sourcing detail beyond that, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Re-queue a past webhook delivery to its endpoint') and distinguishes itself from siblings like test_webhook or get_webhook_delivery by describing the clone-and-replay behavior. An agent can tell it apart from other webhook tools without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use trigger ('after fixing a downstream bug to replay a delivery that previously FAILED') and a precondition ('endpoint must still exist and be ACTIVE'). It does not name an alternative tool or state when NOT to use it, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_dns_zoneRestore DNS ZoneADestructiveInspect
Put a domain's DNS zone back to a saved restore point. Call diff_dns_restore_point first and show the user what will change.
By default this only ADDS BACK what is missing. It does not remove records added since — pass prune: true for that, and only after reading the extra list, because 'restore my records' usually means 'put back what I lost', not 'delete everything I have done since'.
The restore is itself reversible. The zone's state from immediately before is saved and returned as previousStateSavedAs; restore that id to undo. Use dry_run: true to rehearse — it reports exactly what would change and changes nothing.
Read failed in the response. Parking records and other masked types (ALIAS, HTTPS) are managed by another part of the platform and cannot be recreated this way; they appear in failed rather than being counted, so restored is always a true number. If a parking record is what is missing, the domain needs re-parking on the website instead. SOA and NS are never touched.
A restore only matters if this zone is the one being served. If the domain is delegated to another provider, the response carries a warnings string saying so: the records went back, and nothing the user can see has changed.
| Name | Required | Description | Default |
|---|---|---|---|
| prune | No | Also DELETE live records that are not in the restore point. Default false. Destructive — confirm with the user first. | |
| domain | Yes | Domain to restore, e.g. `example.com` | |
| dry_run | No | If true, report what would change without changing anything. | |
| snapshot_id | Yes | Restore point id from `list_dns_restore_points`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=false, but the description adds far more: the default non-destructive add-back-only semantics, that prune deletes live records, that the restore is itself reversible via previousStateSavedAs, the `failed` semantics for masked record types, the delegation warning, and that SOA/NS are never touched.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long but front-loaded and sectioned with bold lead-ins; each paragraph carries a distinct operational fact (default behavior, reversibility, failure modes, delegation caveat) with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return-value semantics an agent needs (restored, failed, previousStateSavedAs, warnings) and covers the destructive/permission-adjacent caveats, leaving no significant gap for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description goes beyond the schema by explaining what prune actually does to live records and when it is safe to set, and by framing dry_run as a rehearsal that reports what would change.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Put a domain's DNS zone back to a saved restore point') and immediately routes the agent to the sibling diff_dns_restore_point. It is clearly distinguishable from list_dns_restore_points and the create/update/delete_dns_record siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit precondition ('Call diff_dns_restore_point first and show the user what will change') and explicit conditional guidance for the alternative behavior (pass prune: true only after reading the `extra` list). It also names dry_run as the rehearsal path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
retry_cloudflare_domainRetry Cloudflare DomainADestructiveIdempotentInspect
Re-queue a domain whose Cloudflare move failed or was skipped. Fails if it is already connected, already in progress, or no longer in the account — the message says which. Fix the underlying reason first (e.g. disable DNSSEC) or the retry will be skipped again.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain to re-queue. | |
| dry_run | No | Validate without re-queueing. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true, readOnly=false and idempotent=true, so the safety profile is partly carried elsewhere. The description still adds real value by disclosing the specific failure modes and that the returned message identifies which one triggered, plus the DNSSEC caveat about repeat skips.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, zero filler, front-loaded with the operation and followed by the blocking conditions and the remediation hint. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by explaining that failure messages name the cause. For a 2-parameter mutation this is nearly complete; the only minor gap is silence on what dry_run returns or how it interacts with the retry flow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (domain and dry_run both documented), so the schema does the heavy lifting and baseline is a 3. The description adds a little context around the domain's re-queue condition but says nothing about dry_run, which would have added meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Re-queue') plus resource ('domain') and the exact condition that qualifies it ('whose Cloudflare move failed or was skipped'). This distinguishes it clearly from siblings like rollback_cloudflare_domain and connect_domains_to_cloudflare without needing to open any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives strong when/when-not guidance by enumerating the failure preconditions (already connected, in progress, no longer in account) and advising to fix the root cause first. It stops short of naming the sibling commands to use in those alternative situations, but the routing context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rollback_cloudflare_domainRollback Cloudflare DomainADestructiveIdempotentInspect
UNDO a completed Cloudflare move: point the domain's nameservers back at Porkbun, restoring the DNS Porkbun still holds. This changes authoritative DNS for a live domain, so confirm with the user first. The Cloudflare zone is deliberately LEFT IN PLACE — deleting a zone inside the customer's own Cloudflare account is their call. Fails if Porkbun never moved the domain, it is already back on Porkbun nameservers, or it is being worked on right now.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain whose move should be undone. | |
| dry_run | No | Validate without changing nameservers. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With destructiveHint=true already declaring the write, the description adds substantial non-obvious context: the Cloudflare zone is deliberately left in place (what is NOT destroyed), user confirmation is required before changing authoritative DNS, and the exact failure conditions. This is exactly the extra behavioral detail annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed sentences with the undo action, the safety caveat, the non-deletion guarantee, and failure modes front-loaded. No sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive nameserver mutation with no output schema, the description covers the side effects, the deliberate non-action, the authoritativeness of the change, the required confirmation, and failure conditions. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the two parameters are self-described, so the schema already carries the burden. The description mentions the domain implicitly but adds no syntax or usage detail for domain or dry_run; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"UNDO a completed Cloudflare move: point the domain's nameservers back at Porkbun, restoring the DNS Porkbun still holds" gives a precise verb, resource, and mechanism. It is clearly distinguishable from siblings like retry_cloudflare_domain, disconnect_cloudflare, and connect_domains_to_cloudflare.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It presents explicit preconditions ("confirm with the user first") and three concrete cases where the call will fail (never moved, already back on Porkbun, currently in progress), which effectively tells the agent when not to invoke it. It does not, however, name a sibling alternative for those cases, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rotate_webhook_secretRotate Webhook SecretADestructiveInspect
Generate a new signing secret for a webhook endpoint and return the endpoint with the new secret. Deliveries are signed with the new secret immediately, so update your verifier as part of the same operation.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The webhook endpoint id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as non-read-only, non-idempotent, and destructive. The description adds valuable behavioral context beyond that: deliveries are signed with the new secret immediately, so the verifier must be updated in the same operation. It stops short of explicitly stating that the old secret is invalidated, keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and immediately followed by the key operational consequence. Every sentence earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a simple one-parameter schema, destructive annotations, and no output schema, the description covers what the tool does, what it returns, and the immediate side effect. It could be slightly more complete by explicitly noting the old secret becomes invalid, but it is otherwise sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single 'id' parameter, and the description adds no additional meaning about the parameter. Per the rubric, high schema coverage yields a baseline of 3 when the description does not compensate with further detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Generate a new signing secret for a webhook endpoint and return the endpoint with the new secret.' This is unambiguous and inherently distinct from sibling tools like update_webhook or create_webhook, allowing an agent to identify the action without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no explicit when-to-use guidance or alternatives. It only says to update the verifier after rotation, which is operational advice rather than a condition for selecting this tool over others.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sandbox_resetSandbox ResetADestructiveIdempotentInspect
SANDBOX ONLY. Wipe the sandbox account's simulated state (domains, DNS, orders, credit) and re-grant $1000 fake credit — a clean slate between test runs. Requires a sandbox API key (pk1_sb_…). With a live key this endpoint is not available.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the destructive/idempotent profile is covered structurally. The description does add real value by naming the destroyed resources and the re-granted $1000 credit, plus the auth requirement. However, much of the behavioral payload overlaps with what the annotations already convey, so this sits at a solid but not exceptional level.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The 'SANDBOX ONLY' warning is front-loaded, and the three sentences each earn their place: scope of destruction, auth precondition, and live-key exclusion. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, no output schema, and annotations covering the safety profile, the description supplies everything an agent needs: what is destroyed, what is restored, and the key type required. Nothing material is left unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero input parameters, so the baseline is 4. The description correctly implies no caller-supplied arguments are needed, and nothing is misrepresented or missing from the parameter picture.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (wipe/reset) and resource (sandbox account simulated state), enumerating exactly what is affected: domains, DNS, orders, credit. It is clearly distinguished from siblings like sandbox_topup or create_sandbox_key by its whole-account reset scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the when ('a clean slate between test runs'), the precondition ('requires a sandbox API key pk1_sb_…'), and the negative case ('with a live key this endpoint is not available'). The agent knows exactly when this tool applies and when it does not.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sandbox_topupSandbox TopupAInspect
SANDBOX ONLY. Grant fake account credit to the sandbox account so paid operations (register/renew/transfer) can keep being exercised after funds run out. Requires a sandbox API key (pk1_sb_…). Optional amount_cents (integer US cents) (default 100000 = $1000; capped 1,000,000). Returns the new balance. With a live key this endpoint is not available.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | No | Deprecated alias of `amount_cents`, same unit (integer US cents). Send `amount_cents` instead. | |
| amount_cents | No | Fake credit to add (default 100000 = $1000; max 1000000). Integer US cents: 803 means $8.03, not $803. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-destructive but mutating, non-idempotent behavior; the description goes well beyond that by disclosing the auth requirement (sandbox key), the amount cap (1,000,000) and default, the returned value (new balance), and that the endpoint is unavailable with a live key.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the critical constraint ('SANDBOX ONLY') and packs purpose, prerequisite, parameter defaults, cap, and return value into three tight sentences with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by stating it returns the new balance. Auth requirements, scope, caps, and defaults are all covered, so an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the default, cap, unit, and exclusiveMinimum are already documented. The description restates those facts but omits the deprecated `amount` alias that the schema flags, so it adds no meaning beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (grant fake account credit) and resource (sandbox account), and scopes it explicitly with 'SANDBOX ONLY'. This clearly distinguishes it from live-money siblings like top_up_account_credit and configure_auto_topup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the exact triggering condition (after funds run out, so paid register/renew/transfer operations can keep being exercised) and the prerequisite (sandbox API key pk1_sb_). It also states the negative condition: with a live key the endpoint is not available.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sandbox_trigger_webhookSandbox Trigger WebhookADestructiveInspect
SANDBOX ONLY. Fire a sample signed webhook event to your registered endpoints so you can test your handler and HMAC signature verification for ANY event type on demand — including cron-driven events like domain.expiring that don't result from a single API call. Register an endpoint first with the webhook tools. Requires a sandbox API key (pk1_sb_…).
| Name | Required | Description | Default |
|---|---|---|---|
| domain | No | Domain used in the sample payload (default example.com). | |
| eventType | Yes | The webhook event type to emit. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true and idempotentHint=false; the description adds the crucial context that this is sandbox-only, requires a sandbox key, and actually emits a signed delivery to registered live endpoints (the source of the destructive/ non-idempotent profile). It does not say whether deliveries are recorded as real webhook deliveries or how to inspect their outcome.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the decisive constraint (SANDBOX ONLY) and keeps the rest to two short sentences; the em-dash clause earns its place by explaining why cron-driven events need a synthetic trigger. Slightly dense but no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still covers environment, auth, prerequisite setup and intended use, which is nearly everything needed to call it. The remaining gaps are return/observability (what the call returns, how to see the resulting delivery) and disambiguation from test_webhook/resend_webhook.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the enum is fully documented with per-value descriptions, so the schema carries the parameter burden. The description reinforces that eventType accepts any enum value including cron-driven ones, but adds no format or default details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Fire a sample signed webhook event to your registered endpoints') plus scope ('SANDBOX ONLY') and the unusual capability (any event type, including cron-driven events that don't come from an API call). An agent can distinguish it from the other webhook-delivery siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly covers prerequisites: register an endpoint first with the webhook tools, and a sandbox API key (pk1_sb_…) is required, plus the use case (testing your handler and HMAC verification). It does not, however, contrast itself with the near-neighbor siblings test_webhook and resend_webhook, which an agent could easily pick by mistake.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scan_dns_recordsScan DNS RecordsARead-onlyIdempotentInspect
Discover the DNS records a domain currently publishes by querying its live authoritative nameservers. Writes nothing. Use this before moving a domain to Porkbun: a registrar transfer carries only the delegation, never the zone contents, so the old registrar's records become permanently unreadable the moment it stops answering for the domain — and a domain whose records were never recreated goes dark right then (website down, mail bouncing). Scan first, review, then call import_dns_records, and only then change nameservers. The scan probes a wide list of well-known names (apex, common subdomains, MX, DKIM selectors, provider verification hosts) but cannot enumerate a zone — DNS has no listing operation — so treat it as thorough, not exhaustive, and tell the user that. If the losing registrar has its own API, reading the zone from there is authoritative: do that with the user's own credentials (they must never be sent to Porkbun) and pass the records to import_dns_records instead. Limited to 20 calls per hour per account, since each call is roughly 90 DNS lookups.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain to inspect, e.g. `example.com`. Does not need to be registered at Porkbun yet. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover readOnly/idempotent/openWorld, but the description adds what they can't: writes nothing, a 20-calls-per-hour rate limit, ~90 lookups per call, and the critical limitation that it cannot enumerate a zone, so results are thorough but not exhaustive. It also explains the destructive consequence of skipping the scan.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then the workflow rationale, limitation, and rate limit. The prose is long but each block earns its place; the middle-transfer narrative is slightly more expansive than strictly needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description conveys what a scan yields (well-known names, MX, DKIM selectors, verification hosts) and its limits. It stops short of describing the actual return shape, which is the only notable gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter, and schema coverage is 100% with a good example and the note that the domain need not be registered at Porkbun. The description adds no syntax beyond the schema, so baseline 4 applies for a zero-ambiguity single-param tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource: discover DNS records by querying the domain's live authoritative nameservers. The mechanism (live NS query) distinguishes it from sibling list_dns_records, which reads records stored at Porkbun.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit workflow order — scan, review, call import_dns_records, then change nameservers — and explains why. It also names an alternative path when the losing registrar has its own API, with the credential-handling caveat (user's own credentials, never sent to Porkbun).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_closeoutsSearch CloseoutsARead-onlyIdempotentInspect
Search expired-domain closeouts: names that did not sell at auction and are now offered at a fixed price that descends on a schedule. No bidding — the first buyer at the current price takes the name. Filter by keyword, TLD, exact name length, age range and price range; sort by domain, end time, price, revenue, visitors, inbound links or registration_date. Every row carries age and registrationDate, and both are sortable — sort_name=registrationDate with sort_direction=asc gives the OLDEST registrations first, which is the single most requested thing here and is not possible on the website. Note sort_direction=asc on revenue, visitors or inboundLinks lists the domains with no recorded figure first (they come back null); use desc on those. price is the closeout price ALONE. Do not quote a user a total from these results: the binding amount adds the renewal or transfer year and comes from get_closeout. Page with start/limit until start >= totalAvailable.
| Name | Required | Description | Default |
|---|---|---|---|
| tld | No | Single TLD, with or without the leading dot. Omit to search all. | |
| limit | No | Rows per page, max 500. Default 100. | |
| query | No | Keyword match on the domain name. | |
| start | No | Paging offset. Default 0. | |
| age_max | No | Maximum domain age in years. | |
| age_min | No | Minimum domain age in years. | |
| price_max | No | Deprecated alias of `price_max_cents`, same unit (integer US cents). Send `price_max_cents` instead. | |
| price_min | No | Deprecated alias of `price_min_cents`, same unit (integer US cents). Send `price_min_cents` instead. | |
| sort_name | No | Field to sort by. | |
| name_length | No | Exact SLD character count. | |
| sort_direction | No | Sort direction. | |
| price_max_cents | No | Maximum closeout price. Integer US cents: 803 means $8.03, not $803. | |
| price_min_cents | No | Minimum closeout price. Integer US cents: 803 means $8.03, not $803. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld, and non-destructive behavior, and the description adds substantial context beyond them: no bidding, descending price schedule, null sort behavior for revenue/visitors/inboundLinks, closeout price isolation, and the renewal/transfer-year caveat. This is unusually rich for a read-only search tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place, moving from definition to filtering/sorting to critical caveats to pagination. It is front-loaded with the core purpose before branching into important edge cases.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter search tool with no output schema, the description provides filtering fields, sorting behavior, pagination mechanics, return-field notes, and routing to the binding-price tool. Nothing material is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds critical meaning beyond the schema, including the availability of age and registrationDate fields, the oldest-registration sort recipe, null-first behavior for asc sorts on revenue/visitors/inboundLinks, and the distinction that price is closeout price alone. These are not restatements of the schema; they are operational semantics an agent must know.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Search expired-domain closeouts') and explains the defining mechanics: fixed descending price, no bidding, first buyer takes the name. It also distinguishes this search tool from get_closeout and the website by noting that binding totals come from get_closeout.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly covers when to use this tool for filtering, sorting, and paging closeouts, and when not to rely on it for pricing quotes by directing the agent to get_closeout. The pagination instruction 'Page with start/limit until start >= totalAvailable' gives concrete usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_docsSearch DocsARead-onlyIdempotentInspect
Keyword-search the full Porkbun API reference and return the most relevant sections (endpoints/topics) as Markdown. Use for 'how do I…' questions — e.g. 'verify a webhook signature', 'register a domain with dry run', 'set a TXT record'. Returns the best-matching sections with their headings; follow up with read_doc for a full topic page. Searches Porkbun's own docs only.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max sections to return (default 6). | |
| query | Yes | What you're looking for, e.g. `dry run register` or `webhook signature`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful behavior: keyword-based matching, Markdown output, and the docs-only scope limit. It does not mention ranking behavior or failure modes on no matches, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each carrying distinct information: what it searches, when to use it with examples, and what it returns plus the follow-up path. Nothing is redundant and the scope/what-it-does comes first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by describing the return value ('best-matching sections with their headings', Markdown), which is exactly what an agent needs to consume the result. Scope, usage, and follow-up path are all covered for a simple two-parameter search tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are documented in the schema itself, and the description adds no syntax or format detail for 'query' or 'limit' beyond what is already there. The example queries offer marginal illustration but no new parameter semantics. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Keyword-search the full Porkbun API reference') plus the return shape (relevant sections as Markdown). It is clearly distinguishable from siblings list_doc_topics and read_doc, which it explicitly references.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the trigger context ('how do I…' questions) and gives three concrete example queries. It also routes the agent forward to read_doc for a full topic page and bounds scope to 'Porkbun's own docs only', so there is no ambiguity about when to pick this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_phone_verification_codeSend Phone Verification CodeAInspect
Text a verification code to the phone number on the user's Porkbun account, to clear VERIFICATION_REQUIRED (purchases and top-ups need a verified phone and email, and new accounts are not asked to verify the phone at signup). Then ask the user for the code they received and call confirm_phone_verification. The number on the account is used; it cannot be chosen or changed here. If the text does not arrive, call again with channel: "call" to have the code read out by phone. A second request within 10 minutes returns codeAlreadySent rather than texting again. Some countries can only verify on the website (PHONE_VERIFY_UNAVAILABLE); up to 5 sends a day. Guide: https://porkbun.com/llms/guides/verify-the-account
| Name | Required | Description | Default |
|---|---|---|---|
| channel | No | `sms` (default) or `call` for a voice call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses the 10-minute re-send throttle returning codeAlreadySent, the 5-per-day cap, and the PHONE_VERIFY_UNAVAILABLE country restriction. Annotations only say non-idempotent/non-destructive; the description supplies the operational limits that actually govern calling behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the VERIFICATION_REQUIRED trigger are front-loaded, and every following sentence carries a distinct constraint (fallback, throttle, geo limit, guide). It is dense but the clauses are all load-bearing; only minor tightening is possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the error outcomes (codeAlreadySent, PHONE_VERIFY_UNAVAILABLE) and linking a guide. For a one-parameter, non-idempotent action tool, an agent has everything needed to call it and handle the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and already defines the channel enum, so the baseline is 3. The description adds genuine value by explaining the reason to switch to channel: "call" (SMS didn't arrive, have the code read out), which is semantic guidance the enum alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (send a phone verification code) and immediately ties it to the concrete condition it resolves (VERIFICATION_REQUIRED), which cleanly separates it from confirm_phone_verification and the top-up/registration siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it (clear VERIFICATION_REQUIRED for purchases/top-ups), what it cannot do (number is fixed, not choosable), the follow-up step (ask user, then call confirm_phone_verification), and the fallback (retry with channel: call). Alternatives and exclusions are named, not inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_cloudflare_proxySet Cloudflare ProxyADestructiveIdempotentInspect
Turn the Cloudflare proxy (orange cloud) on or off for a domain's DNS records. NOTE: connecting a domain deliberately imports every record DNS-only (grey cloud), because changing how traffic is served at the same time as changing who serves DNS makes failures hard to diagnose — so proxying is a separate, explicit step, best done AFTER confirming the site still works. Defaults to every proxiable record; pass records to target specific names ("@" = apex, bare labels like "www" are expanded). Only A/AAAA/CNAME can be proxied; anything else comes back under skipped with a reason rather than failing. Proxying hides the origin IP, so if MX points at a name you're proxying, mail to it breaks — that comes back in warnings. Reversible: call again with enabled=false. Use dry_run to preview.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain whose Cloudflare records to change. | |
| dry_run | No | Preview which records would change, without changing them. | |
| enabled | Yes | true = proxy through Cloudflare (orange cloud); false = DNS-only (grey cloud). | |
| records | No | Optional: limit to these names. "@" = apex; bare labels are expanded (e.g. ["@","www"]). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it destructive and idempotent, but the description adds substantial behavioral context: default scope, only A/AAAA/CNAME proxiable, skipped/warnings behavior, MX breakage risk, reversibility via enabled=false, and dry_run preview. That goes well beyond structured metadata.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose in the first sentence and then adds only operationally necessary detail: default behavior, record targeting, type limits, warning behavior, reversibility, and dry_run. No sentence is wasted for a safety-sensitive DNS mutation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still previews returned concepts such as skipped and warnings, and covers mutation semantics, safety, idempotence, and preview behavior. An agent has enough information to invoke it correctly and safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description still adds meaning for records (defaults to every proxiable record, supports @ and bare labels) and enabled (reversible by calling with false) beyond the schema text. It adds less for domain/dry_run, but enough to exceed baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the exact operation—turning the Cloudflare proxy on or off for a domain's DNS records—and names the relevant objects (DNS records, orange/grey cloud). It distinguishes itself from sibling Cloudflare tools by being specifically the proxy toggle rather than record CRUD or connection setup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the operational context: proxying is a separate explicit step best done after confirming the site works, and dry_run can preview it. It does not explicitly name alternatives such as edit_cloudflare_record or state when not to use it beyond the diagnostic rationale.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_cloudflare_zone_settingsSet Cloudflare Zone SettingsADestructiveIdempotentInspect
Change Cloudflare zone settings for a moved domain. Only an allowlist is editable (ssl, always_use_https, automatic_https_rewrites, min_tls_version, development_mode, cache_level) — WAF/firewall/security controls are deliberately not exposed. Prefer ssl full over flexible: flexible makes Cloudflare fetch the origin over plain HTTP, a downgrade the visitor cannot see. CLOUDFLARE_REAUTHORIZE_REQUIRED means the stored authorization lacks this permission — surface the connectUrl and ask the customer to reconnect. Supports dry_run.
| Name | Required | Description | Default |
|---|---|---|---|
| ssl | No | TLS mode between Cloudflare and the origin. `full` is the safe default. | |
| domain | Yes | Domain whose zone settings to change. | |
| dry_run | No | ||
| cache_level | No | ||
| min_tls_version | No | ||
| always_use_https | No | ||
| development_mode | No | Temporarily bypass Cloudflare's cache. | |
| automatic_https_rewrites | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag this as a destructive, idempotent, non-open-world mutation; the description adds substantial context beyond that: the exact editable allowlist, the deliberate omission of security controls, the HTTP-downgrade risk of `flexible` ssl, dry_run support, and a specific error-code remediation flow.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but every clause carries information: scope, exclusion, preference, error handling, dry_run. Front-loaded with the verb and allowlist, though the em-dash run-on makes it slightly harder to scan than a clean multi-sentence form.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the description covers what can change, what cannot, safety preferences, and auth failure recovery, with annotations carrying the destructive/idempotent profile. Only the dry_run behavior and the response/result of a change remain unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 38%, but the description names all six editable settings and the ssl enum rationale, which maps to the actual parameters and compensates for most of the gap. dry_run is mentioned only as 'Supports dry_run' without explaining its semantics, leaving one loose end.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Change) plus resource (Cloudflare zone settings) and immediately scopes it to an allowlist of six named settings while explicitly excluding WAF/firewall/security controls. This distinguishes it cleanly from siblings get_cloudflare_zone_settings, set_cloudflare_proxy, and the record-level tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives actionable guidance on picking ssl values (prefer `full` over `flexible`) and on handling CLOUDFLARE_REAUTHORIZE_REQUIRED by surfacing connectUrl. It lacks an explicit statement of when to use this vs. the read-only get_cloudflare_zone_settings or when to prefer a record-level tool, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_transferStart TransferADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Release even though the Porkbun zone is empty. Only for domains that need no DNS here. | |
| domain | Yes | Domain with a held inbound transfer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and non-idempotent behavior, but the description goes beyond that by explaining the indefinite wait (no timer releases the hold) and the exact error code (TRANSFER_ZONE_EMPTY) with its operational meaning. It doesn't describe idempotency behavior or auth requirements, but the added context is genuinely valuable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: first states the action, second explains the critical behavioral fact (no timer), third covers the error and the force condition. Front-loaded with the primary action and zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation tool without an output schema, the description covers the operational context an agent needs: why the hold exists, what error means, and when force is appropriate. It stops short of describing what a successful call returns or what happens to the transfer afterward, but the annotations carry the safety profile well.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters. The description reinforces the meaning of 'force' with a concrete conditional ('when the domain genuinely needs no DNS at Porkbun'), but doesn't add syntax, format, or validation detail beyond what the schema provides. Baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action (release a held inbound transfer to the registry) and its role as the final step of the no-downtime sequence. Sibling tools like prepare_transfer, cancel_transfer, and transfer_domain are not named directly, but the framing clearly distinguishes this as the hold-release step, which is ambiguous from the name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it (final step of the sequence, the only way to release a hold) and includes a clear when-not-to-use condition for the force flag: 'only pass force when the domain genuinely needs no DNS at Porkbun.' This is exactly the kind of conditional guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_webhookTest WebhookADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The webhook endpoint id to send a test event to. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint=true, openWorldHint=true, non-idempotent), the description adds valuable behavioral detail: asynchronous delivery, typical latency under a minute, the ACTIVE prerequisite, and how to confirm success. It does not explain why the tool is flagged destructive, though sending a test event is comparatively benign.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences, front-loaded with the action, then the prerequisite and post-call verification. No wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description appropriately explains what happens after invocation and how to verify the result. Complete for a single-parameter test trigger.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter with 100% schema description coverage, so the schema already carries the semantics of 'id'. The description does not add further detail about the id, but none is needed given full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('send a webhook.test event to an endpoint') and its intent (confirm reachability and signature verification). This distinguishes it clearly from siblings like resend_webhook and sandbox_trigger_webhook.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear prerequisite ('the endpoint must be ACTIVE') and a verification follow-up (check last_success_date via get_webhook). It does not explicitly contrast with siblings such as resend_webhook or sandbox_trigger_webhook, but the context is otherwise actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
top_up_account_creditTop Up Account CreditAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | No | Deprecated alias of `amount_cents`, same unit (integer US cents). Send `amount_cents` instead. | |
| dry_run | No | If true, report what would be charged without charging it. | |
| amount_cents | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Well beyond the annotations, it discloses that this spends real money off a card, requires asking the user first, lists concrete failure codes (NO_PAYMENT_METHOD, CARD_DECLINED, TOPUP_LIMIT_EXCEEDED), explains monthly dollar and frequency caps, notes an email is sent, and covers sandbox and dry_run behavior. This is a rich behavioral disclosure for a mutating tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long, but densely packed and front-loaded with the destructive action and the ask-before warning bolded early. Every sentence carries operational weight; only a mild deduction for overall length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description covers return signals (amount_source), failure modes, and precondition checks (get_auto_topup's monthlyCeiling/toppedUpThisMonth). An agent has everything needed to call this safely and correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, yet the description adds real meaning: the omit-default (configured amount, or $50), that omitting reports back via amount_source, that passing it does NOT change the saved setting, and the cents-vs-dollars unit warning. It turns the schema into actionable semantics rather than restating it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource: charges the user's saved payment method and adds the money to their Porkbun account credit. It clearly distinguishes itself from the related siblings (top_up_with_usdc, top_up_with_card_mpp, configure_auto_topup) by naming them and their differing behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('when a purchase failed with INSUFFICIENT_FUNDS and the user wants to continue now'), an exclusion (auto top-up won't help in that moment, it only fires on the next order), and an alternative routing rule (prefer amount_cents over configure_auto_topup for a single charge). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
top_up_with_card_mppTop Up With Card MppAInspect
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 when a purchase failed with INSUFFICIENT_FUNDS and no card is saved at Porkbun. 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 "..."). 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.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | If true, check eligibility and limits only; creates no link. | |
| amount_cents | Yes | Credit to add, in integer US cents (500 = $5.00). Integer US cents: 803 means $8.03, not $803. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the safety profile (non-read-only, open-world, non-idempotent), and the description adds rich behavior beyond them: 'Nothing is charged by this call,' single-use link valid 15 minutes, the 402/approval flow, immediate credit with new-balance response, and the --context minimum-length and fresh-wording constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and trigger, then flows into operational detail. Dense but nearly every sentence carries actionable guidance (context length, single-use, expiry, alternatives), though it runs long and could be trimmed slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries the return burden and does: it returns a payUrl, the response shows the new balance, and the 402 terms flow is explained. Complete for an agent to invoke and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description reinforces the amount_cents bounds of $5-$500 and the integer-cents semantics, adding context beyond the schema. dry_run is only covered by the schema, so it isn't a full 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: obtaining a payment link that adds account credit paid by CARD over MPP via a Stripe Shared Payment Token. It clearly distinguishes itself from siblings like top_up_with_usdc, sandbox_topup, and top_up_account_credit by naming the payment rail.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit trigger condition is given ('when a purchase failed with INSUFFICIENT_FUNDS and no card is saved at Porkbun'), plus named alternatives for when not to use it (top_up_with_usdc, manual top-up at porkbun.com, sandbox_topup for sandbox keys). Routes the agent well.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
top_up_with_usdcTop Up With UsdcAInspect
Add account credit by paying USDC on Base, through a Coinbase checkout. Use it when a purchase failed with INSUFFICIENT_FUNDS and there is no saved card (or the user would rather pay in crypto). 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_centsin the response); check withget_usdc_topup_statusand then retry the purchase.amount_centsis integer US cents, $1 to $500. To cover an INSUFFICIENT_FUNDS shortfall exactly (a $2.50 domain, say), use that error'susdcAmountToCover, which allows for the fee. Payments are on-chain and cannot be reversed. Not available on sandbox keys (usesandbox_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
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | If true, check eligibility only; creates no checkout. | |
| amount_cents | Yes | Checkout amount in integer US cents (100 = $1.00, max 50000 = $500.00); credit is this less about 1%. For a shortfall, pass INSUFFICIENT_FUNDS's `usdcAmountToCover`. Integer US cents: 803 means $8.03, not $803. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnly=false/openWorld=true, but the description adds far more: nothing is charged by this call, payments are on-chain and irreversible, credit lands in ~1 minute less a ~1% fee, monthly top-up limit and TOPUP_LIMIT_EXCEEDED, CRYPTO_NOT_AVAILABLE, and the 'unpaid checkouts count as paid' rule. This is unusually rich behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long, but front-loaded with purpose and trigger, then a tight bullet list for the two return paths. Nearly every clause carries operational value (fees, limits, error codes, guide link); it is dense rather than padded, though the volume is at the upper edge of comfortable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by describing the returned x402Url and payUrl, the estimatedCredit_cents field, confirmation timing, and the follow-up step (get_usdc_topup_status then retry). Error paths and constraints are all covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds genuine semantic guidance: use the INSUFFICIENT_FUNDS error's usdcAmountToCover to cover a shortfall exactly (which accounts for the fee), and reinforces the cents-not-dollars convention. It does not expand on dry_run beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: 'Add account credit by paying USDC on Base, through a Coinbase checkout.' It clearly distinguishes itself from crypto-less siblings (top_up_account_credit, top_up_with_card_mpp, sandbox_topup) by naming the payment rail.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit trigger given: 'Use it when a purchase failed with INSUFFICIENT_FUNDS and there is no saved card (or the user would rather pay in crypto).' It also names alternatives and exclusions (sandbox keys -> sandbox_topup, bank-transfer-only accounts -> porkbun.com, and the card path implicitly via top_up_with_card_mpp).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transfer_domainTransfer DomainAIdempotentInspect
Spends account credit. 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.
Money comes from prepaid account credit. The purchase itself charges the credit balance, never a card. If the balance is short, the call fails with INSUFFICIENT_FUNDS carrying cost, balance, shortfall and topUpAvailable (dry_run: true reports the same without charging). When topUpAvailable is true a card is saved: tell the user the shortfall and offer to top up — with their OK, call top_up_account_credit (amount_cents at least topUpAmountToCover, or omit it for their configured amount) and then retry this exact call. When it is false there is no card saved: top_up_with_card_mpp gives a link you pay with the user's card from a Stripe Link agent wallet, or top_up_with_usdc works: open it for the error's usdcAmountToCover (the shortfall plus Coinbase's ~1% fee; $1 minimum), then pay its x402Url with a wallet tool if you have one, with the user's OK, or hand the user its payUrl. Or the user adds credit at https://porkbun.com/account/credit. If a purchase fails with VERIFICATION_REQUIRED, send_phone_verification_code then confirm_phone_verification verifies the phone without leaving the conversation. Suggest configure_auto_topup if they want this to happen automatically next time. Money parameters are integer cents: state amounts to the user in dollars (cost_cents: 1108 is $11.08). If you do not charge cards on a user's behalf, hand it back instead: tell them the shortfall and that they can add it with buy account credit at https://porkbun.com/account/credit, then retry once they have.
| Name | Required | Description | Default |
|---|---|---|---|
| cost | No | Deprecated alias of `cost_cents`, same unit (integer US cents). Send `cost_cents` instead. | |
| domain | Yes | Domain to transfer in, e.g. `example.com` | |
| dry_run | No | If true, validate and preview (`dryRun: true`, `wouldSucceed`) WITHOUT initiating the transfer or charging. | |
| auth_code | Yes | Authorization (EPP) code from the losing registrar. | |
| cost_cents | No | Transfer price. Must match the value returned by `check_domain`. Required. Integer US cents: 803 means $8.03, not $803. | |
| hold_for_dns_setup | No | 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 nothing). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false) by disclosing that it spends prepaid credit, cannot charge a card, is idempotency-safe, fails with structured errors (INSUFFICIENT_FUNDS with cost/balance/shortfall, VERIFICATION_REQUIRED), is unsupported for .uk, and that held transfers never release on a timer.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Bold lead-ins front-load the critical facts (spends credit, requires auth code, idempotent), and the hold workflow is presented as a compact sequence. It is longer than strictly necessary, with some tangential branches (phone verification, auto-topup nudge) that dilute the core call.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter money-spending mutation with no output schema, the description covers the full lifecycle: prerequisites, cost validation, failure modes and recovery paths, timing expectations, TLD exclusions, and the hold workflow. An agent has everything needed to call it safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3, but the description adds real cross-parameter meaning: `cost_cents` must match `check_domain`'s current price, `dry_run` previews without charging, and `hold_for_dns_setup` parks at PENDINGDNS. It stops short of documenting the deprecated `cost` alias the schema carries.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource: 'Initiates a transfer of an external domain into Porkbun.' It clearly distinguishes itself from sibling operations like register_domain, prepare_transfer, and start_transfer by naming the inbound-transfer scope and the prerequisite it requires.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: poll with `get_transfer_status`, use `hold_for_dns_setup` unless there is no DNS to preserve, and follow the hold → prepare_transfer → import_dns_records → start_transfer sequence. It also names top_up_account_credit / top_up_with_card_mpp / top_up_with_usdc as alternatives conditioned on `topUpAvailable`.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_auto_renewUpdate Auto RenewADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain to update, e.g. `example.com` | |
| status | Yes | `on` enables auto-renew, `off` disables it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true; the description adds genuine consequence detail by explaining that auto-renew charges account credit at expiration and that turning it off risks domain expiration. The one-word 'Idempotent.' sentence merely repeats the annotation, which slightly dilutes the added value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, followed by two short sentences explaining the on/off consequences. Well-sized for the tool, though the trailing 'Idempotent.' restates an annotation rather than earning its own sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation tool with no output schema, annotations covering safety/idempotency, and full schema coverage, the description supplies the key missing piece: the real-world consequence of each state. Only the absence of routing guidance toward renew_domain keeps it from being complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters (domain, status enum) are fully documented in the schema, so the baseline of 3 applies. The description adds no syntax or format information beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: toggling auto-renewal for a named domain in the authenticated account. It is clearly distinct from renew_domain in spirit (setting a flag vs. performing a renewal), though it never names that sibling explicitly to remove ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what happens when the flag is on vs. off, which implies the use case, but it never states when to choose this tool over alternatives such as renew_domain for an immediate manual renewal. Usage is suggested rather than directed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_contactsUpdate ContactsADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain to edit, e.g. `example.com` | |
| contact | No | A single contact applied to all four roles. Use this OR `contacts`, not both. | |
| dry_run | No | If true, validate only — returns wouldSucceed without applying the change. | |
| contacts | No | Per-role contacts; include only the roles you want to change. | |
| address_validation_choice | No | 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 suggestedAddress returned there; 'use_as_entered' keeps the submitted address (rejected if a real correction was offered). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses registry push behavior on thick TLDs, that a registrant change fires the new-owner notice/verification email, that no 60-day transfer lock applies, and that certain TLD/role combinations are rejected with REGISTRANT_CHANGE_NOT_SUPPORTED. This is exactly the mutation-side context annotations leave out.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then dense parentheticals for the two input modes and the TLD exceptions. Information-dense with little waste, though the single long paragraph is packed and could be split for readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, destructive, no-output-schema mutation, it covers the edge cases an agent must know (dry_run behavior returns wouldSucceed, TLD rejections, role-subset semantics). It could state what a successful apply returns, but the operative guidance is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all five parameters are already documented in-schema, including the role-keyed semantics and address_validation_choice. The description restates the 'unspecified roles keep their current values' behavior and the OR relationship, which the schema largely covers, adding only marginal meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Edit a domain's contacts') and immediately distinguishes the two invocation modes. An agent can tell this apart from get_contacts or register_domain without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly states when to use `contacts` (keyed by role, any subset) vs `contact` (applied to all four), and names the fallback path ('do those at porkbun.com') for TLD cases the tool rejects. It does not explicitly route against sibling tools, but the invocation guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_dns_recordUpdate DNS RecordADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| ttl | No | New TTL in seconds. | |
| name | No | New subdomain prefix (empty string = apex). | |
| prio | No | New priority (MX/SRV only). | |
| type | No | New record type (rarely changed). | |
| domain | Yes | Domain the record belongs to, e.g. `example.com` | |
| content | No | New record value. | |
| dry_run | No | If true, validate only — confirms the record exists and is editable, returns wouldSucceed without changing it. | |
| record_id | Yes | Numeric record ID (as a string). Get this from `list_dns_records`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already covering idempotent/destructive/readOnly, the description adds real value beyond them: it explains the Porkbun-keeps-a-zone-anyway behavior, that a write can return SUCCESS yet not resolve because another nameserver answers, that `warnings` must be checked and propagated, and that `dry_run` returns `wouldSucceed`. These are non-obvious operational traits an agent cannot infer from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the record_id sourcing, then a bolded behavioral caveat. The nameserver/warnings paragraph is longer than typical but each sentence carries decision-relevant information (what SUCCESS-with-warnings means, what to do instead). Minor verbosity, but nothing clearly expendable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries the return burden and does so: it names the `warnings` field, the SUCCESS status, and `wouldSucceed` for dry runs. Combined with annotations covering safety and idempotency and full schema coverage, an agent has everything needed to call it and interpret the result correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents each parameter (ttl, name, prio, content, etc.). The description adds the useful rule that all fields except `record_id` and `domain` are optional and only changed fields need passing, but this largely restates the schema's `required` list. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Update) and resource (an existing DNS record) and pins the targeting key: the numeric `record_id`. The word 'existing' implicitly separates it from `create_dns_record`/`delete_dns_record`, and it explicitly names `list_dns_records` as the source of the ID, so an agent can tell what it does and how to aim it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: use it to modify an already-existing record, pass only the fields to change, and use `dry_run` to validate first. It also routes to an alternative (`update_nameservers`) when the domain isn't delegated to Porkbun. It stops short of explicit when-not-to-use framing, but the guidance is concrete and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_glue_recordUpdate Glue RecordADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| ips | Yes | Full replacement set of IPv4/IPv6 addresses for the host. | |
| domain | Yes | Parent domain, e.g. `example.com` | |
| subdomain | Yes | Host portion only, e.g. `ns1`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false. The description goes beyond them by disclosing the replacement semantics ('pass all IPs you want set, not just additions'), which is exactly the destructive-behavior detail an agent needs to avoid accidental data loss. It restates 'Idempotent' from the annotations, so not a full 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action, immediately followed by the one behavioral trap that matters. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Three required params, no output schema, rich annotations — the description covers the key gotcha (full replacement) that an agent could otherwise get wrong. Minor gaps remain around preconditions and permissions, but nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the ips property already documents itself as a 'Full replacement set,' so the schema carries the burden. The description's 'not just additions' phrasing adds a useful nuance about caller intent, but otherwise duplicates the schema rather than extending it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (update) plus resource (glue record) plus scope (the IP addresses associated with an existing record). An agent can distinguish it from create_glue_record, delete_glue_record, and list_glue_records without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'existing glue record' (this is not for creating records), but no alternative or precondition is named — nothing says when to prefer this over delete+create, or whether the record must already exist and be owned by the caller.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_nameserversUpdate NameserversADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain to update, e.g. `example.com` | |
| dry_run | No | If true, validate only — returns wouldSucceed without changing the nameservers. | |
| nameservers | Yes | Full list of nameservers (e.g. `['ns1.example.com', 'ns2.example.com']`). Minimum 2, maximum 13. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover destructive/idempotent hints, but the description adds material behavioral context beyond them: disabling Porkbun free DNS hosting (a real side effect), the TLD 2-13 constraint, idempotency semantics, and the ordering caveat warning that a reordered registry response is not drift. This is exactly the kind of context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then the caveats that matter. Every sentence (replacement semantics, TLD range, DNS hosting impact, idempotency, ordering) carries distinct information; none is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, no-output-schema mutation tool with full schema coverage, the description supplies everything an agent needs: replacement semantics, side effects, idempotency, and the ordering expectation. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (baseline 3), and the description adds genuine meaning on top: it explains the nameservers list is applied as a complete set and unordered, which the schema's min/max bounds alone do not convey. dry_run semantics remain schema-only.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope: 'Replace the nameservers for a domain in the authenticated account.' The 'full replacement, not an append' clause immediately distinguishes it from any additive NS operation, and get_nameservers is implicitly the read counterpart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly frames when to use it: full-set replacement, not append. It does not explicitly name sibling alternatives (e.g. 'use get_nameservers to inspect first'), leaving routing to inference, but the semantic guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_transfer_auth_codeUpdate Transfer Auth CodeADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain with the stalled inbound transfer. | |
| dry_run | No | Validate the code without storing it or re-queueing. | |
| auth_code | Yes | Replacement authorization (EPP) code from the losing registrar. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (destructive, idempotent, open-world); the description adds behavior the agent cannot get elsewhere: validation happens against the registry before storage, bad codes are rejected immediately rather than days later, non-repairable transfers return TRANSFER_NOT_REPAIRABLE, and a denial notice can masquerade as a bad code. Strong added value beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, all load-bearing, with the operation and its alternative front-loaded before the caveats. Slightly dense, but nothing is redundant and no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter mutation tool with no output schema, the description covers purpose, preconditions, validation timing, failure mode (TRANSFER_NOT_REPAIRABLE) and a diagnostic caveat, while annotations carry the safety profile. An agent has everything needed to call it correctly or avoid calling it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description still adds meaning by explaining that auth_code is the replacement EPP code from the losing registrar and is validated before being stored, which clarifies the semantics of the required input beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Replace the authorization code on an inbound transfer') plus the follow-on action ('re-queue it'), which cleanly separates it from sibling mutation tools like cancel_transfer or start_transfer. An agent can identify the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the situation that selects this tool ('stalled because the code was wrong'), names the alternative it replaces ('instead of cancelling, refunding and resubmitting'), and states the eligibility precondition ('Only repairable transfers qualify'). It even warns when the tool is the wrong diagnosis (a losing registrar's refusal also surfaces as a bad-auth-code status).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_webhookUpdate WebhookADestructiveIdempotentInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The webhook endpoint id. | |
| url | No | New HTTPS URL. Same rules as create_webhook: port 443, publicly resolvable hostname, no embedded credentials. | |
| events | No | Replacement event subscription list (or `['*']` for all). | |
| status | No | Enable or pause the endpoint. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, destructiveHint=true, and readOnlyHint=false; the description corroborates idempotency and adds non-obvious behavior — partial-update semantics, the failure-counter reset on resume, and the public-HTTPS URL constraint. It does not spell out what 'destructive' covers (e.g. dropping subscriptions when events is replaced), leaving one gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five short sentences, each carrying distinct information, with the change semantics front-loaded. No filler or restatement of the name/title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, 4 parameters, and annotations covering the safety profile, the description supplies the mutation semantics, status transitions, and URL constraints an agent needs. Only minor gaps remain, e.g. the behavior when events is replaced or omitted.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds operational meaning beyond the schema: the ACTIVE/DISABLED transition effects (pause vs. resume and the failure-counter clearing) and a pointer to create_webhook's URL rules.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Update a webhook endpoint') and immediately clarifies the partial-update semantics ('Only the supplied fields change'), which separates it from create_webhook/delete_webhook in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage guidance for the status field (DISABLED to pause, ACTIVE to resume) and references create_webhook as the source of URL rules. It does not explicitly rule out or route to adjacent siblings like rotate_webhook_secret, test_webhook, or resend_webhook, so it stops short of full alternative coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v0.43.6- Added
confirm_phone_verification - Changed
register_domain1 field changed- changed
Input schema / properties / dry_run / descriptionPrevious value: -"If true, validate everything (availability, price match, eligibility, funds, spend limit) and return a preview with `dryRun: true` and `wouldSucceed` WITHOUT registering or charging. Use to safely confirm before committing."New value: +"If true, validate everything (availability, price match, eligibility, funds, the monthly spend limit) and return a preview with `dryRun: true` and `wouldSucceed` WITHOUT registering or charging. Use to safely confirm before committing."
- Added
send_phone_verification_code - Changed
top_up_with_usdc2 fields changed- changed
Input schema / properties / amount_cents / descriptionPrevious value: -"Credit to add, in integer US cents (500 = $5.00, max 50000 = $500.00). Integer US cents: 803 means $8.03, not $803."New value: +"Checkout amount in integer US cents (100 = $1.00, max 50000 = $500.00); credit is this less about 1%. For a shortfall, pass INSUFFICIENT_FUNDS's `usdcAmountToCover`. Integer US cents: 803 means $8.03, not $803." - changed
Input schema / properties / amount_cents / minimumPrevious value: -500New value: +100
4 tool updates
v0.41.1- Changed
delete_hosting_file2 fields changed- changed
Input schema / properties / path / descriptionPrevious value: -"Path to delete, e.g. `old/page.html`."New value: +"Path to delete, e.g. `old/page.html` or `assets`." - added
Input schema / properties / recursiveAdded value: +{ + "description": "Delete a directory together with everything inside it. Default false.", + "type": "boolean" +}
- Added
get_usdc_topup_status - Added
top_up_with_card_mpp - Added
top_up_with_usdc
81 tool updates
v0.39.4- Added
buy_closeout - Added
cancel_transfer - Added
check_domains - Added
configure_auto_topup - Added
connect_domains_to_cloudflare - Added
create_cloudflare_record - Changed
create_dns_record1 field changed- added
Input schema / properties / dry_runAdded value: +{ + "description": "If true, validate only — returns wouldSucceed without creating the record.", + "type": "boolean" +}
- Changed
create_dnssec_record2 fields changed- changed
Input schema / properties / alg / descriptionPrevious value: -"Algorithm number, e.g. `13` for ECDSA P-256 SHA-256, `8` for RSA SHA-256."New value: +"Algorithm number, e.g. `13` for ECDSA P-256 SHA-256, `8` for RSA SHA-256. Algorithms 1, 3, 5, 6, 7 and 12 are deprecated (RFC 9904/9905/9906) and are already refused by some registries." - changed
Input schema / properties / digestType / descriptionPrevious value: -"Digest type, e.g. `2` for SHA-256, `4` for SHA-384."New value: +"Digest type, e.g. `2` for SHA-256, `4` for SHA-384. Digest types 1 (SHA-1) and 3 (GOST R 34.11-94) are deprecated and are being refused registry by registry; 2 is accepted everywhere."
- Added
create_hosting - Added
create_sandbox_key - Changed
create_url_forward3 fields changed- added
Input schema / properties / redirect_typeAdded value: +{ + "description": "Optional exact redirect type; takes precedence over `type`. 301 = permanent, 302 or 307 = temporary (pass 307 here to get a 307), masked = URL masking. Omit to derive from `type` (temporary→302, permanent→301).", + "enum": [ + "301", + "302", + "307", + "masked" + ], + "type": "string" +} - changed
Input schema / properties / type / descriptionPrevious value: -"`permanent` sends HTTP 301 (browsers cache); `temporary` is the configurable default redirect."New value: +"`permanent` = HTTP 301; `temporary` = HTTP 302 (default); `masked` = loads the destination in a frame (URL masking). For a precise code — including a 307 temporary redirect — use `redirect_type`." - changed
Input schema / properties / type / enumPrevious value: -[ - "permanent", - "temporary" -]New value: +[ + "permanent", + "temporary", + "masked" +]
- Added
create_webhook - Added
create_wp_credentials - Added
delete_cloudflare_record - Changed
delete_dns_record1 field changed- added
Input schema / properties / dry_runAdded value: +{ + "description": "If true, validate only — confirms the record exists and is deletable, returns wouldSucceed without deleting it.", + "type": "boolean" +}
- Added
delete_hosting - Added
delete_hosting_file - Added
delete_webhook - Added
delete_wp_credentials - Added
deploy_site - Added
diff_dns_restore_point - Added
disconnect_cloudflare - Added
edit_cloudflare_record - Added
get_auto_topup - Added
get_closeout - Added
get_cloudflare_connection - Added
get_cloudflare_domain_status - Added
get_cloudflare_queue - Added
get_cloudflare_records - Added
get_cloudflare_zone - Added
get_cloudflare_zone_settings - Added
get_contacts - Added
get_hosting - Added
get_invoice - Added
get_invoice_pdf - Changed
get_pricing1 field changed- added
Input schema / properties / tldsAdded value: +{ + "description": "TLDs to price, e.g. [\"com\", \"io\", \"dev\"]. Omit for every TLD.", + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 200, + "type": "array" +}
- Added
get_registration_requirements - Added
get_transfer_setup - Added
get_webhook - Added
get_webhook_delivery - Added
get_webhook_event_types - Added
import_dns_records - Added
list_cloudflare_inventory - Added
list_dns_restore_points - Added
list_doc_topics - Added
list_hosting_files - Added
list_hosting_plans - Added
list_invoices - Added
list_webhook_deliveries - Added
list_webhooks - Added
list_wp_credentials - Added
make_hosting_dir - Added
mock_call - Added
preflight_domain - Added
prepare_transfer - Added
preview_cloudflare_move - Added
read_doc - Changed
register_domain6 fields changed- changed
Input schema / properties / cost / descriptionPrevious value: -"Registration price in cents. Must match the value returned by `check_domain` for this domain (multiplied by years if duration > 1)."New value: +"Deprecated alias of `cost_cents`, same unit (integer US cents). Send `cost_cents` instead." - removed
Input schema / properties / cost / exclusiveMinimumRemoved value: -0 - added
Input schema / properties / cost / minimumAdded value: +-9007199254740991 - added
Input schema / properties / cost_centsAdded value: +{ + "description": "Registration price. Must match the value returned by `check_domain` for this domain (multiplied by years if duration > 1). Required. Integer US cents: 803 means $8.03, not $803.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" +} - added
Input schema / properties / dry_runAdded value: +{ + "description": "If true, validate everything (availability, price match, eligibility, funds, spend limit) and return a preview with `dryRun: true` and `wouldSucceed` WITHOUT registering or charging. Use to safely confirm before committing.", + "type": "boolean" +} - changed
Input schema / requiredPrevious value: -[ - "domain", - "cost" -]New value: +[ + "domain" +]
- Changed
renew_domain6 fields changed- changed
Input schema / properties / cost / descriptionPrevious value: -"Renewal price in cents. Must match the value returned by `check_domain`."New value: +"Deprecated alias of `cost_cents`, same unit (integer US cents). Send `cost_cents` instead." - removed
Input schema / properties / cost / exclusiveMinimumRemoved value: -0 - added
Input schema / properties / cost / minimumAdded value: +-9007199254740991 - added
Input schema / properties / cost_centsAdded value: +{ + "description": "Renewal price. Must match the value returned by `check_domain`. Required. Integer US cents: 803 means $8.03, not $803.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" +} - added
Input schema / properties / dry_runAdded value: +{ + "description": "If true, validate and preview (`dryRun: true`, `wouldSucceed`) WITHOUT renewing or charging.", + "type": "boolean" +} - changed
Input schema / requiredPrevious value: -[ - "domain", - "cost" -]New value: +[ + "domain" +]
- Added
resend_webhook - Added
restore_dns_zone - Added
retry_cloudflare_domain - Added
rollback_cloudflare_domain - Added
rotate_webhook_secret - Added
sandbox_reset - Added
sandbox_topup - Added
sandbox_trigger_webhook - Added
scan_dns_records - Added
search_closeouts - Added
search_docs - Added
set_cloudflare_proxy - Added
set_cloudflare_zone_settings - Added
start_transfer - Added
test_webhook - Added
top_up_account_credit - Changed
transfer_domain7 fields changed- changed
Input schema / properties / cost / descriptionPrevious value: -"Transfer price in cents. Must match the value returned by `check_domain`."New value: +"Deprecated alias of `cost_cents`, same unit (integer US cents). Send `cost_cents` instead." - removed
Input schema / properties / cost / exclusiveMinimumRemoved value: -0 - added
Input schema / properties / cost / minimumAdded value: +-9007199254740991 - added
Input schema / properties / cost_centsAdded value: +{ + "description": "Transfer price. Must match the value returned by `check_domain`. Required. Integer US cents: 803 means $8.03, not $803.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" +} - added
Input schema / properties / dry_runAdded value: +{ + "description": "If true, validate and preview (`dryRun: true`, `wouldSucceed`) WITHOUT initiating the transfer or charging.", + "type": "boolean" +} - added
Input schema / properties / hold_for_dns_setupAdded value: +{ + "description": "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 nothing).", + "type": "boolean" +} - changed
Input schema / requiredPrevious value: -[ - "domain", - "cost", - "auth_code" -]New value: +[ + "domain", + "auth_code" +]
- Added
update_contacts - Changed
update_dns_record1 field changed- added
Input schema / properties / dry_runAdded value: +{ + "description": "If true, validate only — confirms the record exists and is editable, returns wouldSucceed without changing it.", + "type": "boolean" +}
- Changed
update_nameservers1 field changed- added
Input schema / properties / dry_runAdded value: +{ + "description": "If true, validate only — returns wouldSucceed without changing the nameservers.", + "type": "boolean" +}
- Added
update_transfer_auth_code - Added
update_webhook
31 tool updates
v0.4.1- First observed
check_domain - First observed
create_dns_record - First observed
create_dnssec_record - First observed
create_glue_record - First observed
create_url_forward - First observed
delete_dns_record - First observed
delete_dnssec_record - First observed
delete_glue_record - First observed
delete_url_forward - First observed
get_api_settings - First observed
get_balance - First observed
get_domain - First observed
get_nameservers - First observed
get_pricing - First observed
get_ssl_bundle - First observed
get_transfer_status - First observed
list_dns_records - First observed
list_dnssec_records - First observed
list_domains - First observed
list_glue_records - First observed
list_marketplace - First observed
list_transfers - First observed
list_url_forwards - First observed
ping - First observed
register_domain - First observed
renew_domain - First observed
transfer_domain - First observed
update_auto_renew - First observed
update_dns_record - First observed
update_glue_record - First observed
update_nameservers
TDQS
Scored across 107 tools
Most tools target a distinct resource+action and descriptions carefully delineate boundaries (e.g. check_domain vs check_domains, the three top_up_* payment variants, Porkbun DNS vs Cloudflare DNS tools). A few families are close — check_domain/check_domains, get_invoice/get_invoice_pdf, list_dns_records vs get_cloudflare_records — but the docs make the distinction explicit rather than leaving an agent guessing.
Uniform snake_case verb_noun convention throughout (list_*, get_*, create_*, update_*, delete_*), including namespaced families like *_cloudflare_* and sandbox_*. The only deviations are the intentional singular/plural pair check_domain/check_domains and the singular mock_call, both of which read cleanly.
107 tools is far beyond a well-scoped surface even for a full registrar API spanning domains, DNS, DNSSEC, glue, hosting, webhooks, Cloudflare and docs. Each tool may earn its place in isolation, but the aggregate surface is heavy enough to impede selection and discovery for an agent.
The surface is exceptionally complete: full CRUD for DNS records, DNSSEC, glue, URL forwards, domains, transfers (including hold/repair/cancel lifecycle), hosting, webhooks and Cloudflare moves, plus billing, docs/mock helpers and sandbox tooling. No obvious dead ends for the domain-lifecycle domain.
Maintenance
Related MCP Connectors
Hosted MCP with 91 agent tools: X, domains, SEO, Maps, Trends, Search, YouTube, TikTok, and more.
Your org's AI agents, tasks, runs, search, and brain files as MCP tools and resources.
The OpenRouter for tools. One MCP connection gives any AI agent 254 hosted tools, pay per call.
29 pay-per-call DNS, SEO, SSL, security, and dev tools for AI agents. x402, no API key.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables comprehensive domain and DNS management through the Porkbun API, including domain registration checks, DNS record operations, URL forwarding, DNSSEC configuration, and SSL certificate management. Provides 27 tools for complete domain administration through natural language interactions.3MIT
- AlicenseBqualityCmaintenancedomain-suite-mcp is an MCP server that gives AI agents full autonomous control over the domain lifecycle. From checking availability and registering domains to managing DNS records, SSL certificates, and email authentication across Porkbun, Namecheap, GoDaddy, and Cloudflare through a unified set of 21 tools.2116 npm20MIT
- AlicenseAqualityFmaintenanceAgentDomain MCP allows AI agents to register, buy, and manage internet domains via the Model Context Protocol. Features include domain search, availability check, purchase, DNS record management, and wallet operations.1363 PyPI3MIT
- AlicenseBqualityDmaintenanceEnables management of Porkbun domains, DNS records, SSL certificates, URL forwarding, and DNSSEC through MCP-compatible clients.2021 npm15MIT