Skip to content

TheZacillac/seer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

244 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ”ฎ Seer

Domain intelligence at your fingertips.

A high-performance, multi-interface domain utility suite โ€” query WHOIS, RDAP, DNS, SSL, and more from the terminal, Python, REST API, or AI assistants.

CI Crates.io License: MIT Rust Python

Features ยท Quick Start ยท CLI Usage ยท Python ยท REST API ยท MCP Server


โœจ Features

๐Ÿ” Lookups & Discovery

  • Smart Lookup โ€” concurrent RDAP + WHOIS with fallback
  • WHOIS โ€” registrant, registrar, and expiration data
  • RDAP โ€” modern protocol for domains, IPs, and ASNs
  • Domain Info โ€” merged RDAP + WHOIS in a flat structure
  • Reverse DNS โ€” PTR lookups for IP addresses
  • TLD Info โ€” WHOIS server, RDAP endpoint, and registry
  • Subdomain Enumeration โ€” via Certificate Transparency logs
  • Domain Availability โ€” check if a domain is registered

๐ŸŒ DNS & Propagation

  • DNS Resolution โ€” 13 record types with custom nameservers
  • DNS Propagation โ€” 29 servers across 6 global regions
  • DNS Monitoring โ€” track record changes over time
  • DNS Comparison โ€” compare records across two nameservers
  • DNSSEC Validation โ€” check DNSSEC configuration

๐Ÿ›ก๏ธ Security & Health

  • Domain Status โ€” HTTP status, title, SSL, and expiration
  • SSL Chain Inspection โ€” full chain, SANs, key details, validity
  • Domain Watchlist โ€” monitor expiring certs and registrations
  • SSRF Protection โ€” blocks requests to private/reserved IPs

โšก Power Features

  • Bulk Operations โ€” process domain lists with CSV export
  • Domain Diff โ€” side-by-side comparison of two domains
  • Field Extraction โ€” --quiet --fields for scriptable output
  • 4 Output Formats โ€” human, JSON, YAML, markdown
  • Interactive REPL โ€” with tab completion and history
  • Semantic Exit Codes โ€” for CI/CD scripting
  • Shell Completions โ€” bash, zsh, fish, PowerShell

๐Ÿ—๏ธ Five Interfaces, One Core

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                        User Interfaces                           โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  seer-cli   โ”‚   seer-py   โ”‚   seer-api   โ”‚       seer-api        โ”‚
โ”‚  Terminal   โ”‚   Python    โ”‚   REST API   โ”‚     MCP Server        โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
       โ”‚             โ”‚             โ”‚                   โ”‚
       โ”‚             โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
       โ”‚                           โ”‚
       โ–ผ                           โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                          seer-core                                โ”‚
โ”‚                      Core Rust Library                            โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  WHOIS   โ”‚  RDAP  โ”‚ DNS  โ”‚ Status โ”‚ SSL  โ”‚ Bulk โ”‚  Diff/Watch   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐Ÿš€ Quick Start

Install the CLI

cargo install seer-cli

Run your first lookup

seer lookup example.com        # Smart RDAP + WHOIS lookup
seer dig example.com MX        # DNS query
seer status example.com        # HTTP, SSL, and expiration check
seer ssl example.com           # Full SSL chain inspection
seer                           # Launch interactive REPL

Use as a Rust library

[dependencies]
seer-core = "0.18"
tokio = { version = "1", features = ["full"] }

Requirements: Rust 1.70+ ยท Python 3.9+ (for Python bindings/API)


๐Ÿ“ฆ Packages

Package Type Install Description
seer-core Rust library cargo add seer-core Core library โ€” all business logic
seer-cli Rust binary cargo install seer-cli The seer command-line tool
seer-py Python extension maturin develop --release Python bindings via PyO3
seer-api Python package pip install -e . REST API + MCP server
seer-cli vs seer-core โ€” which do I need?
seer-cli seer-core
What Executable binary Rust library crate
Install cargo install seer-cli cargo add seer-core
Use Run seer in your terminal use seer_core::* in Rust code
Provides Commands, REPL, formatted output Structs, clients, async APIs
Depends on seer-core internally Nothing โ€” it's the foundation

๐Ÿ’ป CLI Usage

Command Mode

# Smart lookup (concurrent RDAP + WHOIS)
seer lookup example.com

# Comprehensive domain info (merged RDAP + WHOIS)
seer info example.com

# WHOIS / RDAP
seer whois example.com
seer rdap example.com           # Domain
seer rdap 8.8.8.8               # IP address
seer rdap AS15169               # ASN

