whois-mcp-server
Provides DNS-over-HTTPS resolution using Cloudflare's 1.1.1.1 service, and supports Cloudflare KV/R2/D1 as storage backends for session and auth state.
Provides DNS-over-HTTPS resolution using Google's 8.8.8.8 service, primarily for CAA records where Cloudflare returns raw hex.
Integrates with OpenTelemetry for structured logging and tracing.
Supports Supabase as a storage backend for persisting bootstrap cache and other state.
This server does not currently have a deployable release on Glama. Follow the repository's setup instructions to install and configure it for your MCP client, including any required credentials and local dependencies.
Overview
Domain and network intelligence via RDAP and DNS-over-HTTPS. Look up domain registrations, check registry record status, fetch DNS records, and resolve IPs and ASNs to their registries. No API key required.
Tools
Tool | Description |
| Full domain registration record — registrar, created/expiry dates, nameservers, EPP status, DNSSEC, registrant org |
| Check registry record presence; missing records do not establish registration eligibility |
| DNS owner records, including service discovery, DNSSEC, DANE, and HTTPS service parameters |
| IP or CIDR netblock, org, country, abuse contact, registration dates, and reverse DNS via RIR RDAP |
| Resolve an ASN to its organization, abuse contact, registration dates, country, and RIR source |
| One-call domain triage — registration + DNS in parallel, normalized into a single record with factual signals |
The whois-guide covers hostname investigations and tracing DNS addresses to registry allocations and observed origin ASNs. It ships with the plugin and is available to MCP clients as skill://whois-guide/SKILL.md.
Related MCP server: domain-checker
Capability reference
whois_lookup_domain tool
Takes a Unicode or ASCII fully qualified domain name. Returns the ASCII
domainand, for an IDN,unicode_domainas decoded display text.Returns registrar, dates, nameservers, EPP status, DNSSEC, and
registrant_redacted; DNSSEC and privacy staynullwhen the registry gives no evidence. Fails withrdap_no_coverage,domain_not_found, orrdap_invalid_domain_response(the response doesn't match the queried domain).An exact registry miss can name a registrable parent to query next. Missing RDAP coverage points to DNS evidence, which cannot establish registration status.
include_registrar: truefollows one registrar RDAP referral and addsregistrar_detail(found,no_referral, orfailed, plus source URL). Off by default; limited byRDAP_TIMEOUT_MS, and a failure keeps the registry result.
whois_check_availability tool
Takes a Unicode or ASCII fully qualified domain name and returns its ASCII form with optional decoded
unicode_domain.Returns
registration_status: registered | not_found | unknown.availableisfalsefor a found registration andnullotherwise, nevertrue: a 404 means no record, not that the name can be registered.Known ICANN subdomains return
non_registrable_domainwith their registrable parent.
whois_get_dns tool
Takes a Unicode or ASCII DNS name, including underscore owners and one terminal root dot. The ASCII lookup name is limited to 253 characters with 1–63-character labels; IDNs also return decoded
unicode_domain.Optional
types: A, AAAA, MX, TXT, NS, CNAME, SOA, CAA, PTR, SRV, DS, DNSKEY, TLSA, HTTPS; defaults to A, AAAA, MX, TXT, NS. Record data retains the resolver's literal presentation.Returns records with TTLs and
query_sources: [{type, source}], including empty answers and NXDOMAIN. Legacysourceiscloudflareif any query got a successful Cloudflare response, otherwisenextdns.Resolver failure codes and truncated responses return errors after retries and fallback. CAA queries go to NextDNS.
whois_lookup_ip tool
Takes an IPv4/IPv6 address with an optional CIDR prefix (0–32 / 0–128). Echoes the original
ip.Returns org, country, abuse contact, provider CIDRs in
cidrs(cidronly when there is exactly one), and a best-effort reverse DNS lookup:ptr_status: found | not_found | failed, withptr_source_erroron failure while the RDAP data is kept.Optional
registration_dateandlast_changedpreserve the queried object's RDAP timestamps. RIPE maintainer handles are excluded fromorg_name; missing organization evidence stays omitted.include_routing: trueaddsrouting(found | not_found | failed) with the RIS-observed prefix andorigin_asns, from RIPEstat Network Info. Off by default; a routing failure keeps the RDAP and PTR results.Fails with
invalid_ip,ip_not_found,ip_no_rdap_route(no RIR covers the address; not retryable), orprivate_rangefor0.0.0.0/8,10.0.0.0/8,100.64.0.0/10,127.0.0.0/8,169.254.0.0/16,172.16.0.0/12,192.168.0.0/16,255.0.0.0/8,::1/128,fc00::/7, andfe80::/10.
whois_lookup_asn tool
Takes an ASN from 1 to 4294967295, with an optional
ASprefix (e.g.,AS15169,AS 15169,+15169). Out-of-range numbers fail withinvalid_asn.Returns
name,org_name,country,rir,start_autnum, andend_autnum, plusabuse_email,registration_date, andlast_changedwhen the record carries them. Fails withasn_not_foundwhen no record exists.
whois_get_dossier tool
Takes a Unicode or ASCII hostname and runs registration and A/MX/NS/TXT lookups in parallel. After an exact registry 404, it can try the ICANN registrable parent and identify it as
registration_domain; DNS stays on the supplied hostname.Returns registration, DNS, domain age, privacy status, and inferred NS/MX providers. A failed lookup leaves the other's data in place and sets
rdap_source_errorordns_source_error;both_legs_failedmeans neither succeeded.NS/MX provider inference uses the first record. Unknown-provider labels come from the registrable hostname, including multi-label suffixes such as
co.uk.A null MX (
0 .) means the domain accepts no mail.
Features
Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.
RDAP / DNS-specific:
RDAP over HTTPS — no port-43 TCP dependency
IANA bootstrap auto-selection — correct registry RDAP server picked per TLD, RIR, or ASN range; bootstrap JSON cached in-memory for 24h
DNS-over-HTTPS via Cloudflare and NextDNS — dual-provider with per-type routing (NextDNS for CAA; Cloudflare for all others) and automatic fallback
No API keys required — all sources (IANA, registry RDAP endpoints, RIR RDAP, Cloudflare DoH, NextDNS DoH, optional RIPEstat Network Info) are public and keyless
Agent-friendly output:
Coverage signaled two ways —
rdap_coverage: falsereturned as data bywhois_check_availabilityandwhois_get_dossier, whilewhois_lookup_domainthrowsrdap_no_coveragefor the same casePrivacy redaction is
truewhen the registry shows it andnullwhen there's no evidencePartial failure model —
whois_get_dossiermarks a failed lookup with asource_errorfield and continues; only both failing is an errorFactual signals, not scores —
age_days,privacy_redacted,ns_provider,mx_providerare real data, not synthesized risk scores
Getting started
No API keys or accounts required. Add the following to your MCP client configuration file.
{
"mcpServers": {
"whois-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/whois-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}Or with npx (no Bun required):
{
"mcpServers": {
"whois-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/whois-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}Or with Docker:
{
"mcpServers": {
"whois-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"ghcr.io/cyanheads/whois-mcp-server:latest"
]
}
}
}For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://127.0.0.1:3010/mcpPrerequisites
Bun v1.4.4 or higher (or Node.js v24+).
No API keys required — all data sources are public.
Installation
Clone the repository:
git clone https://github.com/cyanheads/whois-mcp-server.gitNavigate into the directory:
cd whois-mcp-serverInstall dependencies:
bun installConfigure environment:
cp .env.example .env
# All vars are optional — defaults work for most use casesConfiguration
Variable | Description | Default |
| HTTP timeout for RDAP requests in milliseconds. |
|
| HTTP timeout for DNS-over-HTTPS requests in milliseconds. |
|
| Max retry attempts on transient RDAP failures. |
|
| Max retry attempts on transient DoH failures. |
|
| Transport: |
|
| Port for HTTP server. |
|
| Literal HTTP route path. Use a value such as |
|
| Public HTTP(S) base URL. Omit credentials, query strings, and fragments. | Unset |
| Auth mode: |
|
| Log level (RFC 5424). |
|
| Enable OpenTelemetry instrumentation. |
|
See .env.example for the full list of optional overrides.
The default log directory and relative LOGS_DIR paths resolve from the installed server package. Set an absolute LOGS_DIR to log elsewhere.
Running the server
Local development
Build and run:
bun run rebuild bun run start:stdio # or bun run start:httpRun checks and tests:
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
Docker
docker build -t whois-mcp-server .
docker run --rm -p 3010:3010 whois-mcp-serverThe Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/whois-mcp-server. OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.
Project structure
Path | Purpose |
| Entry point — starts the app. |
|
|
| Server-specific environment variable parsing and validation (Zod). |
| RDAP client — IANA bootstrap cache, domain/IP/ASN lookup, retry. |
| DNS-over-HTTPS client — Cloudflare primary, NextDNS fallback. |
| Optional RIPEstat RIS routing observations with a bounded exchange. |
| Tool definitions ( |
| Vitest tests mirroring |
| Design and API reference documents. |
Development guide
See CLAUDE.md for development guidelines and architectural rules. The short version:
Handlers throw, framework catches — no
try/catchin tool logicUse
ctx.logfor request-scoped loggingRegister new tools via
src/app.ts'stoolsarrayWrap external API calls: validate raw → normalize to domain type → return output schema; never fabricate missing fields
Contributing
Issues are welcome. Run checks and tests before submitting:
bun run devcheck
bun run testLicense
Apache-2.0 — see LICENSE for details.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
This server cannot be deployed
Maintenance
Related MCP Connectors
Domains MCP — domain registration lookup + availability search over live RDAP (ICANN standard…
RDAP MCP — Registration Data Access Protocol via IANA bootstrap.
Read-only domain availability and registrar price research via a public remote MCP server.
MCP server for DNSimple — domains, DNS zone records, availability, pricing and contacts.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables domain lookups using the RDAP protocol, returning structured registration data, nameservers, and contacts from over 50 supported TLDs.17 npm1MIT
- AlicenseBqualityDmaintenanceEnables domain name checking and related services through a standardized MCP interface.2MIT
- AlicenseNot gradedqualityBmaintenanceEnables RDAP domain lookup via ICANN standard, free, no authentication required.109 npmMIT
- AlicenseAqualityDmaintenanceMCP server for checking domain name availability across 500+ TLDs using RDAP with WHOIS fallback for specific TLDs.2MIT