mcpField
W
whois-mcp-server

whois-mcp-server

Local
github.com/cyanheadsSecurity1Updated 2w ago

About whois-mcp-server

whois-mcp-server provides domain and network lookups through RDAP and DNS-over-HTTPS for agents that need registration, DNS, IP, or ASN information. It supports STDIO and Streamable HTTP, with no API keys required for its data sources.

Key features

  1. 01Retrieve domain registration records and status
  2. 02Fetch DNS records and TTLs
  3. 03Look up IPs, netblocks, and reverse DNS
  4. 04Resolve ASN organization details
  5. 05Build a combined domain dossier

Use cases

  1. 01Check a domain's registrar, expiry, and DNSSEC
  2. 02Inspect DNS settings and mail records
  3. 03Identify IP netblock ownership and abuse contacts
  4. 04Combine registration and DNS findings for triage

MCP support

As an MCP server, it exposes six domain and network lookup tools to clients over STDIO or Streamable HTTP.

Configuration

Local server config is the same for every client. Copy it into your client’s MCP config file.

mcp.json · Universal config
{
"mcpServers": {
"cyanheads-whois": {
"command": "npx",
"args": [
"-y",
"@cyanheads/whois-mcp-server"
],
"env": {
"MCP_LOG_LEVEL": "<MCP_LOG_LEVEL>",
"RDAP_TIMEOUT_MS": "<RDAP_TIMEOUT_MS>",
"DOH_TIMEOUT_MS": "<DOH_TIMEOUT_MS>",
"RDAP_MAX_RETRIES": "<RDAP_MAX_RETRIES>",
"DOH_MAX_RETRIES": "<DOH_MAX_RETRIES>",
"MCP_TRANSPORT_TYPE": "<MCP_TRANSPORT_TYPE>",
"MCP_HTTP_HOST": "<MCP_HTTP_HOST>",
"MCP_HTTP_PORT": "<MCP_HTTP_PORT>",
"MCP_HTTP_ENDPOINT_PATH": "<MCP_HTTP_ENDPOINT_PATH>",
"MCP_PUBLIC_URL": "<MCP_PUBLIC_URL>",
"MCP_AUTH_MODE": "<MCP_AUTH_MODE>"
}
}
}
}
Run commandnpx -y @cyanheads/whois-mcp-server
Environment variables to set
MCP_LOG_LEVELSets the minimum log level for output (e.g., 'debug', 'info', 'warn').
RDAP_TIMEOUT_MSHTTP timeout for RDAP requests in milliseconds.
DOH_TIMEOUT_MSHTTP timeout for DNS-over-HTTPS requests in milliseconds.
RDAP_MAX_RETRIESMax retry attempts on transient RDAP failures.
DOH_MAX_RETRIESMax retry attempts on transient DNS-over-HTTPS failures.
MCP_TRANSPORT_TYPESelects the HTTP transport.
MCP_HTTP_HOSTThe hostname for the HTTP server.
MCP_HTTP_PORTThe port to run the HTTP server on.
MCP_HTTP_ENDPOINT_PATHThe endpoint path for the MCP server.
MCP_PUBLIC_URLPublic origin override for deployments behind a TLS-terminating reverse proxy (e.g. https://mcp.example.com).
MCP_AUTH_MODESecretAuthentication mode to use: 'none', 'jwt', or 'oauth'.

Local servers need a runtime on your machine (e.g. Node.js 18+). Config file locations differ by client; see your client’s docs.

Packages
npm@cyanheads/whois-mcp-server0.2.1

Tools

6

Saved tool list · updated 2w ago

ParameterTypeRequiredDescription
domainstringYesFully qualified domain name to look up (e.g., "example.com", "github.com"). Must be a valid FQDN — labels separated by dots, each label up to 63 chars.

Details

From the project README

@cyanheads/whois-mcp-server

Look up domain registration, check registry record status, fetch DNS records, and resolve IPs and ASNs over RDAP and DNS-over-HTTPS via MCP. STDIO or Streamable HTTP.

6 Tools

Version License Docker MCP SDK npm TypeScript Bun

Install in Claude Desktop Install in Cursor Install in VS Code

Framework


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
ToolDescription
whois_lookup_domainFull domain registration record — registrar, created/expiry dates, nameservers, EPP status, DNSSEC, registrant org
whois_check_availabilityCheck registry record presence; missing records do not establish registration eligibility
whois_get_dnsDNS owner records via DNS-over-HTTPS (A, AAAA, MX, TXT, NS, CNAME, SOA, CAA, PTR)
whois_lookup_ipIP or CIDR netblock, org, country, abuse contact, and reverse DNS via RIR RDAP
whois_lookup_asnResolve an ASN to its org name, country, and RIR source
whois_get_dossierOne-call domain triage — registration + DNS in parallel, normalized into a single record with factual signals

Capability reference

whois_lookup_domain tool
  • Takes a fully qualified domain name and picks the registry's RDAP server through IANA bootstrap.
  • Returns registrar, dates, nameservers, EPP status, DNSSEC, and registrant_redacted; DNSSEC and privacy stay null when the registry gives no evidence. Fails with rdap_no_coverage, domain_not_found, or rdap_invalid_domain_response (the response doesn't match the queried domain).
  • include_registrar: true follows one registrar RDAP referral and adds registrar_detail (found, no_referral, or failed, plus source URL). Off by default; limited by RDAP_TIMEOUT_MS, and a failure keeps the registry result.

whois_check_availability tool
  • Takes a fully qualified domain name.
  • Returns registration_status: registered | not_found | unknown. available is false for a found registration and null otherwise, never true: a 404 means no record, not that the name can be registered.
  • Known ICANN subdomains return non_registrable_domain with their registrable parent.

whois_get_dns tool
  • Takes an ASCII DNS name (underscore labels like _dmarc.example.com are fine), up to 253 characters with 1–63-character labels. Optional types: A, AAAA, MX, TXT, NS, CNAME, SOA, CAA, PTR; defaults to A, AAAA, MX, TXT, NS.
  • Returns records with TTLs and query_sources: [{type, source}], including empty answers and NXDOMAIN. Legacy source is cloudflare if any query got a successful Cloudflare response, otherwise nextdns.
  • 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 (cidr only when there is exactly one), and a best-effort reverse DNS lookup: ptr_status: found | not_found | failed, with ptr_source_error on failure while the RDAP data is kept.
  • include_routing: true adds routing (found | not_found | failed) with the RIS-observed prefix and origin_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), or private_range for 0.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, and fe80::/10.

whois_lookup_asn tool
  • Takes an ASN from 1 to 4294967295, with an optional AS prefix (e.g., AS15169, AS 15169, +15169). Out-of-range numbers fail with invalid_asn.
  • Returns name, org_name, country, rir, start_autnum, and end_autnum; fails with asn_not_found when no record exists.

whois_get_dossier tool
  • Takes a fully qualified domain name and runs the registration and A/MX/NS/TXT lookups in parallel.
  • 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_error or dns_source_error; both_legs_failed means neither succeeded.
  • 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: false returned as data by whois_check_availability and whois_get_dossier, while whois_lookup_domain throws rdap_no_coverage for the same case
  • Privacy redaction is true when the registry shows it and null when there's no evidence
  • Partial failure model — whois_get_dossier marks a failed lookup with a source_error field and continues; only both failing is an error
  • Factual signals, not scores — age_days, privacy_redacted, ns_provider, mx_provider are 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/mcp
Prerequisites
  • Bun v1.4.0 or higher (or Node.js v24+).
  • No API keys required — all data sources are public.
Installation
  1. Clone the repository:
git clone https://github.com/cyanheads/whois-mcp-server.git
  1. Navigate into the directory:
cd whois-mcp-server
  1. Install dependencies:
bun install
  1. Configure environment:
cp .env.example .env
# All vars are optional — defaults work for most use cases

Configuration

VariableDescriptionDefault
RDAP_TIMEOUT_MSHTTP timeout for RDAP requests in milliseconds.5000
DOH_TIMEOUT_MSHTTP timeout for DNS-over-HTTPS requests in milliseconds.3000
RDAP_MAX_RETRIESMax retry attempts on transient RDAP failures.2
DOH_MAX_RETRIESMax retry attempts on transient DoH failures.2
MCP_TRANSPORT_TYPETransport: stdio or http.stdio
MCP_HTTP_PORTPort for HTTP server.3010
MCP_AUTH_MODEAuth mode: none, jwt, or oauth.none
MCP_LOG_LEVELLog level (RFC 5424).info
OTEL_ENABLEDEnable OpenTelemetry instrumentation.false

See .env.example for the full list of optional overrides.


Running the server

Local development
  • 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
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.


Project structure

PathPurpose
src/index.tsEntry point — starts the app.
src/app.tscreateApp() options — registers tools, inits services, declares the session mode.
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, NextDNS fallback.
src/services/routing/Optional RIPEstat RIS routing observations with a bounded exchange.
src/mcp-server/tools/Tool definitions (*.tool.ts).
tests/Vitest tests mirroring src/.
docs/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/catch in tool logic
  • Use ctx.log for request-scoped logging
  • Register new tools via src/app.ts's tools array
  • Wrap 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 test

License

Apache-2.0 — see LICENSE for details.

Comments

Markdown supported

New to MCP?

From what the protocol is to installing your first server, these answers cover most first questions.

An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.