# DNS queries
seer dig example.com             # A records (default)
seer dig example.com MX          # Specific record type
seer dig example.com A -s 8.8.8.8  # Custom nameserver

# DNS propagation & monitoring
seer prop example.com A
seer follow example.com 20 0.5       # 20 checks, 30s interval
seer follow example.com 10 1 MX --changes-only

# DNSSEC & DNS comparison
seer dnssec example.com
seer compare example.com A 8.8.8.8 1.1.1.1

# Domain health & SSL
seer status example.com
seer ssl example.com

# Reverse DNS
seer reverse 8.8.8.8

# Discovery
seer avail example.com
seer subdomains example.com
seer tld .com

# Domain diff
seer diff example.com google.com

# Watchlist
seer watch add example.com
seer watch list
seer watch                        # Check all watched domains
seer watch remove example.com

# Lookup history
seer history example.com
seer history --clear

# Bulk operations (with CSV export)
seer bulk lookup domains.txt
seer bulk status domains.txt -o results.csv
seer bulk dig domains.txt MX
seer bulk avail domains.txt
seer bulk info domains.txt

# Scriptable field extraction
seer --quiet --fields registrar lookup example.com
seer --quiet --fields certificate.issuer status example.com

# Shell completions
seer completions bash >> ~/.bashrc
seer completions zsh >> ~/.zshrc

Output Formats

seer --format human lookup example.com      # Colored, human-readable (default)
seer --format json lookup example.com       # JSON
seer --format yaml lookup example.com       # YAML
seer --format markdown lookup example.com   # Markdown table

Interactive REPL

Launch by running seer with no arguments:

$ seer
seer> lookup example.com
seer> dig github.com MX
seer> status cloudflare.com
seer> set output json
seer> help
seer> exit

Features: command history (~/.seer_history), tab completion, loading spinners, persistent session state.


๐Ÿ Python Library

import seer

# Smart lookup
result = seer.lookup("example.com")

# WHOIS / RDAP
whois = seer.whois("example.com")
rdap  = seer.rdap_domain("example.com")
rdap  = seer.rdap_ip("8.8.8.8")
rdap  = seer.rdap_asn(15169)

# DNS
records     = seer.dig("example.com", record_type="MX")
propagation = seer.propagation("example.com", record_type="A")

# Domain health & SSL
status = seer.status("example.com")
ssl    = seer.ssl("example.com")
dnssec = seer.dnssec("example.com")

# Availability & info
available = seer.availability("example.com")
info      = seer.info("example.com")

# Comparison & enumeration
diff       = seer.diff("example.com", "google.com")
comparison = seer.dns_compare("example.com", "A", "8.8.8.8", "1.1.1.1")
subdomains = seer.subdomains("example.com")

# Bulk operations
results = seer.bulk_lookup(["example.com", "google.com"], concurrency=10)
results = seer.bulk_status(["example.com", "google.com"])
results = seer.bulk_dig(["example.com", "google.com"], record_type="A")
results = seer.bulk_info(["example.com", "google.com"])
Example: Check SSL Certificate
status = seer.status("example.com")
if cert := status.get("certificate"):
    print(f"SSL Valid: {cert['is_valid']}")
    print(f"Expires:   {cert['valid_until']}")
    print(f"Days left: {cert['days_until_expiry']}")

๐Ÿฆ€ Rust Library

[dependencies]
seer-core = "0.18"
tokio = { version = "1", features = ["full"] }
use seer_core::{SmartLookup, DnsResolver, RecordType, StatusClient};

#[tokio::main]
async fn main() -> seer_core::Result<()> {
    // Smart lookup (RDAP โ†’ WHOIS fallback)
    let lookup = SmartLookup::new();
    let result = lookup.lookup("example.com").await?;

    // DNS resolution
    let resolver = DnsResolver::new();
    let records = resolver.resolve("example.com", RecordType::MX, None).await?;
    for record in records {
        println!("{}: {}", record.record_type, record.data);
    }

    // Domain status check
    let client = StatusClient::new();
    let status = client.check("example.com").await?;
    println!("HTTP: {:?}", status.http_status);

    Ok(())
}

See seer-core/README.md for the full API reference.


๐ŸŒ REST API

seer-api   # Starts on http://127.0.0.1:8000 (loopback-only by default)

Deployment notes (breaking change)

  • Default bind is 127.0.0.1 (was 0.0.0.0 in previous versions). To bind publicly, set both SEER_HOST=0.0.0.0 and SEER_API_KEY โ€” the server refuses to start on a non-loopback host without an auth key.
  • /docs, /redoc, /openapi.json are disabled by default. Set SEER_DOCS_ENABLED=true to re-enable.
  • Multi-worker deployments require SEER_RATE_LIMIT_STORAGE. With WEB_CONCURRENCY>1 and the default in-memory limiter, the server refuses to start โ€” the per-worker limiter would be trivially bypassable. Use redis://host:6379 or another shared store.
