
Company News
Free Business Plan Upgrades for Open Source Maintainers
Open source maintainers are under more pressure than ever. We're raising our open source program from the Team plan to the Business plan, free.
@cyanheads/whois-mcp-server
Advanced tools
Look up domain registration, check availability, fetch DNS records, and resolve IPs and ASNs via RDAP and DNS-over-HTTPS via MCP. STDIO or Streamable HTTP.
Look up domain registration, check availability, fetch DNS records, and resolve IPs and ASNs via RDAP and DNS-over-HTTPS via MCP. STDIO or Streamable HTTP.
Six tools covering domain intelligence, DNS, and IP/ASN resolution:
| Tool | Description |
|---|---|
whois_lookup_domain | Full domain registration record — registrar, created/expiry dates, nameservers, EPP status, DNSSEC, registrant org |
whois_check_availability | Check whether a domain is registered or available for registration |
whois_get_dns | DNS records for any hostname via DNS-over-HTTPS (A, AAAA, MX, TXT, NS, CNAME, SOA, CAA, PTR) |
whois_lookup_ip | IP or CIDR netblock, org, country, abuse contact, and reverse DNS via RIR RDAP |
whois_lookup_asn | Resolve an ASN to its org name, country, and RIR source |
whois_get_dossier | One-call domain triage — registration + DNS in parallel, normalized into a single record with factual signals |
whois_lookup_domainLook up a domain's full RDAP registration record.
registrant_redacted: true explicitly when privacy redaction is in effect (standard post-GDPR for gTLDs)rdap_coverage: false for TLDs without RDAP coverage rather than silently failinglast_update_of_rdap_db event timestamp for data freshness transparencywhois_check_availabilityCheck whether a domain name is registered or available to register.
available: true) — exploits the RDAP spec's intended behavioravailable: false with registrar and expiry_date when registeredavailable: null with rdap_coverage: false for TLDs without RDAP — cannot determine availabilitywhois_get_dnsFetch DNS records via DNS-over-HTTPS.
1.1.1.1 primary, Google 8.8.8.8 fallback (used for CAA records where Cloudflare returns raw hex)cloudflare or google)nxdomain: true in result (not an error) when the domain doesn't exist in DNSwhois_lookup_ipLook up an IP address or CIDR block via RIR RDAP.
ptr: null on failure, not an errorwhois_lookup_asnResolve an ASN to its org name, country, and RIR.
AS15169 or bare integer 15169 formatname, org, country, rir, start_autnum, end_autnumwhois_get_dossierOne-call domain triage aggregating registration and DNS data in parallel.
Promise.allSettledage_days, privacy_redacted, registrar, ns_provider (from NS records), mx_provider (from MX records)source_error on the failed leg)ServiceUnavailable; individual leg failures are data, not errorsBuilt on @cyanheads/mcp-ts-core:
none, jwt, oauthin-memory, filesystem, Supabase, Cloudflare KV/R2/D1Domain and network intelligence:
Agent-friendly output:
rdap_coverage: false tells the agent the TLD lacks RDAP rather than returning a confusing errorregistrant_redacted: true rather than silently absent contact datawhois_get_dossier marks individual legs with source_error and continues; only both-legs-fail escalates to an errorage_days, privacy_redacted, ns_provider, mx_provider are real data; agents chain into threat-intel or risk servers for enrichmentNo 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://localhost:3010/mcp
git clone https://github.com/cyanheads/whois-mcp-server.git
cd whois-mcp-server
bun install
cp .env.example .env
# All vars are optional — defaults work for most use cases
| Variable | Description | Default |
|---|---|---|
RDAP_TIMEOUT_MS | HTTP timeout for RDAP requests in milliseconds. | 5000 |
DOH_TIMEOUT_MS | HTTP timeout for DNS-over-HTTPS requests in milliseconds. | 3000 |
RDAP_MAX_RETRIES | Max retry attempts on transient RDAP failures. | 2 |
DOH_MAX_RETRIES | Max retry attempts on transient DoH failures. | 2 |
MCP_TRANSPORT_TYPE | Transport: stdio or http. | stdio |
MCP_HTTP_PORT | Port for HTTP server. | 3010 |
MCP_AUTH_MODE | Auth mode: none, jwt, or oauth. | none |
MCP_LOG_LEVEL | Log level (RFC 5424). | info |
OTEL_ENABLED | Enable OpenTelemetry instrumentation. | false |
See .env.example for the full list of optional overrides.
Build and run:
bun run rebuild
bun run start:stdio
# or
bun run start:http
Run 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 build -t whois-mcp-server .
docker run --rm -p 3010:3010 whois-mcp-server
The 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.
| Path | Purpose |
|---|---|
src/index.ts | createApp() entry point — registers tools and inits services. |
src/config/ | Server-specific environment variable parsing and validation (Zod). |
src/services/rdap/ | RDAP client — IANA bootstrap cache, domain/IP/ASN lookup, retry. |
src/services/doh/ | DNS-over-HTTPS client — Cloudflare primary, Google fallback. |
src/mcp-server/tools/ | Tool definitions (*.tool.ts). |
tests/ | Vitest tests mirroring src/. |
docs/ | Design and API reference documents. |
See CLAUDE.md for development guidelines and architectural rules. The short version:
try/catch in tool logicctx.log for request-scoped logging, ctx.state for tenant-scoped storage (IANA bootstrap cache)src/index.ts tools arrayIssues and pull requests are welcome. Run checks and tests before submitting:
bun run devcheck
bun run test
Apache-2.0 — see LICENSE for details.
FAQs
Look up domain registration, check availability, fetch DNS records, and resolve IPs and ASNs via RDAP and DNS-over-HTTPS via MCP. STDIO or Streamable HTTP.
The npm package @cyanheads/whois-mcp-server receives a total of 56 weekly downloads. As such, @cyanheads/whois-mcp-server popularity was classified as not popular.
We found that @cyanheads/whois-mcp-server demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Company News
Open source maintainers are under more pressure than ever. We're raising our open source program from the Team plan to the Business plan, free.

Security News
The supply chain control that delays freshly published gems now covers lockfile generation and gem vendoring in Ruby projects.

Security News
During a UK cyber test, a Mythos 5 agent used sockpuppets, social engineering, and prompt injection to try to get a maintainer to merge malware.