MCP server for Bloomfilter domain registration API — Service that lets AI Agents search, register, and configure domains
This server demonstrates solid definition quality with consistent naming patterns, comprehensive parameter descriptions, and well-structured schemas across all 10 tools. All tools follow verb-noun naming conventions (search_, get_, list_, add_, update_, delete_, register_, renew_). Tool descriptions are clear and action-oriented, ranging from 80-180 characters. Input schemas are visible and properly typed using Zod with min/max constraints on numeric parameters. However, OUTPUT schemas are not documented, the code shows tool registration but no explicit return type documentation. Error handling descriptions are minimal (no recovery guidance or error classification). Tool annotations (readOnlyHint, destructiveHint, idempotentHint) are completely absent despite a 10-tool mix of read-only, write, and destructive operations. The DNS operation descriptions include important sequential/timing constraints ("add DNS records one at a time", "wait at least 30 seconds"), which is excellent for agent guidance, but these are buried in descriptions rather than surfaced as tool annotations or dedicated constraints. Parameter descriptions are consistently good (70-90 chars average), and all parameters have proper types and constraints. Risk classification is present in the tool metadata but not reflected in tool annotations. This is a well-executed baseline with no critical gaps, but falls short of A-grade because output schemas are undocumented and tool annotations are missing.
Add a DNS record to a domain you own. Costs $0.10 USDC per record. IMPORTANT: Always add DNS records one at a time (sequentially, not in parallel). After registering a new domain, wait at least 30 seconds before adding DNS records.
Delete a DNS record from a domain you own. Costs $0.10 USDC. IMPORTANT: Always delete DNS records one at a time (sequentially, not in parallel).
Get account information — wallet address, domain count, total spent.
Get detailed information about a registered domain (status, expiry, nameservers, etc.).
Get domain registration, renewal, and transfer pricing. Omit tld for all TLDs, or specify one.
List all DNS records for a domain you own.
Output schemas not documented. Tools register successfully but no explicit return type or field documentation is visible in the codebase. LLMs cannot plan downstream operations or extract required fields (domain_id, record_id) without knowing the response structure.
Tool annotations completely absent. No readOnlyHint on read-only tools (search_domains, get_pricing, get_domain_info, list_dns_records, get_account), no destructiveHint on delete_dns_record, no idempotentHint on operations that should be retryable. This forces LLMs to infer safety/retry semantics from descriptions alone.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-21 | C | 64 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 13 | - | v1 |
Register a new domain name. Requires USDC payment via x402. Handles async provisioning automatically.
Renew an existing domain registration. Requires USDC payment via x402.
Search for available domain names. Returns availability and pricing for each TLD.
Update an existing DNS record. Costs $0.10 USDC. Use list_dns_records to find the record_id. IMPORTANT: Always update DNS records one at a time (sequentially, not in parallel).
Error handling and recovery guidance missing. Tool descriptions mention failures (e.g., 'x402 payment required') but do not provide actionable recovery steps. No error classification (retryable vs user-fixable vs fatal). Example: if register_domain fails due to insufficient balance, the description should suggest 'Check account balance with get_account() before retrying.'
get_account description is vague ('Get account information, wallet address, domain count, total spent'). Missing field-level clarity on what 'total spent' includes (only registrations? DNS ops too?) and whether it's USDC or fiat. This forces LLMs to guess or make unnecessary calls.
Sequential operation constraints buried in descriptions. add_dns_record, update_dns_record, and delete_dns_record all include critical notes about sequential execution and timing ('wait at least 30 seconds'). These are better expressed as tool-level constraints or a dedicated concurrency hint, not buried in prose descriptions that agents may miss or misinterpret.
Missing confirmation/dry-run pattern for destructive operations. delete_dns_record and register_domain (irreversible) have no mention of a dry-run or confirmation step. Best practice would be to offer a 'confirm' parameter or separate confirm_delete_dns_record tool to prevent accidental destruction.
Pricing tools lack pagination or result limits. get_pricing with no tld parameter may return hundreds of TLD records. No pagination (limit, offset) or guidance on response size is provided. If an LLM requests all pricing, it could blow the context window.
Private key credential exposed as environment variable without documentation of security best practices. While the code correctly does NOT expose the key as a tool parameter (correct), the server documentation should include guidance on rotating credentials, using HashiCorp Vault, or AWS Secrets Manager, not raw env vars.