Endpoint Method Description
/lookup/{domain} GET Smart lookup (RDAP + WHOIS)
/lookup/bulk POST Bulk smart lookups
/whois/{domain} GET WHOIS lookup
/rdap/domain/{domain} GET RDAP domain lookup
/rdap/ip/{ip} GET RDAP IP lookup
/rdap/asn/{asn} GET RDAP ASN lookup
/dns/{domain}/{record_type} GET DNS query
/dns/bulk POST Bulk DNS queries
/propagation/{domain}/{record_type} GET DNS propagation check
/propagation/bulk POST Bulk propagation checks
/status/{domain} GET Domain status check
/status/bulk POST Bulk status checks
/health GET Health check
# Examples
curl http://localhost:8000/lookup/example.com
curl http://localhost:8000/dns/example.com/MX
curl -X POST http://localhost:8000/lookup/bulk \
  -H "Content-Type: application/json" \
  -d '{"domains": ["example.com", "google.com"]}'

API docs (when SEER_DOCS_ENABLED=true): Swagger UI ยท ReDoc


๐Ÿค– MCP Server

Integrate Seer with AI assistants via the Model Context Protocol:

seer-mcp   # Runs on stdio transport

16 tools available:

Tool Description
seer_lookup Smart domain lookup
seer_info Comprehensive domain info
seer_whois WHOIS lookup
seer_rdap_domain RDAP domain lookup
seer_rdap_ip RDAP IP lookup
seer_rdap_asn RDAP ASN lookup
seer_dig DNS query
seer_propagation DNS propagation check
seer_status Domain status check
seer_bulk_lookup Bulk smart lookups
seer_bulk_whois Bulk WHOIS lookups
seer_bulk_dig Bulk DNS queries
seer_bulk_status Bulk status checks
seer_bulk_propagation Bulk propagation checks
seer_bulk_info Bulk domain info
Claude Desktop configuration

Add to claude_desktop_config.json:

{
  "mcpServers": {
    "seer": {
      "command": "seer-mcp"
    }
  }
}

๐Ÿ“ก DNS Record Types

Type Description Type Description
A IPv4 address CAA CA authorization
AAAA IPv6 address PTR Pointer record
MX Mail exchange SRV Service locator
TXT Text records DNSKEY DNSSEC public key
NS Nameserver DS Delegation signer
SOA Start of authority ANY All records
CNAME Canonical name

๐ŸŒ Global DNS Propagation Servers

Propagation checks query 29 nameservers across 6 regions:

Region Servers
๐Ÿ‡บ๐Ÿ‡ธ North America Google 8.8.8.8 ยท Cloudflare 1.1.1.1 ยท OpenDNS ยท Quad9 ยท Level3
๐Ÿ‡ช๐Ÿ‡บ Europe DNS.Watch ยท Mullvad ยท dns0.eu ยท Yandex ยท UncensoredDNS
๐ŸŒ Asia Pacific AliDNS ยท 114DNS ยท Tencent DNSPod ยท TWNIC ยท HiNet
๐ŸŒŽ Latin America Claro Brasil ยท Telefonica Brasil ยท Antel Uruguay ยท Telmex ยท CenturyLink
๐ŸŒ Africa Liquid Telecom ยท SEACOM ยท Safaricom ยท MTN South Africa ยท Telecom Egypt
๐ŸŒ Middle East Etisalat UAE ยท STC Saudi ยท Bezeq Israel ยท Turk Telekom ยท Ooredoo Qatar

โš™๏ธ Configuration

Environment Variables

Variable Description Default
RUST_LOG Logging level (trace / debug / info / warn / error) โ€”
SEER_CORS_ORIGINS Comma-separated CORS origins for REST API *
SEER_RATE_LIMIT REST API rate limit (requests/minute) 30

Config File

Initialize a config file at ~/.seer/config.toml:

seer config --init

Timeouts

Client Default
WHOIS 10s
RDAP 30s
DNS 5s (2 retries)
HTTP / SSL 10s
Propagation 15s

Bulk Operations

  • Input: plain text (one domain per line) or CSV (first column)
  • Comments: lines starting with # are skipped
  • Concurrency: default 10, max 50
  • API limit: max 100 domains per request

๐Ÿ”ฎ Roadmap

  • Scheduled Monitoring Daemon โ€” seer monitor --config monitors.toml as a background service with notifications (email, Slack, PagerDuty) for expiring domains, SSL certificates, and unexpected DNS changes. The natural evolution of watch, follow, and status into persistent monitoring.

