This MCP server exposes 12 domain-management tools with STDIO transport (hard cap 50). Tool definitions are present but exhibit multiple quality gaps: parameter naming uses abbreviated aliases (cfn, cln, cem, cadd, cct, cst, cpc, ccn) instead of clear full names; descriptions are adequate but lack LLM-optimized guidance on prerequisites and error recovery; schemas lack enum constraints and format specifications; error handling is absent (no guidance on retries, user-fixable errors, or recovery steps); output schemas are partially documented inline but not formalized; no tool annotations (readOnlyHint, destructiveHint, idempotentHint). The tools themselves cover a coherent domain (search, purchase, manage domains), but the presentation and naming conventions create friction for LLM planning and introduce potential mismatches between tool outputs and downstream tool inputs.
Links an email address to an AI agent's account for web interface access and account recovery. Important notes: - Only accounts without an existing email can be linked - Each email can only be linked to one account - This method is rarely needed since emails are also set during domain registration
Create a new DNS record for a domain.
Delete a DNS record for a domain.
Get DNS records for a domain. Each DNS record contains: id (str): Unique record identifier type (str): DNS record type (e.g. 'A', 'CNAME', 'MX', 'TXT') name (str): DNS record name value (str): DNS record value ttl (int): Time to live in seconds
List domains owned by the authenticated user. Each domain object contains: id (str): Unique domain identifier (domain_id in other methods) domain_name (str): The registered domain name created_at (str): ISO timestamp of domain creation expires_at (str): ISO timestamp of domain expiration auto_renew (bool): Whether domain is set to auto-renew locked (bool): Domain transfer lock status private (bool): WHOIS privacy protection status nameservers (list): List of nameserver hostnames status (str): Domain status (e.g. 'active')
Parameter naming uses abbreviated aliases (cfn, cln, cem, cadd, cct, cst, cpc, ccn) instead of full, self-documenting names. Violates naming clarity principle and forces LLMs to map aliases, increasing error risk.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). LLM cannot determine which tools are safe to retry, which mutate state, or which have side effects. Critical for safe agent planning.
No error handling guidance. Tools lack recovery instructions (e.g., 'User not found, try search_users() first'). LLM receives raw API errors with no actionable next steps.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 52 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 55 | - | v1 |
Retrieve the currently configured contact information that will be used for domain purchases and ICANN registration.
Request available payment options for a domain. This method returns an L402 offer, which includes details such as offer_id, amount, currency, and more. The returned offer can be processed by any tool supporting L402 offers. The TLD .ai mandates a minimum registration and renewal period of two years. So inform the user that they need to purchase a 2 year package when they request a .ai domain. The L402 offer structure: { 'offers': [ { 'offer_id': 'example_offer_id', # String identifier for the offer 'amount': 100, # Numeric cost value in USD cents 'currency': 'usd', # Currency code 'description': 'Example offer', # Text description 'title': 'Example Package' # Title of the package } ], 'payment_context_token': 'example_token', # Payment context token 'payment_request_url': 'https://api.example.com/payment-request', # Payment URL 'version': '0.2.2' # API version }
Request X402 payment requirements for a domain purchase using USDC on Base. Returns a 402 response with X402 PaymentRequired schema containing payment details. The X402 payment structure: { 'x402Version': 1, 'accepts': [ { 'scheme': 'exact', 'network': 'base', 'asset': '0x...', # USDC contract address 'payTo': '0x...', # Recipient address 'amount': '...', # Amount in smallest unit ... } ], 'resource': 'https://...' } Use the returned payment requirements to build a PAYMENT-SIGNATURE (e.g. via the x402 Python library), then call purchase_x402 to complete.
Complete an X402 domain purchase with a pre-built payment signature. Call get_x402_purchase_offers first to get the payment requirements, then build the PAYMENT-SIGNATURE externally and pass it here.
Search for available domains matching the query. Returns search results with available/unavailable domains, their prices in USD cents, and a search ID needed for purchase requests. The query can be a full domain name with or without the TLD but not subdomains or text. Valid queries: - "example" - "example.com" - "my-domain" Invalid queries: - "www.example.com" # no subdomains - "this is a search" # no spaces - "sub.domain.com" # no subdomains
Set the contact information that will be used for domain purchases and ICANN registration. Contact information must be set before attempting any domain purchases. All fields are required: first_name: First name last_name: Last name email: Email address address: Street address city: City state: Two-letter state code for US/Canada (e.g., 'CA', 'NY') or province name (e.g., 'Madrid') postal_code: Postal code country: Two-letter country code ('US', 'ES', 'FR')
Update an existing DNS record for a domain. NOTE: Updating a record will change its record id.
Parameter constraints missing. No enums for 'type' (A, AAAA, CNAME, MX, TXT), no regex patterns for email/domain, no min/max for numeric fields. LLM can pass invalid values like type='UNKNOWN' or ttl=-1.
Output schemas not formalized. Inline documentation of response structures in descriptions instead of explicit output schema declarations. LLM cannot programmatically parse expected fields.
No pagination support. Tools like 'domains' and 'dns_records' lack limit/offset/page_size parameters. A user with 100 domains risks context explosion from a single call.
Destructive operation (delete_dns) has no confirmation or dry-run pattern. Irreversible action can be triggered without user confirmation.
Default parameter values are placeholder strings ('test', 'test-1', 'test-2') instead of sensible defaults or required fields. LLM may omit parameters expecting safe defaults, creating invalid DNS records.
Tool output does not guarantee downstream tool input compatibility. E.g., 'search' returns results with 'search_id' but no guarantee that 'get_purchase_offers' accepts this exact field name without translation.
Abbreviated parameter names force LLM to reason about field mappings. 'cfn' is not self-evident; full names like 'contact_first_name' are self-documenting and reduce LLM errors.