Skip to main content
The Bizzy MCP server provides 27 tools for managing domains and their associated registration data. These tools are organized into four categories: domains (including sending subdomains, availability search, registration purchase, verification, and renewal), domain contacts, domain registrations, and DNS records.
Domain Contacts on this page are the registrant, admin, and tech contacts attached to a domain registration (WHOIS data). They are distinct from CRM Contacts (people in your address book) — see Contact Tools for those.

Domains

Tools for managing domain records used for DNS and email.

searchDomainAvailability

Check whether one or more domains are available to register, with pricing. Provide a fully-qualified domain, or a query label paired with one or more tlds. This is read-only — it does not register a domain or charge anything. Permission: domains:read Parameters: *Provide domain, or query (with optional tlds). A single call checks at most 25 names (query × tlds counts one name per TLD); larger fan-outs are rejected. Returns: An array of results, one per requested name. Each entry has a status:
  • ok — the name was checked. Includes available, premium, and prices (integer cents USD with the standard markup applied, or null when no price is available). available means the name can be registered right now, not merely that it is unclaimed: while premium registrations are not offered, an unclaimed but premium-priced name is reported as available: false with premium: true and no prices, because registration would be refused. An available name is one registration will accept.
  • rate_limited — the name could not be checked right now because the registrar rate limit was hit. The name was neither confirmed available nor taken — retry it shortly (retryAfterMs, when present, hints how long to wait) and do not treat it as registered. The rest of the batch is still returned, so retry only the affected names.
  • unsupported_tld — that ending is not offered for registration through Bizzy, so the name was not checked and cannot be registered here regardless of its availability elsewhere. Suggest a name on an offered ending instead (.com, .co, .io, and the other endings domain search returns).

registerDomain

Purchase and register a domain for the organization. This is the real registration action — the same flow as POST /v1/domain-registrations in the REST API: it fetches a live quote, confirms availability with the registrar, charges the account default payment method off-session, and queues domain provisioning.
This tool charges real money and a completed registration cannot be undone. Nothing is charged if the live quote exceeds maxAmountCents. In Bizzy agent chat, a human must approve each call before any charge. The MCP server has no approval flow, so this tool is only callable over MCP when the agent’s domain-registrations.purchase write permission is explicitly set to Allow — at the default Ask level it is not exposed to MCP clients at all. The purchase sub-resource is scoped to this tool alone: allowing other domain-registration tools does not enable it, and the grant must be explicit — it is never inherited from a broader domain-registrations permission.
Permission: domain-registrations.purchase:write (default level Ask — approval-gated in agent chat; over MCP, callable only at Allow) Parameters: Returns: The queued provisioning operation:
Typed failures include DOMAIN_AGREEMENTS_REQUIRED (a business owner or admin hasn’t accepted the current domain agreements; nothing is charged, and the error’s acceptanceUrl is the page in Bizzy where they complete that — the tool can’t accept on their behalf), DOMAIN_UNAVAILABLE, PREMIUM_DOMAIN_NOT_SUPPORTED (premium-priced names can’t currently be registered), PRICE_EXCEEDS_MAXIMUM, REGISTRATION_PERIOD_UNSUPPORTED, CONTACT_ORGANIZATION_REQUIRED, PAYMENT_METHOD_REQUIRED, and PAYMENT_FAILED. If provisioning cannot be queued after a successful charge, the charge is automatically refunded (DOMAIN_REGISTRATION_ENQUEUE_FAILED) — retry with a new idempotencyKey.

verifyDomain

Start or check TXT ownership verification for an externally owned domain — the same flow as POST /v1/domains/{id}/verification and POST /v1/domains/{id}/verification/check in the REST API. If verification has not started (or previously failed or expired), a new verification token is issued, hourly background checking begins, and the TXT record to publish is returned. If verification is already pending, one live DNS check runs immediately instead. The tool is idempotent: a pending, unexpired token is never rotated and no duplicate background checking is started, so it is safe to call repeatedly to poll status. Permission: domains:write (default level Ask — approval-gated in agent chat; over MCP, callable only when the agent’s domains write permission resolves to Allow) Parameters: Returns: The verification state plus the TXT record to publish:
status is verified, pending, or failed; initiated is true only when this call issued a fresh token (publish recordName/expectedValue as a DNS TXT record at the domain’s DNS host). Verification expires after 7 days — calling the tool again after expiry issues a new token.

getDomainRenewalPrice

Preview the live renewal price for a registered domain, without charging anything — the same quote as GET /v1/domains/{id}/registration/renewal-price in the REST API, and the exact amount renewDomain will enforce its maxAmountCents ceiling against. This is read-only. Permission: domains:read Parameters: Returns: The live renewal quote in integer USD cents (standard markup applied):
Fails with DOMAIN_NOT_REGISTERED for verified-only domains, MANUAL_RENEWAL_NOT_SUPPORTED for domains that renew only automatically (they extend one year at a time while auto-renew is on, with no manual renewal), and DOMAIN_PRICE_UNAVAILABLE when the registrar cannot return a live price.

