Onymu
Onymu is an MCP server for domain name search, domain availability checking, and social media username lookup.
What it can do
- Search Domains: Check whether names are available, across many extensions at once. This is the main tool: availability is read from a registry-derived list of every registered domain, refreshed daily,
- Check Usernames: Check whether a username is free on X, Instagram, Facebook, YouTube, TikTok, Snapchat, Pinterest, LinkedIn, Discord, GitHub, Telegram and Twitch, and how many apps already carry the n
- Generate Domains: Turn a keyword into brandable name candidates that are free to register. Generation is deterministic — no model is involved, so the same keyword always produces the same candidates —
What data it sees
Do you need an account
No: the server works without sign-in
Onymu is an MCP server for domain name search, domain availability checking, and social media username lookup. Check a domain name against hundreds of TLDs in one call, including .com, .io, .ai, .co, and country-code extensions. Generate brandable startup names, business names, and product names from a keyword, and instantly see which ones are still available to register. Check username availability across major social networks so a brand name comes with matching handles. Save domains, set favorite TLDs, and recall recent searches to keep name research organized across sessions.
Server tool list (13)
Raw names from tools/list. Only developers need these.
| search_domains | Check whether names are available, across many extensions at once. This is the main tool: availability is read from a registry-derived list of every registered domain, refreshed daily, so one call covers every extension you ask about and answers in milliseconds. Omit `tlds` to use the caller's favorite extensions, or the most popular ones if they have none. Names x extensions must not exceed 5,000 in one call — 25 names, for instance, admits at most 200 extensions. Results are split into available and taken, plus an `unknown` list for extensions the data does not cover - never report those as available. |
| check_usernames | Check whether a username is free on X, Instagram, Facebook, YouTube, TikTok, Snapchat, Pinterest, LinkedIn, Discord, GitHub, Telegram and Twitch, and how many apps already carry the name on the App Store and Google Play. Pair it with search_domains when someone is picking a brand name: a name is only really available if the domain AND the handles are. Handle answers are grouped into taken, available, unknown and invalid. `unknown` means the check could not be completed (the platform blocked it, or timed out) and must NEVER be reported as available. `invalid` means that platform's own username rules reject the string, so it cannot be claimed there at all. Two platforms answer a narrower question than their name suggests: `linkedin` checks the company vanity URL (linkedin.com/company/<name>), not a personal /in/ profile, and `facebook` can only ever report taken or unknown — its logged-out surface cannot tell a free handle from a private one, so it never reports available and its absence from the taken list is not evidence the name is free. The two app stores are reported separately under `appStores`, NOT as handles: neither store has a username namespace, so they answer how many listings are already named this. Read `named` for 'apps called this' and `matched` for 'apps with this word in the title'; `scanned` is the denominator and `truncated: true` means the counts are floors. Omit `platforms` to check all fourteen. Checking several names at once skips X, which bans on volume. |
| generate_domains | Turn a keyword into brandable name candidates that are free to register. Generation is deterministic — no model is involved, so the same keyword always produces the same candidates — and it keeps drawing until it has `count` names free under at least one of the extensions checked, so what comes back is registrable, not merely plausible. Names blend in the keyword's synonyms by default and can blend in antonyms too; `realWords` keeps only dictionary words, `maxWords` caps how many words a name may be made of. Pass anything promising to search_domains for a wider sweep of extensions. |
| lookup_domain | Look up who holds a specific domain and when it expires, live from the registry. Asks RDAP first, falls back to port-43 WHOIS for the ~240 TLDs that have no RDAP server (including .de, .io, .co, .eu, .ch, .at, .be, .dk, .jp and .cn), and only then to a DNS heuristic. Returns the registrar, the creation/update/expiry dates, the EPP status codes and the nameservers, plus the `method` that produced the answer so a heuristic is never mistaken for a registry's statement. Use this for ONE name someone is serious about — checking whether a taken name is about to expire, who holds it, or whether it is in redemption. Use search_domains instead to check availability across many names or TLDs: it is instant and this one is a live network call per domain. A `redemptionPeriod` or `pendingDelete` status is the interesting case, meaning a taken name is on its way to becoming free. Status `unknown` means the lookup could not be completed and must NEVER be reported as available. |
| lookup_dns_records | Read what a domain's DNS zone actually publishes: A, AAAA, CNAME, MX, NS, TXT, SOA and CAA records, each with its TTL. Live from a public resolver. This answers a different question from lookup_domain — that one asks a registry whether a name is registered, this one asks a resolver what it is configured to do — and neither implies the other: a registered domain can publish no zone at all, and the two disagree while a change propagates. Use it to see where a name is hosted, whether mail is configured (MX), what a site's verification and SPF/DKIM records say (TXT), or which nameservers a domain is delegated to. IMPORTANT: an empty list for a record type means the zone publishes none of that type, but a record type carrying a `reason` means that particular query FAILED — do not report the second as an absence. Status `missing` means the resolver returned NXDOMAIN; `unknown` means the lookup could not be completed and is not evidence either way. |
| list_favorite_tlds | Read the extensions saved on the caller's account, in the order they saved them. Empty either because they saved none or because they keep the list in their browser only. Call this before search_domains to scope a check to the extensions this person would actually register. |
| add_favorite_tld | Save one extension to the caller's favorites. The leading dot is optional. Fails if it is already saved, or if the account is at its cap. |
| remove_favorite_tld | Drop one extension from the caller's favorites. |
| list_saved_domains | Read the caller's shortlist of saved names, newest first. This is where anything worth keeping goes. |
| save_domain | Add a name to the caller's shortlist. Accepts a full domain or a bare label — the site saves bare labels when a name is being compared across several extensions. |
| remove_saved_domain | Drop one name from the caller's shortlist. |
| get_recent_searches | Read what the caller has searched for lately, newest first. Use it to avoid re-suggesting something they have already looked at. |
| get_recent_generations | Read the words the caller has recently generated names from, newest first. |