Namecheap MCP — Tools Reference

Namecheap MCP connects your AI assistant (such as Claude) to your Namecheap account. Through it, the assistant can check domain availability, hand you a link to buy a domain on Namecheap's own site, manage domain contacts, and read or edit DNS records on your behalf — you just ask in plain language, and the assistant calls the right tools.

Getting started

You need a Namecheap account. Namecheap MCP is available at https://mcp.namecheap.com/mcp.

How you connect depends on your AI assistant:

  • Claude (web and desktop) — open Settings, choose Connectors, add a custom connector, and point it at https://mcp.namecheap.com/mcp. Anthropic's Claude is the client we have verified this to work with.
  • Other MCP clients — add a remote MCP server and point it at https://mcp.namecheap.com/mcp. Other clients may work, but we haven't verified them yet.

When you connect, you'll be asked to sign in to Namecheap and grant the assistant access to your account. Which tools the assistant can use depends on the access you approve — if a tool is rejected because access wasn't granted, reconnect and approve the access it needs.

Tools at a glance

Every tool completes immediately, so there is no background-operation tool to poll. Buying a domain is the one thing that does not finish in the conversation: domain_purchase_link returns a link the customer opens and pays on themselves, and domains_list is what confirms the outcome afterwards.

Tool What it does
contacts_save Save contact details and get a contact ID
contacts_get Read a saved contact by its ID
domains_list List your domains, or look up one domain
domains_check_availability Check if domains are available to register
domain_purchase_link Get a link for the customer to buy a domain on namecheap.com
domain_set_contacts Assign contacts to a domain you own
domain_set_nameservers Switch a domain to basic or custom nameservers
dns_records_get Read DNS records for a domain
dns_records_save Add DNS records or update their TTL
dns_records_delete Delete DNS records

Contacts: inline or by reference

Wherever a contact is required (domain_set_contacts), each role accepts either:

  • inline contact details — the full contact object (firstName, lastName, email, …). It is saved to your Namecheap account automatically; you do not have to call contacts_save first.
  • a reference{ "contactId": "…" } pointing at a contact you saved earlier with contacts_save.

A contactId is an opaque string (1–32 characters). Do not parse it or assume a format — just pass it back where a contact is accepted.

Common workflows

Several tools are designed to be used together: the output of one becomes the input of the next.

Register (buy) a domain

Namecheap has no in-conversation purchase call. Buying a domain always routes the customer to Namecheap's own consent and payment page, where they approve and pay themselves — the assistant never charges the account directly.

  1. domains_check_availability — check the name(s) you want. Only proceed when result is available. Each available name includes the USD price to register it (standard and premium alike), or priceUnavailableReason when it can't be determined — show this to the customer before sending them to buy, since the purchase link itself carries no price.
  2. domain_purchase_link — call with the domain and, optionally, autoRenew. Returns status: consent_required with a consentUrl for the customer to open and complete checkout on namecheap.com, or status: unavailable if the domain can't be bought right now. Nothing is charged by this call, and it takes no term length, WHOIS privacy, or contact input — the consent page has no fields for any of that. autoRenew defaults to on when omitted; the consent page shows the effective choice to the customer but does not let them change it there.
  3. domains_list — after the customer says they've paid, call domains_list for the domain to confirm it is actually registered before telling them it's theirs. The purchase only completes when the customer follows the link back after paying; there is no other confirmation signal.
domains_check_availability --> domain_purchase_link --> (domains_list to confirm)
 (available? + price)           (consentUrl the customer    after the customer says
                                 opens and pays on           they've completed checkout
                                 namecheap.com; no charge
                                 from this call)

Update the contacts on a domain you own

  1. domain_set_contacts — assign contacts to the domain, inline or by { contactId }. Completes immediately. verificationStatus is always null for Namecheap. Some TLD registries require extended attributes — pass them via tldAttributes.

Change a domain's nameservers

  1. domains_list — find the domain and see its current nameservers ({ provider, hosts }; populated when fetching a single domain).
  2. domain_set_nameservers — switch it to Namecheap's default nameservers with provider: "basic" (no hosts), or point it at your own with provider: "custom" and a list of 2–12 hosts. It returns the resulting { provider, hosts }. Re-applying the state a domain is already in returns a validation error rather than a no-op — treat that as expected, not a failure to retry.

Manage DNS records

  1. domains_list — find the domain you want to manage (or pass its name directly if you know it).
  2. dns_records_get — read the current records for the domain.
  3. dns_records_save or dns_records_delete — add, update, or remove records. Records returned by dns_records_get have the same shape the save and delete tools accept (delete just omits ttl), so the assistant can read, adjust, and write back. Matching is case-insensitive except for TXT records, which are case-sensitive.

