Inspiration

Domain hunters live in five tools at once: ExpiredDomains.net for the list, Ahrefs / SEObserver for backlinks, Wayback Machine for the history, the registrar UI to actually bid. Every search means copy-pasting domains between tabs.

I built CatchDoms to consolidate all of that into one database — 100k+ domains from 17 marketplaces enriched with Trust Flow, Citation Flow, backlinks, referring domains, age, language, and even the historical tech stack (WordPress, Shopify, etc.) detected from Wayback HTML.

Then MCP landed and it clicked: this database should be queryable in natural language from Claude. Domain investors don't want to learn a filter UI - they want to say "find me .fr expired domains with 10+ Trust Flow that ran on WordPress, ending in the next 24 hours" and get an answer.

What it does

The CatchDoms MCP server exposes our full expired-domain database as native tools any MCP-compatible AI assistant can call:

  • search_domains — filter by source, TLD, score, Trust Flow, backlinks, age, language, tech stack, keywords. 30+ filters, all composable.
  • get_domain — fetch the full profile of a single domain (Wayback history, SEO metrics, screenshots, GMB listing, score breakdown).
  • list_filters — discover available TLDs, sources, languages, tech stacks with live counts.
  • get_stats — platform-wide statistics.

Two ways to plug in:

  1. Open-source MCP (github.com/Sambel/catchdoms-mcp) — free, public, wraps the CatchDoms API. Add it to Claude Desktop / Cursor / Claude Code in seconds.
  2. Hosted SSE endpoint at /mcp/catchdoms — bearer-token auth for power users on the paid tier, with higher rate limits and Pro-only fields.

Either way: drop it into your AI assistant and it can prospect domains, compare candidates, and surface SEO outliers without leaving the chat.

How we built it

  • Backend: Laravel 12 + the laravel/mcp package, exposing a single HTTP+SSE endpoint at /mcp/catchdoms.
  • Open-source client: a TypeScript MCP server published as a stand-alone repo, so any user can self-install without paying — it talks to the public REST API under the hood.
  • Query layer: the MCP search_domains tool routes through the same DomainQueryService that powers our web UI, so any filter the website supports works in the MCP — no parity drift.
  • Infra: MySQL for the catalog, Redis for queues (Horizon) and cache, Laravel Cloud for hosting, Webshare rotating proxy to scale Wayback calls past per-IP rate limits.

Challenges we ran into

  • Auth through the bridge: Claude Desktop talks to remote MCP servers via npx mcp-remote, which can't solve Cloudflare's Managed Challenge. We had to carve out a WAF skip rule for /mcp/* so the bridge could pass Bearer tokens cleanly.
  • Tool surface design: our web UI has 30+ filters. LLMs use small, well-named tool surfaces better than huge ones. We collapsed everything into four tools with descriptive parameter schemas — the model picks the right combination in natural language without us shipping a tool per filter.
  • Streaming a 1MB JSON response: initial search_domains calls returned the full domain payload (Wayback dates, screenshot URLs, all metrics) and choked context windows. We trimmed the default response to a summary view and exposed get_domain for the deep dive.
  • Idempotent enrichment at scale: writing the same domain from three sources without overwriting freshly-computed SEO metrics required a careful upsert strategy on the column list.

What's next

  • A second MCP tool surface scoped to brandable domains (different criteria: pronounceability, length, keyword class — SEO-irrelevant).
  • Inbound webhooks: subscribe an AI agent to "any new .com with TF ≥ 30 ending today" and have it ping back.
  • A compare_domains tool that takes 2–5 candidate names and outputs a structured trade-off table directly in the LLM context.

Try it

Built With

Share this project:

Updates