renewDomain

Renew a registered domain for the organization. This is the real renewal action — the same flow as POST /v1/domains/{id}/registration/renew in the REST API: it checks the live price against your ceiling, queues a renewal operation, and the renewal workflow charges the account default payment method off-session, renews the domain at the registrar, and extends the expiration date.
This tool charges real money. Nothing is charged if the live price exceeds maxAmountCents; if the registrar renewal fails after the charge, the charge is automatically refunded. In Bizzy agent chat, a human must approve each call before any charge. The MCP server has no approval flow, so this tool is only callable over MCP when the agent’s domain-registrations.renewal write permission is explicitly set to Allow — at the default Ask level it is not exposed to MCP clients at all. The renewal sub-resource is scoped to this tool alone: allowing other domain-registration tools does not enable it, and the grant must be explicit — it is never inherited from a broader domain-registrations permission.
Permission: domain-registrations.renewal:write (default level Ask — approval-gated in agent chat; over MCP, callable only at Allow) Parameters: Returns: The queued renewal operation, with the pre-flight quote (amountCents is null when the call replayed an existing operation):
Typed failures include DOMAIN_NOT_REGISTERED, MANUAL_RENEWAL_NOT_SUPPORTED (the domain renews only automatically — one year at a time while auto-renew is on — and cannot be renewed manually; nothing is charged), DOMAIN_AGREEMENTS_REQUIRED (a business owner or admin must accept the current domain agreements first; nothing is enqueued, and the error’s acceptanceUrl is where they do it), PRICE_EXCEEDS_MAXIMUM, REGISTERED_DOMAIN_TRANSFER_IN_FLIGHT (a transfer to another registrar is under way; nothing is charged), and DOMAIN_RENEWAL_ENQUEUE_FAILED (nothing was charged — retry with a new idempotencyKey).

createDomain

Create a new domain record for DNS and email management. Permission: domains:write Parameters: The domain starts as pending. Verification, email setup, and registration details are set as the domain goes through verifyDomain and email setup — you can’t pass them here. A name is always created as an apex domain, whatever its label count. A name under a domain you already have is refused: DOMAIN_PARENT_EXISTS when it sits one label under that domain (add it with createSubdomain instead), DOMAIN_NESTING_UNSUPPORTED otherwise. A name you already have returns DOMAIN_ALREADY_EXISTS. Returns: The created domain object.

getDomain

Get a specific domain by ID. Permission: domains:read Parameters: Returns: Domain object, or null if not found.

listDomains

List your apex domains with pagination. Subdomains aren’t included; list them with listSubdomains. Permission: domains:read Parameters: Returns:

updateDomain

Update an existing domain record. Permission: domains:write Parameters: The name is the only field you can change. Status, verification, email setup, and registration details change only through their own tools and flows. Returns: The updated domain object.

deleteDomain

Delete a domain. Remove its subdomains first; a DOMAIN_SUBDOMAINS_EXIST refusal names the subdomains to remove. Verified domains without subdomains can be deleted at any time. Their DNS records at the external DNS host remain. A domain moved to another registrar keeps its DNS zone in Bizzy and can be deleted once that zone holds only its built-in apex NS and SOA records; otherwise the refusal is REGISTERED_DOMAIN_DNS_NOT_EMPTY. For registered domains, wait until the registration expires, then remove the remaining DNS records, email records included. Only the zone’s built-in apex NS and SOA records can remain. A queued or running renewal, or a transfer already under way, also blocks deletion. These refusals return REGISTERED_DOMAIN_NOT_EXPIRED, REGISTERED_DOMAIN_RENEWAL_IN_FLIGHT, REGISTERED_DOMAIN_TRANSFER_IN_FLIGHT, or REGISTERED_DOMAIN_DNS_NOT_EMPTY; the last names the blocking records. Deleting an email-enabled domain also removes its sending configuration. If that cleanup fails, deletion still succeeds. Permission: domains:delete Parameters: Returns: The deleted domain object.

createSubdomain

Add a sending subdomain, such as mail.example.com, under a verified domain. The subdomain shares its parent’s verification, so there’s no TXT record to publish and it’s active at once. Creating it doesn’t enable email. Permission: domains:write Parameters: Refusals return NOT_FOUND (no such parent), DOMAIN_NOT_APEX (the parent is itself a subdomain), DOMAIN_NOT_VERIFIED (verify the parent first), REGISTERED_DOMAIN_TRANSFER_IN_FLIGHT (the parent is being transferred away), SUBDOMAIN_NOT_UNDER_PARENT (the name isn’t exactly one label under the parent), or DOMAIN_ALREADY_EXISTS. Returns: The created subdomain, with kind: "subdomain" and parentDomainId set.

