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:
- Open-source MCP (github.com/Sambel/catchdoms-mcp) — free, public, wraps the CatchDoms API. Add it to Claude Desktop / Cursor / Claude Code in seconds.
- 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/mcppackage, 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_domainstool routes through the sameDomainQueryServicethat 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_domainscalls 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 exposedget_domainfor the deep dive. - Idempotent enrichment at scale: writing the same domain from three sources without overwriting freshly-computed SEO metrics required a careful
upsertstrategy 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_domainstool that takes 2–5 candidate names and outputs a structured trade-off table directly in the LLM context.
Try it
- Open-source MCP: https://github.com/Sambel/catchdoms-mcp
- Hosted endpoint: https://catchdoms.com/mcp
Built With
- claude
- cloudflare
- laravel

Log in or sign up for Devpost to join the conversation.