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, plus minRegisterPeriodInYears and maxRegisterPeriodInYears — the term that TLD allows. Note the price covers price.pricedYears years, which is the TLD's shortest allowed term and is not always 1.domain_register
(preview) — call with confirmationToken unset to get status: confirmation_required, a fresh confirmationToken, and the price that will be charged. Nothing is billed. The tool's response text is a full confirmation — term, price breakdown, auto-renew, WHOIS privacy, payment source, and the registrant/admin/tech/billing contacts — show it to the user as-is. Pick years between minRegisterPeriodInYears and maxRegisterPeriodInYears from step 1 — an out-of-range value is rejected outright. Contacts can be passed inline here, or as { contactId } if you saved them with contacts_save.domain_register
(accept/decline) — after the user agrees, call again with the exact same arguments plus that confirmationToken and confirmationResponse: "accept". 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. To cancel instead, call again with the same confirmationToken and confirmationResponse: "decline" — nothing is billed. If the price can't be determined on either call, the tool returns status: price_unavailable instead and nothing is charged.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 + (token unset: (token + accept: confirm final state
min/maxRegisterPeriod) confirmation, completed/pending)
confirmationToken,
no charge)
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 |
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 and domain_register additionally require a TLD Namecheap supports for registration: a domain whose TLD isn't supported is treated as not available rather than checked or charged. The other domain tools (domains_list, domain_set_contacts, domain_set_nameservers) and the DNS tools normalize the name only and never reject on TLD support.
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 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 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. 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. Use them to pick a valid years for domain_register. 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.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. A domain whose TLD isn't supported for registration is rejected immediately — before any availability check, pricing, or charge.
years must be within the TLD's own allowed period. The 1–10 bound below is the outer limit across all TLDs; each TLD is narrower. .ai allows 2–10, .co and .io allow 1–5, .sg 1–2, .fr exactly 1. A years outside that range is rejected with a validation error naming the allowed range — before any availability check, pricing or charge — and the value is not quietly adjusted for you:
.ai domains cannot be registered for 1 year: this TLD allows 2–10 years. Call domains_check_availability for this domain to see its allowed registration period.
Read minRegisterPeriodInYears/maxRegisterPeriodInYears from domains_check_availability first and pick a years inside it. The same check re-runs on the confirming (confirmationResponse: "accept") call, so it can never be bypassed by confirming.
Two-step pre-charge confirmation. Call first with confirmationToken unset: the tool prices the domain fresh, builds a full confirmation — term, price breakdown (including any ICANN fee and whether the domain is premium), auto-renew, WHOIS privacy, payment source, and the registrant/admin/tech/billing contacts (a contact identical to the registrant is shown as "same as registrant") — and returns status: "confirmation_required" with that price and a fresh confirmationToken. Nothing is registered or billed on this call. The full confirmation is the tool's response text; show it to the user as-is. Once they agree, call again with the exact same arguments plus this confirmationToken and confirmationResponse: "accept" to submit the purchase, or confirmationResponse: "decline" to cancel it — nothing is billed on a decline. The token is bound to these exact arguments and the quoted price and expires after a short time: a missing, expired, tampered, or no-longer-matching token on the confirming call simply returns a brand-new confirmation with a fresh token — never an error, never a charge. If the price cannot be determined on either call, the tool returns status: "price_unavailable" instead of a token and never charges; retry later.
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. Accepts Unicode (IDN) or ASCII (A-label) — normalized to punycode automatically. |
years
|
Yes | Registration period in years. 1–10 is the outer bound; the accepted range is the TLD's own — see minRegisterPeriodInYears/maxRegisterPeriodInYears from domains_check_availability. Out-of-range values are rejected, not adjusted. |
autoRenew
|
Yes | Boolean. When true, the domain renews automatically at expiration using the account's default payment method. Auto-renew is turned on right after the domain is registered and charged, and is reported separately in the result (see below). |
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. |
confirmationToken
|
No | String, up to 4096 chars. Server-issued token returned by a previous domain_register call for these exact arguments. Omit on the first call for a new registration attempt. Expires after a short time and is bound to the exact arguments and price it was issued for — resend it unchanged, together with confirmationResponse, to act on it. |
confirmationResponse
|
Conditional |
"accept" or "decline". Only meaningful together with a valid confirmationToken. "accept" submits the (billed) registration shown in that confirmation; "decline" cancels it without charging. Omit on the first call. |
Returns — after the first call (nothing charged):
{
"domain": "example.com",
"years": 1,
"status": "confirmation_required",
"price": {
"amount": 9.08,
"currency": "USD",
"pricedYears": 1,
"pricePerYear": 9.08,
"icannFee": 0.2,
"isPremium": false
},
"confirmationToken": "v1.eyJ2IjoxLCJwIjoi...aWQiOjF9.9F3q7z_5c8Vb...",
"note": "Nothing has been charged yet. Show the confirmation to the user and, once they agree, call domain_register again with this confirmationToken and confirmationResponse=\"accept\" to complete the purchase, or confirmationResponse=\"decline\" to cancel."
}
Alongside this JSON, the tool's response text is the full confirmation to show the user — it restates the domain, term, and price above, plus lines for Auto-renew: on/off, WHOIS privacy: on/off, Payment source: Namecheap account funds, and each of the registrant/admin/tech/billing contacts (name, email, country — a contact matching the registrant reads "same as registrant"), followed by instructions for the next call. For a multi-year term, price.amount is the total for the whole term and price.pricePerYear is that total divided by the term — e.g. years: 5 on .com returns { "amount": 71.40, "pricedYears": 5, "pricePerYear": 14.28 }, and example.ai with years: 2 returns { "amount": 79.98, "pricedYears": 2, "pricePerYear": 39.99 }.
Returns — after confirmationResponse: "accept" (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",
"pricedYears": 1,
"pricePerYear": 9.08,
"icannFee": 0.2,
"isPremium": false
},
"note": "..."
}
Returns — after confirmationResponse: "decline" (nothing charged):
{
"domain": "example.com",
"years": 1,
"status": "cancelled",
"price": { "amount": 9.08, "currency": "USD", "pricedYears": 1, "pricePerYear": 9.08, "icannFee": 0.2, "isPremium": false },
"note": "Registration of example.com was not submitted because the purchase was not confirmed."
}
Returns — if the price can't be determined, on either call:
{
"domain": "example.com",
"years": 1,
"status": "price_unavailable",
"priceUnavailableReason": "Price is currently unavailable for this domain.",
"note": "Registration of example.com could not be priced right now, so nothing was confirmed or charged. Try again shortly."
}
status can be:
| Status | Meaning |
|---|---|
confirmation_required
|
Preview — nothing charged. Show the response text to the user, then call again with this confirmationToken and confirmationResponse. Also returned, with a new token, when a submitted confirmationToken is missing, expired, tampered, or no longer matches the current arguments/price — never an error. |
cancelled
|
The purchase was declined (confirmationResponse: "decline"), 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. |
price_unavailable
|
The price could not be determined, so no token was issued and nothing was billed. Retry later. |
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 shown at confirmation_required is exactly what will be charged on confirmationResponse: "accept" — price.amount is the total for that whole term and price.pricedYears states the term, so always show the two together. When the TLD carries an ICANN fee, price.amount already includes it and price.icannFee states the fee amount so it can be explained.
Auto-renew reporting: when autoRenew: true is requested, auto-renew is turned on right after the domain is registered and charged, as its own step. A completed registration therefore carries an additive autoRenew: { requested: true, applied }. If that separate call fails, the result still reports status: "completed" with charged set (the domain is registered and paid for) but autoRenew.applied is false, and the note explains that auto-renew did not apply and how to turn it on:
{
"domain": "example.com",
"years": 1,
"status": "completed",
"charged": { "amount": 9.08 },
"operation": { "kind": "order", "id": 123456 },
"autoRenew": { "requested": true, "applied": false },
"price": { "amount": 9.08, "currency": "USD", "pricedYears": 1, "pricePerYear": 9.08, "icannFee": 0.2, "isPremium": false },
"note": "example.com was registered successfully. Auto-renew was requested but could not be turned on after the charge — the domain is registered and the charge has completed. Enable auto-renew again, or check its current state via domains_list."
}
autoRenew is omitted entirely when it wasn't requested (autoRenew: false on the call).
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. 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 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. 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.
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 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 }, 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 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": <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 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": <number> }, 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 and listed in its omittedRecords (see that tool). Standard records (A, AAAA, CNAME, MX, TXT, NS, etc.) are unaffected.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.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.