Review your portfolio

  • domains_list — page through all your domains with sorting, or fetch a single domain by name. See the tool below for which fields Namecheap reports.
  • contacts_get — look up the details behind any contact ID you see on a domain.

Tool reference

Every tool returns its result as structured JSON, and every tool completes immediately — Namecheap has no long-running background operations.

Contacts

Contacts are the people or organizations attached to a domain registration (registrant, admin, tech, billing). A contact is referenced everywhere by its contact ID — an opaque string.

contacts_save — Save Contact

Saves contact details and returns the generated contact ID. Validation of some fields (such as stateProvince and postalCode) depends on the selected country.

Idempotent. Saving details identical to a contact you saved before reuses that existing contact ID instead of creating a duplicate.

Parameter Required Type & constraints
firstName Yes String, 1–64 chars. May include hyphens and apostrophes.
lastName Yes String, 1–64 chars. May include hyphens and apostrophes.
email Yes Valid email address, max 254 chars.
address1 Yes Address line 1. String, 1–128 chars.
city Yes String, 1–64 chars.
country Yes Two-letter country code (ISO 3166-1 alpha-2), e.g. US.
phone Yes International format +CountryCode.Number, e.g. +1.2025551234. Max 32 chars.
organization No Organization/company name. 1–128 chars.
address2 No Address line 2. 1–128 chars.
stateProvince No State/province name, 1–64 chars. May be required depending on the country.
postalCode No 1–16 chars. May be required depending on the country.
phoneExt No Phone extension, 1–16 chars.
fax No Fax number, same +CountryCode.Number format, max 32 chars.
taxNumber No Tax number, 1–32 chars.

Returns

{ "contactId": "..." }

contactId (opaque, 1–32 chars) is what you pass to domain_set_contacts and contacts_get.

When Namecheap's address validation proposes a corrected address, the result may additionally include an addressSuggestion:

{
  "contactId": "...",
  "addressSuggestion": {
    "status": "corrected",
    "suggestedAddress": {
      "address1": "...", "address2": "...", "city": "...",
      "stateProvince": "...", "country": "...", "postalCode": "..."
    }
  }
}

Each field of suggestedAddress is present only when Namecheap proposes a value for it. Treat it as a suggestion to show the user, not an automatic change — the contact is still saved with the details you submitted.

contacts_get — Get Contact

Reads the details of a saved contact by its contact ID. (There is no list-all-contacts tool — contact IDs come from contacts_save.)

Parameter Required Type & constraints
contactId Yes Opaque contact ID, 1–32 chars.

Returns{ contact } with:

Field Type
firstName, lastName, email, address1, city, country, phone, postalCode String
organization, address2, stateProvince, phoneExt, fax, faxExt, taxNumber String or null

Domains

Domain name inputs (domain/domainName) accept Unicode (IDN) or ASCII (A-label) — either way, the tool normalizes the name to punycode automatically before use. domains_check_availability additionally requires a TLD Namecheap supports for registration: a domain whose TLD isn't supported is treated as not available rather than checked. The other domain tools (domains_list, domain_purchase_link, domain_set_contacts, domain_set_nameservers) and the DNS tools normalize the name only and never reject on TLD support.

domains_list — List Domains

Retrieves a paginated list of your domains. Pass domain to fetch a single domain by name instead (pagination and ordering are then ignored, and the result includes a note saying so if they were supplied).

Parameter Required Type & constraints
domain No Fully qualified domain name to fetch a single domain. Accepts Unicode (IDN) or ASCII (A-label) — normalized to punycode automatically.
take No Items per page, 1–100. Default 10.
skip No Items to skip, 0 or more. Default 0.
orderBy No One sort key: name, unicodeName, registrationDate, or expirationDate; prefix with - for descending (e.g. -expirationDate).

Returns{ items, total } where each item describes a domain:

Field Meaning
name / unicodeName Domain name. Namecheap reports unicodeName as a mirror of name (no distinct Unicode form).
isPremium Whether the domain is a premium name.
autoRenew Whether auto-renew is enabled — see the note below on when this is reported.
registrationDate / expirationDate Registration and expiration timestamps.
lifecycleStatus creating, registered, grace1, or redemption.
verificationStatus Not reported by Namecheap — always null.
eppStatuses Not reported by Namecheap — empty.
suspensions Not reported by Namecheap — empty.
privacyProtection { level: "public" | "high", contactForm: boolean }.
nameservers { provider: "basic" | "custom", hosts: [...] }. See the note below.
contacts Not reported by Namecheap — comes back empty. Use contacts_get if you already hold a contact ID from contacts_save.
contactDetails Present only when fetching a single domain via domain: the full contact details assigned to the domain, per role (registrant, admin, tech, billing). See the note below.

Namecheap-specific reporting:

  • contacts, eppStatuses, suspensions, and verificationStatus are not reported — they come back empty or null.
  • unicodeName always mirrors name.
  • nameservers is populated only when fetching a single domain via domain. In the multi-item list it reports the basic default with no hosts.
  • contactDetails is populated only when fetching a single domain via domain. It carries the actual registrant/admin/tech/billing contact details assigned to that domain, so you can read them without holding a contact ID. The id-based contacts field still comes back empty even in the single-domain case, and contactDetails is not included in the multi-item list.
  • autoRenew is a real true/false only in the multi-item list. Fetching a single domain via domain returns autoRenew: null, because Namecheap's single-domain lookup carries no auto-renew field — reported as null rather than a misleading false.

domains_check_availability — Check Domain Availability

Checks whether one or more domain names are available to register. Uses the single-domain endpoint for one name and the bulk endpoint for multiple. A domain whose TLD isn't supported for registration is not sent to the availability check at all — it's returned immediately as tldNotSupported.

Parameter Required Type & constraints
domains Yes 1–20 fully qualified domain names. Each accepts Unicode (IDN) or ASCII (A-label) — normalized to punycode automatically.

Returns{ results }, one entry per requested name:

Field Meaning
domain The checked name.
result available, taken, invalidDomainName, tldNotSupported, or unexpectedError.
premiumPricing For premium names: list of { operation, price, currency } where operation is register, transfer, renew, or restore. Empty for regular names.
price For available names (standard and premium): the USD price to register the domain for the shortest term the TLD allows{ amount, currency: "USD", pricedYears?, pricePerYear?, icannFee?, isPremium }. amount is the payable total for that whole term; pricedYears states how many years it covers. No pre-discount or "was" price is reported. icannFee is the ICANN fee (USD) already included in amount, returned separately so the breakdown can be explained; it appears only when the TLD carries a fee.
pricePerYear Inside price: amount divided by pricedYears, so a yearly figure is always available for comparison. When pricedYears is 1 it is the real one-year price; above that it is a per-year average of the term, not a term you could buy. Omitted for premium names, whose quote carries no term.
minRegisterPeriodInYears / maxRegisterPeriodInYears For available names: the shortest and longest registration period that TLD actually permits, as two plain numbers. Both omitted when the allowed period could not be determined.
priceUnavailableReason Present instead of price when the price could not be determined for an available name. The check itself still succeeds.

Only available names are priced; taken/invalid results carry neither price nor priceUnavailableReason.

Most TLDs allow one year, but some do not. .ai, for example, has a two-year minimum. For those, price.amount is the total for the minimum term — not a one-year price you could act on — and price.pricedYears says so:

{
  "domain": "example.ai",
  "result": "available",
  "premiumPricing": [],
  "price": { "amount": 79.98, "currency": "USD", "pricedYears": 2, "pricePerYear": 39.99, "isPremium": false },
  "minRegisterPeriodInYears": 2,
  "maxRegisterPeriodInYears": 10
}

pricePerYear is present here — 79.98 divided by the two years it covers gives 39.99. This is the total divided by the term, not a price you could pay for a single year (a one-year .ai registration cannot be bought). Always show amount together with pricedYears ("$79.98 for 2 years"), never amount alone. For an ordinary TLD, pricedYears is 1 and pricePerYear equals amount.

Namecheap-specific reporting

  • minRegisterPeriodInYears/maxRegisterPeriodInYears come from Namecheap's own TLD catalogue. Where that catalogue understates a minimum, the gateway corrects it from what the pricing service will actually sell: the first affected request may report the catalogue's value, and every request after it reports the corrected one.
  • pricePerYear is never reported for a premium name — a premium quote carries no term, so a per-year figure would be invented.
  • Both period fields are reported for every available name, premium included, even where no price could be produced.

Hands the customer a link to buy a domain on Namecheap's own consent and payment page, instead of charging the account from the conversation. This call charges nothing and registers nothing — it only creates the purchase link. This is the only way to buy a domain on this brand; there is no in-conversation registration call.

Takes domain and an optional autoRenew. The consent page has no field for term length, WHOIS privacy, or contacts, so none of those can be set through this tool.

Parameter Required Type & constraints
domain Yes String. Fully-qualified domain name the customer agreed to buy, e.g. "example.com". Accepts Unicode (IDN) or ASCII (A-label) — normalized to punycode automatically.
autoRenew No Boolean. Whether the domain and its WHOIS privacy should renew automatically, charging the customer again each term. Defaults to on when omitted. The consent page shows this to the customer but does not let them change it there — they can change it afterwards in their account.

Returns — the customer needs to open the link:

{
  "domain": "example.com",
  "status": "consent_required",
  "consentUrl": "https://www.namecheap.com/apps/consent/1ec9218b-7766-49c8-b25f-a5cff1840746",
  "expiresInSeconds": 1200,
  "autoRenew": true,
  "note": "To buy example.com, open this link and complete the checkout on Namecheap's site: https://www.namecheap.com/apps/consent/1ec9218b-7766-49c8-b25f-a5cff1840746\n\nAfter paying, follow the link back to finish the purchase. Nothing has been charged yet. The domain and its WHOIS privacy will renew automatically, charging the customer again each term. The consent page shows this but does not let the customer change it there — they can change it afterwards in their Namecheap account."
}

Returns — the domain cannot be bought right now:

{
  "domain": "example.com",
  "status": "unavailable",
  "note": "example.com is not available to purchase right now. Check availability again before retrying."
}

status can be:

Status Meaning
consent_required The link was created. consentUrl is what the customer must open; expiresInSeconds is how long it stays valid. Nothing charged.
unavailable The domain is not available to purchase. This is a normal result, not an error.

Namecheap-specific reporting: the customer approves and pays entirely on namecheap.com, and there is no follow-up call for you to make. However, the purchase is only completed once the customer follows the link back after paying — that return is what commits it. If the customer never returns, the purchase can be reverted and any amount charged is refunded automatically. So do not tell the customer the domain is theirs on the strength of this call: confirm with domains_list first. The link is single-use — reopening it after a completed purchase may report a failure even though the domain was bought, so domains_list is the authority on the outcome.

domain_set_contacts — Set Domain Contacts

Changes the contacts assigned to a domain you own. Completes immediately.

Parameter Required Type & constraints
domainName Yes Fully qualified domain name. Accepts Unicode (IDN) or ASCII (A-label) — normalized to punycode automatically.
registrant Yes Inline contact details or { contactId }.
admin No Inline contact details, { contactId }, or null.
tech No Inline contact details, { contactId }, or null.
billing No Inline contact details, { contactId }, or null.
tldAttributes No Extended attribute values keyed by name, for TLDs that require them.

Returns

{ "verificationStatus": null }

Namecheap does not report an RAA verification state, so verificationStatus is always null.

domain_set_nameservers — Set Domain Nameservers

Changes a domain's registrar-level nameservers. Completes immediately. The change is reflected by domains_list (single-domain fetch) afterwards.

