AWS MCP Server vs Porkbun (official)

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

AWS MCP Server logoAWS MCP ServerCloud Platforms · Local subprocess (stdio)AWS MCP server — call any AWS API from AI assistants, with first-class SSO re-login64GoodAuth: not declaredPorkbun (official) logoPorkbun (official)Cloud Platforms · Local subprocess (stdio)Official Porkbun MCP server: domains, DNS, SSL, hosting and Cloudflare via the Porkbun API.68GreatAuth: oauth 2.0

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

Which MCP server should you choose?

AWS MCP Server logoChoose AWS MCP Server when

  • You need dedicated capabilities in the Cloud Platforms domain.
  • You prefer a local stdio subprocess transport.
  • You want tools like aws_whoami, aws_login_start, aws_login_complete.
Explore AWS MCP Server

Porkbun (official) logoChoose Porkbun (official) when

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

Feature & specification comparison

Rows where the two servers differ are marked.

SpecAWS MCP Server logoAWS MCP ServerPorkbun (official) logoPorkbun (official)
CategoryCloud PlatformsCloud Platforms
Quality signal64/100 · Good68/100 · Great
Install commandConfirmedConfirmed
TransportLocal subprocess (stdio)Local subprocess (stdio)
AuthNot declaredOAuth 2.0
PricingNot declaredNot declared
Required env varsNone listedNone listed
Verified ownerCommunity listingCommunity listing
GitHub stars533
Directory activity 1 views 0 installs 0 upvotes 0 views 0 installs 0 upvotes
Tools28120

Tools & capabilities