๐Ÿ› ๏ธ Development

Building

cargo build --release                        # All Rust packages
cd seer-py && maturin develop --release      # Python bindings
cd seer-api && pip install -e .              # REST API + MCP server

Testing

cargo test                    # All Rust tests
cargo test -p seer-core       # Core library only
cd seer-api && pytest         # Python API tests
RUST_LOG=debug cargo test     # With debug logging

Linting

cargo fmt --all -- --check    # Format check
cargo clippy -- -D warnings   # Lint

Project Structure

seer/
โ”œโ”€โ”€ Cargo.toml                # Workspace root
โ”œโ”€โ”€ seer-core/                # Core Rust library (all business logic)
โ”‚   โ””โ”€โ”€ src/
โ”‚       โ”œโ”€โ”€ lib.rs            # Module exports
โ”‚       โ”œโ”€โ”€ error.rs          # Centralized error types
โ”‚       โ”œโ”€โ”€ lookup.rs         # Smart lookup (RDAP + WHOIS)
โ”‚       โ”œโ”€โ”€ validation.rs     # Domain validation & SSRF protection
โ”‚       โ”œโ”€โ”€ config.rs         # Configuration management
โ”‚       โ”œโ”€โ”€ whois/            # WHOIS client, parser, server mapping
โ”‚       โ”œโ”€โ”€ rdap/             # RDAP client with IANA bootstrap
โ”‚       โ”œโ”€โ”€ dns/              # Resolver, propagation, DNSSEC, follow
โ”‚       โ”œโ”€โ”€ ssl/              # SSL certificate chain inspection
โ”‚       โ”œโ”€โ”€ status/           # HTTP, SSL, and expiration checking
โ”‚       โ”œโ”€โ”€ bulk/             # Concurrent bulk executor
โ”‚       โ”œโ”€โ”€ diff/             # Domain comparison
โ”‚       โ”œโ”€โ”€ availability/     # Domain availability checking
โ”‚       โ”œโ”€โ”€ subdomains/       # CT log enumeration
โ”‚       โ”œโ”€โ”€ tld/              # TLD information
โ”‚       โ”œโ”€โ”€ watchlist/        # Domain monitoring
โ”‚       โ”œโ”€โ”€ history/          # Lookup history tracking
โ”‚       โ”œโ”€โ”€ domain_info/      # Flat domain info structure
โ”‚       โ”œโ”€โ”€ cache/            # TTL and single-value caching
โ”‚       โ”œโ”€โ”€ retry/            # Network retry with classification
โ”‚       โ”œโ”€โ”€ logging/          # Structured logging + OpenTelemetry
โ”‚       โ”œโ”€โ”€ output/           # Formatters (human/JSON/YAML/markdown)
โ”‚       โ””โ”€โ”€ colors.rs         # Catppuccin color palette
โ”‚
โ”œโ”€โ”€ seer-cli/                 # CLI application
โ”‚   โ””โ”€โ”€ src/
โ”‚       โ”œโ”€โ”€ main.rs           # Clap commands & dispatch
โ”‚       โ”œโ”€โ”€ display/          # Spinner and progress utilities
โ”‚       โ””โ”€โ”€ repl/             # Interactive REPL
โ”‚
โ”œโ”€โ”€ seer-py/                  # Python bindings (PyO3)
โ”‚   โ”œโ”€โ”€ src/lib.rs            # Rust โ†’ Python bridge
โ”‚   โ””โ”€โ”€ python/seer/          # Python package wrapper
โ”‚
โ””โ”€โ”€ seer-api/                 # FastAPI REST server + MCP
    โ””โ”€โ”€ seer_api/
        โ”œโ”€โ”€ main.py           # FastAPI app
        โ”œโ”€โ”€ routers/          # API endpoint modules
        โ””โ”€โ”€ mcp/              # MCP server (16 tools)

๐Ÿ”ง Technology Stack

Layer Technologies
Core Rust ยท Tokio ยท Reqwest (rustls) ยท Hickory-resolver (DNSSEC) ยท Serde ยท OpenTelemetry
CLI Clap v4 ยท Rustyline ยท Indicatif ยท Colored ยท Crossterm
Python PyO3 (ABI3) ยท FastAPI ยท Pydantic ยท MCP
Data WHOIS servers from WooMai/whois-servers ยท IANA RDAP bootstrap

๐Ÿ“„ License

MIT License โ€” Copyright (c) 2026 Zac Roach

See LICENSE for the full text.

About

A multi-interface domain name utility tool for querying domain registration information, DNS records, and network data.

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors