Namecheap MCP connects your AI assistant (such as Claude) to your Namecheap account. Through it, the assistant can check and register domains, 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.
You need a Namecheap account. Namecheap MCP is available at https://mcp.namecheap.com/mcp.
How you connect depends on your AI assistant:
https://mcp.namecheap.com/mcp. Anthropic's Claude is the client we have verified this to work with.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.
Namecheap registrations complete synchronously, so there is no background-operation tool to poll:
| 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_register
|
Register (buy) a domain — spends money |
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 |
Wherever a contact is required (domain_register, domain_set_contacts), each role accepts either:
firstName, lastName, email, …). It is saved to your Namecheap account automatically; you do not have to call contacts_save first.{ "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.
Several tools are designed to be used together: the output of one becomes the input of the next.
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.domain_register
(preview) — call with confirm unset to get status: confirmation_required and the price that will be charged. Nothing is billed. Show the price to the user. Contacts can be passed inline here, or as { contactId } if you saved them with contacts_save.domain_register
(confirm) — after the user agrees, call again with confirm: true. This bills the account's default payment method and is irreversible. It returns the outcome directly (no polling): usually status: completed with the amount charged, or status: pending while the registry finishes.domains_list
— if the result was pending, call domains_list for the domain shortly to confirm it is registered.domains_check_availability --> domain_register --> domain_register --> (domains_list if pending)
(available? + price) (confirm unset: (confirm=true: confirm final state
price, no charge) completed/pending)
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.domains_list
— find the domain and see its current nameservers ({ provider, hosts }; populated when fetching a single domain).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.domains_list
— find the domain you want to manage (or pass its name directly if you know it).dns_records_get
— read the current records for the domain.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.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.Every tool returns its result as structured JSON, and every tool completes immediately — Namecheap has no long-running background operations.
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 ContactSaves 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_register, 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 ContactReads 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_list — List DomainsRetrieves 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 (ASCII/A-label) to fetch a single domain. |
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/falseonly 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 AvailabilityChecks whether one or more domain names are available to register. Uses the single-domain endpoint for one name and the bulk endpoint for multiple.
| Parameter | Required | Type & constraints |
|---|---|---|
domains
|
Yes | 1–20 fully qualified domain names (ASCII/A-label). |
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 one year — { amount, currency: "USD", regularPrice?, discountPercent?, icannFee?, isPremium }. amount is the payable price; regularPrice/discountPercent appear only when a discount applies. 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. |
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.
domain_register — Register DomainRegisters (buys) a domain. This bills your account's default payment method and is irreversible. Recommended sequence: domains_check_availability -> domain_register.
Two-step pre-charge confirmation. Call first with confirm unset (or false): the tool re-fetches the USD price fresh, returns status: "confirmation_required" with that price, and does not bill or register anything. Show the price to the user; only after they agree, call again with confirm: true to submit.
Synchronous. Unlike some registrars, Namecheap registration completes as part of the call — there is no operation to poll. A confirmed call returns its outcome directly (see the status table below).
| Parameter | Required | Type & constraints |
|---|---|---|
domain
|
Yes | Fully qualified domain name to register, e.g. example.com. |
years
|
Yes | Registration period in years, 1–10. |
autoRenew
|
Yes | Boolean. When true, the domain renews automatically at expiration using the account's default payment method. |
privacy.level
|
Yes |
high hides the registrant's contact details from public WHOIS; public publishes them. |
privacy.userConsent
|
Yes | Boolean. Must confirm you agree to the selected privacy setting. |
contacts.registrant
|
Yes | Inline contact details or { contactId }. |
contacts.admin
|
Yes | Inline contact details or { contactId }. |
contacts.tech
|
Yes | Inline contact details or { contactId }. |
contacts.billing
|
Yes | Inline contact details or { contactId }. |
tldAttributes
|
No | Extended attribute values keyed by name, required only for certain TLDs (e.g. registrant nexus or legal-type fields). Provide them for TLDs that need them; omit otherwise. |
confirm
|
No | Boolean pre-charge gate. Omit/false to preview the price without charging; true to submit the billed registration. |
Returns — before confirmation (nothing charged):
{
"domain": "example.com",
"years": 1,
"status": "confirmation_required",
"price": { "amount": 9.08, "currency": "USD", "icannFee": 0.2, "isPremium": false },
"note": "No charge has been made. Show this price to the user; ... call again with confirm=true."
}
Returns — after confirm: true (registered and charged):
{
"domain": "example.com",
"years": 1,
"status": "completed",
"charged": { "amount": 9.08 },
"operation": { "kind": "order", "id": 123456 },
"price": { "amount": 9.08, "currency": "USD", "icannFee": 0.2, "isPremium": false },
"note": "..."
}
status can be:
| Status | Meaning |
|---|---|
confirmation_required
|
Preview only — nothing charged. Call again with confirm: true. |
cancelled
|
The purchase was not confirmed, so nothing was submitted. |
completed
|
Registered and charged. Includes charged: { amount } and an operation order receipt. |
pending
|
Submitted; the registry is still finishing. Call domains_list shortly to confirm the final state. |
failed
|
The registration did not complete. If a network/timeout error interrupted the request, the note says the outcome is unknown and asks you to verify before retrying — the charge may or may not have gone through, so do not blindly resubmit. |
operation here is { kind: "order", id } — an order receipt, not something to poll. The price is the amount that will be charged, re-fetched at confirmation time for the requested years; if it cannot be determined, priceUnavailableReason appears instead and — on a confirm: true call — the registration still proceeds. When the TLD carries an ICANN fee, price.amount already includes it and price.icannFee states the fee amount so it can be explained.
domain_set_contacts — Set Domain ContactsChanges the contacts assigned to a domain you own. Completes immediately.
| Parameter | Required | Type & constraints |
|---|---|---|
domainName
|
Yes | Fully qualified domain name (ASCII/A-label). |
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 NameserversChanges 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 (ASCII/A-label). |
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_get — Get DNS RecordsRetrieves 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 }. 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 DNS record whose value cannot be represented in the typed contract (an exotic CAA/TLSA/HTTPS/SVCB value) is omitted from items. 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 when a zone contains such records. This is expected, not a paging bug.
dns_records_save — Save DNS RecordsAdds 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": , the count of submitted records. A successful response means all records were accepted; if any record fails, the whole call returns an error instead.
dns_records_delete — Delete DNS RecordsDeletes 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": , the count of submitted records. If any record cannot be matched, the whole call fails and nothing is deleted.
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
|
flag — 0 or 128 (critical bit); tag — issue, 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. |
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 (see that tool). Standard records (A, AAAA, CNAME, MX, TXT, NS, etc.) are unaffected.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.
Need help? We're always here for you.