AWS MCP Server tools 28

  • aws_whoamiShow the current AWS identity (account, role ARN, user ID) plus SSO token status and time remaining. Use this first to verify auth before running other AWS operations. Returns a structured fix-it message if SSO is expired.
  • aws_login_startStart an AWS SSO login via the device-code flow (no browser spawned from this process). Returns a verification URL and short code -- surface these to the user so they can open the URL in their own browser and paste the code. After they auth, call aws_login_complete with the returned sessionId to confirm completion.
  • aws_login_completeBlock until the SSO login started by aws_login_start finishes (user completed auth in browser, or subprocess exited with error). Returns the new identity on success, or a structured error.
  • aws_refresh_if_expiring_soonProactive SSO token check. If the cached token has fewer than `thresholdMinutes` left (default 10), this kicks off aws_login_start and returns the verification URL + code in one round-trip. If plenty of time remains, returns `status: 'ok'` with the minutes left. Use at the start of a multi-step AWS workflow to avoid mid-session expiry. `status: 'ok'` is a point-in-time reading of the cache, not a lease: nothing re-checks afterwards, so a token that lapses mid-workflow still surfaces as an sso_expired error from the next aws_call / aws_whoami. Raise `thresholdMinutes` to cover the expected length of the workflow rather than treating 'ok' as a guarantee.
  • aws_session_setSet the default AWS profile and/or region for the rest of this MCP session. Subsequent calls to aws_whoami, aws_login_*, and other AWS tools will use these values unless they override explicitly. Use when the user says 'switch to prod', 'use us-west-2', 'look at the staging account', etc. Both params are optional; pass whichever changed. Returns the resulting session state.
  • aws_session_getShow the current session's default AWS profile and region, and where each value came from ('session' = set by aws_session_set, 'env' = AWS_PROFILE/AWS_REGION env var, 'default' = built-in fallback). Useful for confirming state before running operations or debugging why a call hit the wrong account.
  • aws_session_clearRemove session-set profile and/or region overrides so subsequent calls fall back to env vars / defaults. No args clears both. Pass `profile: true` or `region: true` to clear just one. Use when the user says 'go back to the default profile,' 'unset the region,' or 'reset session.'
  • aws_callRun an arbitrary AWS API operation via the aws CLI. Use kebab-case service and operation names as in `aws help` (service='s3api', operation='list-buckets'). Pass params as a JSON object using the AWS API's PascalCase keys (e.g. {Bucket: 'foo'}); they go through --cli-input-json. Session profile/region (from aws_session_set) are used by default; override per-call when needed. Hand-written CLI commands (aws s3 cp/ls/sync, aws logs tail) and operations that stream their response to an output file (s3api get-object, bedrock-runtime invoke-model, bedrock-agentcore invoke-agent-runtime, lambda invoke) do not accept --cli-input-json and cannot run here -- use aws_lambda_invoke or aws_logs_tail where they exist, bedrock-runtime converse for text inference, otherwise your shell. Waiters work: operation 'wait instance-running'. Blob-typed members of params (KMS Plaintext, Kinesis Data, DynamoDB B) take base64 -- the server runs the CLI with --cli-binary-format base64 whatever your AWS config says. Returns parsed JSON output by default, plus the literal command that was run.
  • aws_list_profilesList AWS profiles configured in ~/.aws/config. Returns profile name, region, and SSO metadata (start URL, region, session name) where set, plus an `isSso` flag. Use when the user hasn't named a profile, when they ask to switch profiles, or when an SSO-expired error mentions a profile you haven't seen.
  • aws_paginateFetch one page of a paginated AWS list/describe operation. Identical to aws_call plus `maxItems` (page size) and `startingToken` (resume cursor). When `query` is supplied it is wrapped server-side as {NextToken, items: <query>} so pagination survives a projection that would otherwise drop NextToken; the handler unwraps `items` before returning. Returns the parsed response, a `nextToken` (null when the list is exhausted), and `hasMore`. Call again with the returned nextToken as startingToken until hasMore is false. Use this instead of aws_call for operations that might exceed the 5 MB stdout cap: list-objects-v2, describe-instances, describe-log-streams, list-roles, etc.
  • aws_assume_roleCall STS AssumeRole and stash the returned temporary credentials as a named profile in the shared credentials file ($AWS_SHARED_CREDENTIALS_FILE when set, otherwise ~/.aws/credentials; the resolved path is returned as credentialsPath). Subsequent calls to aws_call / aws_whoami / aws_paginate can use profile='mcp-<sessionName>' (or your overridden targetProfile name). The raw secret key / session token are NOT returned to the caller — only the profile name, expiration, and assumed identity. Use for cross-account access: a source profile (your SSO identity) assumes a role in another account. Default timeout is 120s (raise via timeoutMs for slow SAML / credential_process setups on cold start).
  • aws_logs_tailFetch the newest CloudWatch Logs events for one log group over the last `since` (default 10m), via FilterLogEvents ('aws logs filter-log-events'). Returns events oldest first as {timestamp (ISO 8601 UTC), logStreamName, message (verbatim)}; any of the three is null on an event that arrived without it, which is kept rather than dropped. At most `maxEvents` come back (default 500, max 10000); when the window held more, the OLDEST are dropped and `truncated` is true. On AWS CLI 2.35.8+ the read goes newest-first and stops once it has enough, so a busy group costs a page or two -- and a truncated result reports `totalEvents: null` because the rest was never read. Older CLIs read the whole window (exact `totalEvents`); narrow `since` or add `filterPattern` if a wide window times out. `logGroupName` takes a bare name or a log-group ARN in the call's region; an ARN is sent as logGroupIdentifier, so a source-account ARN works from a cross-account monitoring account (AWS CLI 2.9.15+). Does not stream: call again for newer events. eventId and ingestionTime are omitted -- use aws_call for them.
  • +16 more on the listing page

Porkbun (official) tools 120

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

Ready-to-paste client configs

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

AWS MCP Server

mcpServers (Claude Desktop / Cursor)
{
  "mcpServers": {
    "aws-mcp-server-3": {
      "command": "npx",
      "args": [
        "-y",
        "@yawlabs/aws-mcp"
      ]
    }
  }
}

Porkbun (official)

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

Frequently asked questions

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

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

AWS MCP Server has no declared pricing — check the project's own site. Porkbun (official) has no declared pricing — check the project's own site. Auth: oauth 2.0. If a server needs environment variables such as API keys, define them under the env key in your client's MCP config.

Yes. MCP clients support multiple servers: add aws-mcp-server-3 and porkbun-official as separate keys in the same mcpServers object, and your assistant will call tools from either one.

On AllMCPs, AWS MCP Server has a quality signal of 64/100 (Good) with 1 views, 0 installs and 5 GitHub stars. Porkbun (official) has 68/100 (Great) with 0 views, 0 installs and 33 GitHub stars.