listSubdomains

List a domain’s sending subdomains with pagination. Permission: domains:read Parameters: Returns:

deleteSubdomain

Delete a sending subdomain. Deleting an email-enabled subdomain also removes its sending configuration. If that cleanup fails, deletion still succeeds. Permission: domains:delete Parameters: Returns: The deleted subdomain object.

Domain Contacts

Tools for managing the registration contacts used as the registrant on domains registered through Bizzy. These are WHOIS-style contacts held at the domain registrar — not CRM contacts. Contacts are organization-wide: the same contact can be the registrant for any number of domains. Writes go through to the registrar, so what these tools change is also what appears in the public WHOIS record.
externalId and accountId identify the contact at the registrar and are assigned when it is created. They are returned on the contact object and cannot be supplied or changed by a caller.
When one of these tools refuses a request, it comes back the way every MCP tool result does — as a text block describing what happened, not a status code or an error object. The refusal messages are quoted below so you know what to look for.

createDomainContact

Create a registration contact at the domain registrar and store it. Usable as the registrant when registering a domain. Permission: domain-contacts:write Parameters: The address fields are required even though they are nullable on the stored record: the registry rejects an incomplete registrant. Returns: The created domain contact object, carrying the registrar-assigned externalId and accountId.

getDomainContact

Get a specific domain contact by ID. Permission: domain-contacts:read Parameters: Returns: Domain contact object, or null if not found.

listDomainContacts

List all domain contacts for the organization with pagination. Permission: domain-contacts:read Parameters: Returns:

updateDomainContact

Update a registration contact at the domain registrar and in Bizzy. Permission: domain-contacts:write
Changing firstName, lastName, organizationName, or email restarts ICANN’s registrant email verification on every domain using this contact as its registrant. Address and phone changes do not. While any of those domains is being transferred to another registrar, those four fields are refused with REGISTERED_DOMAIN_TRANSFER_IN_FLIGHT. See Registration Contacts.
Parameters: A label-only change is local and never reaches the registrar, so it is allowed even on a contact whose registration details are fixed. Some contacts cannot have their registration details changed after registration. Attempting it fails with the text Error: This operation (registrant contact updates) is not available — create a new contact instead. Returns: The updated domain contact object.

deleteDomainContact

Remove a registration contact from Bizzy and from the domain registrar. Permission: domain-contacts:delete Parameters: Refused while the contact is still the registrant of a live domain. The call fails with the text Error: This contact is the registrant for example.com and cannot be removed, naming every domain that is using it. Point those domains at a different registrant first. Returns: The deleted domain contact object.

Domain Registrations

Tools for managing domain registration records that track ownership, renewal, and registrar metadata.

createDomainRegistration

Create a new domain registration record to track domain ownership and renewal. Permission: domain-registrations:write Parameters: Returns: The created domain registration object.

getDomainRegistration

Get a specific domain registration by ID. Permission: domain-registrations:read Parameters: Returns: Domain registration object, or null if not found.

listDomainRegistrations

List all domain registrations for the organization with pagination. Permission: domain-registrations:read Parameters: Returns:

updateDomainRegistration

Update an existing domain registration record - all fields are optional except registrationId. A registration whose domain moved to another registrar has the state transferred_out and can’t be changed. Permission: domain-registrations:write Parameters: Returns: The updated domain registration object.

deleteDomainRegistration

Delete a domain registration (soft delete). Permission: domain-registrations:delete Parameters: Returns: The deleted domain registration object.

Domain DNS Records

Tools for managing DNS records, available for domains whose DNS is hosted in Bizzy — every domain registered through Bizzy qualifies. No setup is needed: the domain’s DNS zone is created automatically the first time a record is added.

listDnsRecords

List the DNS records for a domain whose DNS is hosted in Bizzy. Returns an empty list if the domain has no DNS zone yet. Permission: domains:read Parameters: Returns:

createDnsRecord

Create a DNS record for a domain whose DNS is hosted in Bizzy. Permission: domains:write Parameters:
A DNS record’s content must match its type. The tool refuses a mismatch.content is limited to 2048 characters for every record type — long enough for a DKIM key. MX and SRV records also require priority.
Returns: The created DNS record object.

updateDnsRecord

Update a DNS record. This is a full replacement — provide all record fields. Permission: domains:write Parameters:
A DNS record’s content must match its type. The tool refuses a mismatch.content is limited to 2048 characters for every record type — long enough for a DKIM key. MX and SRV records also require priority.
Returns: The updated DNS record object.

deleteDnsRecord

Delete a DNS record from a domain whose DNS is hosted in Bizzy. Permission: domains:write Parameters: Returns: { "success": true, "recordId": "..." }

Next Steps

Contact Tools

Manage CRM contacts, distinct from the WHOIS-style domain contacts above

Authentication

Learn how MCP clients authenticate to the server
Last modified on September 27, 2026