Parameter Required Type & constraints
domainName Yes Fully qualified domain name. Accepts Unicode (IDN) or ASCII (A-label) — normalized to punycode automatically.
provider Yes basic (Namecheap's default nameservers) or custom (your own hosts).
hosts Conditional Required when provider is custom: 2–12 nameserver hostnames (each a valid FQDN, 4–255 chars). Must be omitted when provider is basic.

Returns

{ "provider": "custom", "hosts": ["ns1.example.com", "ns2.example.com"] }

Re-applying the state a domain is already in (e.g. setting basic when it is already basic) returns a validation error rather than a no-op success — treat that as an expected result, not a failure to retry.

DNS records

The domainName these tools take accepts Unicode (IDN) or ASCII (A-label) and is normalized to punycode automatically; TLD support is not enforced here.

dns_records_get — Get DNS Records

Retrieves a paginated list of DNS resource records for a domain.

Parameter Required Type & constraints
domainName Yes The domain whose records to fetch.
take No Items per page, 1–500. Default 100.
skip No Items to skip, 0 or more. Default 0.
orderBy No Up to 8 sort keys: type, -type, name, -name.

Returns{ items, total }, plus omittedRecords when the zone contains records this tool cannot return (see below). Each item is a record as described in Record shapes, plus an optional group field indicating where the record comes from (custom — created by you, product — managed by a product, personalNs — personal nameservers).

Namecheap-specific: a record that cannot be represented in the typed contract is omitted from items. Two kinds are omitted: record types outside the contract — the URL, FRAME and URL301 redirect records Namecheap stores in the zone (a parked domain normally has one) — and malformed CAA/TLSA/HTTPS/SVCB values. total still counts every record in the zone, including the omitted ones, so total can be larger than the number of records you can page through. Every omitted record is listed in omittedRecords by type and name, so nothing is dropped without being reported; the field is absent when nothing was omitted. Manage omitted records in the Namecheap dashboard.

{
  "items": [
    { "type": "CNAME", "name": "www", "cname": "parkingpage.namecheap.com.", "ttl": 1800 }
  ],
  "total": 2,
  "omittedRecords": [
    { "type": "URL", "name": "@" }
  ]
}

dns_records_save — Save DNS Records

Adds custom DNS records or updates the TTL of existing ones. Records are matched case-insensitively, except TXT records (case-sensitive).

Parameter Required Type & constraints
domainName Yes The domain whose records to update.
records Yes 1–500 records — see Record shapes. Each may include an optional ttl.
force No Boolean. Skips the conflict-resolution check and forces the zone update.

Returns{ "saved": <number> }, the count of submitted records. Unless force is set, a successful response means every record was accepted and confirmed present in the zone; if any record fails, the whole call returns an error instead.

Namecheap-specific: after writing, the zone is re-read to confirm the records actually persisted. Namecheap can accept a record and then drop it — for example an MX record at @ on a domain with email forwarding enabled, whose mail records Namecheap manages itself. A record accepted but missing from that re-read is reported as a conflict naming the record, not counted as saved. force: true deliberately opts out of that protection: the call then reports success and saved counts the records as submitted, even if some were dropped, so only use it when you intend to bypass conflict handling. If the re-read itself cannot be completed, the call fails — with force set or not — with a message saying the write may have been applied but could not be confirmed; re-read the zone with dns_records_get before retrying, rather than repeating the write. SRV records are the one exception: if Namecheap cannot return SRV records during the re-read, they are reported as saved without being confirmed.

dns_records_delete — Delete DNS Records

Deletes custom DNS records. Deletions cannot be undone. Records are matched case-insensitively, except TXT records (case-sensitive).

Parameter Required Type & constraints
domainName Yes The domain whose records to delete.
records Yes 1–500 records identifying existing records — same shapes as save, but without ttl.

Returns{ "deleted": <number> }, the count of submitted records. If any record cannot be matched, the whole call fails and nothing is deleted.

Record shapes

Every record has:

  • type — one of the 13 supported types below.
  • name — the record name excluding the domain: use @ for the domain itself (apex) and * for a wildcard.
  • ttl (save only, optional) — cache time in seconds, 60–3600.

Type-specific fields:

Type Fields
A address — IPv4 address.
AAAA address — IPv6 address.
CNAME cname — canonical domain name (max 253 chars).
ALIAS aliasName — canonical domain name; CNAME-like behavior for the apex, where CNAME isn't allowed.
NS nameserver — nameserver name.
PTR pointer — domain name for the given IP address.
TXT value — text value (matched case-sensitively).
MX exchange — mail server; preference — priority (0–65535, lower preferred).
CAA flag0 or 128 (critical bit); tagissue, issuewild, or iodef; value — CA identifier with optional parameters.
SRV service (e.g. _sip); protocol (e.g. _tcp); priority and weight (0–65535); port (1–65535); target — server domain name.
TLSA usage, selector, matching (each 0–255); port* or _<1–65535>; protocol (e.g. _tcp); associationData — certificate hash or data.
HTTPS svcPriority (0–65535; 0 = AliasMode); targetName — FQDN or .; optional port (* or _<1–65535>), scheme (must be _https when port is set), svcParams.
SVCB svcPriority (0–65535; 0 = AliasMode); targetName — FQDN or .; optional port, scheme (e.g. _tcp), svcParams.

Exotic values. The wire encoding Namecheap uses for CAA/TLSA/HTTPS/SVCB values is normalized into the fields above where possible. Values that don't fit the typed shape are readable in the zone but are omitted from dns_records_get's items and listed in its omittedRecords (see that tool). Standard records (A, AAAA, CNAME, MX, TXT, NS, etc.) are unaffected.

Values Namecheap rewrites on save. Namecheap normalizes some values as it stores them: host-like values (CNAME, ALIAS, NS, PTR, the MX exchange, the SRV target) come back with a trailing dot, and a CAA value comes back quoted. You do not need to reproduce that when matching a record — dns_records_save and dns_records_delete accept either the value you originally submitted or the value dns_records_get reads back.

Errors

When a call fails, the tool returns an error with a code and a human-readable detail explaining what went wrong — for example invalid input (a malformed domain name or contact ID), a domain or contact that doesn't exist, or a conflict with the current state. If a tool is rejected because the assistant wasn't granted access to it, reconnect Namecheap MCP and approve the access it asks for.

Updated
Viewed
1604 times

Need help? We're always here for you.

notmyip