Whois Mcp Server

io.github.cyanheadsPublished by GitHub account cyanheadsv0.2.1Updated Oct 24, 2026

Domain registry records and status, DNS records, and IP/ASN resolution over RDAP and DoH.

Overview

AI-generated overview

Looks up domain registrations, DNS records, IP netblocks and ASNs over RDAP and DNS-over-HTTPS, with no API keys needed.

What you can do
  • Look up domain registration records: registrar, dates, nameservers, EPP status, DNSSEC, with optional registrar referral detail
  • Check whether a registry record exists for a domain, returning registered, not_found or unknown
  • Fetch DNS records (A, AAAA, MX, TXT, NS, CNAME, SOA, CAA, PTR) with TTLs via DNS-over-HTTPS
  • Resolve IP addresses and CIDR netblocks to org, country, abuse contact and reverse DNS, with optional routing data
  • Resolve an ASN to its org name, country and RIR
  • Run a one-call domain dossier combining registration and DNS into a single normalized record
When to use it
Useful when an assistant needs to investigate a domain, IP or ASN: checking who owns or registered a name, verifying DNS configuration such as MX or CAA, triaging a suspicious domain, or mapping an IP to its network operator. It is read-only public-data lookup, so it fits research and troubleshooting rather than anything that changes records.
Requirements
Runs locally as an npm package via npx or bunx (Bun v1.4.0+ or Node.js v24+), or as a Docker image. No API keys or accounts. Outbound HTTPS access to public RDAP, DoH and RIPEstat endpoints. Optional environment variables tune timeouts, retries, transport, HTTP host/port and log level.
Before you install
All lookups are read-only and go to public third-party services (IANA bootstrap, registry and RIR RDAP endpoints, Cloudflare and NextDNS DoH, optional RIPEstat), so queried domain names and IPs are visible to those providers. If you switch to HTTP transport, MCP_AUTH_MODE defaults to none, so set jwt or oauth before exposing it beyond localhost. Availability results never confirm a name can be registered.

Installation

In SourceWeft

  1. Open Whois Mcp Server in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

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


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.

json
{  "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):

json
{  "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:

json
{  "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:

sh
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:
sh
git clone https://github.com/cyanheads/whois-mcp-server.git
  1. Navigate into the directory:
sh
cd whois-mcp-server
  1. Install dependencies:
sh
bun install
  1. Configure environment:
sh
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:

    sh
    bun run rebuildbun run start:stdio# orbun run start:http
  • Run checks and tests:

    sh
    bun run devcheck   # Lint, format, typecheck, securitybun run test       # Vitest test suitebun run lint:mcp   # Validate MCP definitions against spec

Docker

sh
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:

sh
bun run devcheckbun run test

License

Apache-2.0 — see LICENSE for details.

Source: README.md at commit 104c879

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

5
  1. v0.2.1LatestOct 16, 2026
  2. v0.2.0Oct 13, 2026
  3. v0.1.6Sep 30, 2026
  4. v0.1.5Sep 21, 2026
  5. v0.1.4Sep 16, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts