{
    "serverInfo": {
        "name": "dhd.dk",
        "title": "dhd.dk — .dk DNS dataset",
        "version": "v1",
        "description": "Read-only DNS data for every .dk domain, from continuous scans.",
        "websiteUrl": "https://www.dhd.dk/"
    },
    "protocolVersion": "2025-06-18",
    "protocolVersions": [
        "2025-06-18",
        "2025-03-26"
    ],
    "transport": {
        "type": "streamable-http",
        "url": "https://www.dhd.dk/mcp"
    },
    "remotes": [
        {
            "type": "streamable-http",
            "url": "https://www.dhd.dk/mcp"
        }
    ],
    "authentication": {
        "required": false,
        "schemes": []
    },
    "capabilities": {
        "tools": {
            "listChanged": false
        }
    },
    "instructions": "Read-only DNS data for every .dk domain, from continuous scans. Each result carries meta.as_of; per-domain data reflects the latest scan, not a live query. Same data as https://www.dhd.dk/api/v1.",
    "tools": [
        {
            "name": "lookup_domain",
            "description": "Current DNS profile of a .dk domain from its latest scan: NS (+IPs, ASN, PTR), A/AAAA, MX, TXT/SPF/DMARC, CAA, DNSSEC verdict, SOA, mail/web hosting. meta.last_checked is when a scanner last confirmed the zone; meta.expired_at is set once the domain left the zone. data.www_vs_apex compares www.<domain> with the bare domain (verdict same|network|www_missing|apex_missing|neither, addresses + ASNs of both; current probe, latest scan only). Pass scan_id for a historical scan.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "domain": {
                        "type": "string",
                        "description": "A .dk domain, Unicode or punycode (e.g. rødovre.dk)"
                    },
                    "scan_id": {
                        "type": "integer",
                        "minimum": 1
                    }
                },
                "required": [
                    "domain"
                ],
                "additionalProperties": false
            },
            "annotations": {
                "readOnlyHint": true,
                "openWorldHint": false
            }
        },
        {
            "name": "domain_history",
            "description": "Scan history of a domain (newest first, up to 50): when it was scanned and record counts per scan.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "domain": {
                        "type": "string",
                        "description": "A .dk domain, Unicode or punycode (e.g. rødovre.dk)"
                    }
                },
                "required": [
                    "domain"
                ],
                "additionalProperties": false
            },
            "annotations": {
                "readOnlyHint": true,
                "openWorldHint": false
            }
        },
        {
            "name": "domain_timeline",
            "description": "Change timeline of a domain: entering/leaving the zone, registrar moves, WHOIS status/expiry changes, NS changes, delegation (ok/lame/deactivated), DNSSEC, mail and web hosting changes.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "domain": {
                        "type": "string",
                        "description": "A .dk domain, Unicode or punycode (e.g. rødovre.dk)"
                    }
                },
                "required": [
                    "domain"
                ],
                "additionalProperties": false
            },
            "annotations": {
                "readOnlyHint": true,
                "openWorldHint": false
            }
        },
        {
            "name": "reverse_lookup",
            "description": "Which .dk domains use a given nameserver, mail server, IP, CIDR, ASN, ISP, country, registrar, etc. (current state). by=cidr matches every address inside the block for IPv4 /16 and IPv6 /32 or narrower (meta.match=contains); a wider block only matches an identical GeoLite2 block (exact_block). Paged; meta.count is capped at 100000.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "by": {
                        "type": "string",
                        "enum": [
                            "ns",
                            "mx",
                            "asn",
                            "ip",
                            "ip6",
                            "cidr",
                            "isp",
                            "country",
                            "city",
                            "ptr",
                            "rname",
                            "acme",
                            "caa",
                            "tlsrpt",
                            "www",
                            "wwwbase",
                            "dkim",
                            "nsip",
                            "nsptr",
                            "spf",
                            "srv",
                            "srvtarget",
                            "registrar",
                            "autodiscover",
                            "autoconfig"
                        ]
                    },
                    "value": {
                        "type": "string",
                        "description": "e.g. ns1.simply.com, AS16509, 8.8.8.0/24, DK, \"One.com A/S\""
                    },
                    "page": {
                        "type": "integer",
                        "minimum": 1
                    },
                    "per_page": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 100
                    }
                },
                "required": [
                    "by",
                    "value"
                ],
                "additionalProperties": false
            },
            "annotations": {
                "readOnlyHint": true,
                "openWorldHint": false
            }
        },
        {
            "name": "leaderboard",
            "description": "Zone-wide top lists: hosting ASNs, nameservers, mail servers, countries, IPs, SRV/autodiscover targets, the DNS hall of fame, dangling www CNAMEs.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "kind": {
                        "type": "string",
                        "enum": [
                            "asns",
                            "ns",
                            "mx",
                            "countries",
                            "ips",
                            "srv",
                            "autodiscover",
                            "autoconfig",
                            "halloffame",
                            "dangling"
                        ]
                    },
                    "page": {
                        "type": "integer",
                        "minimum": 1
                    },
                    "per_page": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 100
                    }
                },
                "required": [
                    "kind"
                ],
                "additionalProperties": false
            },
            "annotations": {
                "readOnlyHint": true,
                "openWorldHint": false
            }
        },
        {
            "name": "market_changes",
            "description": "Who is gaining or losing .dk domains over the last 30 days: hosting ASNs (asn), nameservers (ns) or registrars (reg).",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "kind": {
                        "type": "string",
                        "enum": [
                            "asn",
                            "ns",
                            "reg"
                        ]
                    },
                    "view": {
                        "type": "string",
                        "enum": [
                            "net",
                            "gaining",
                            "losing",
                            "recent"
                        ],
                        "description": "net is asn only"
                    },
                    "page": {
                        "type": "integer",
                        "minimum": 1
                    },
                    "per_page": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 100
                    }
                },
                "required": [
                    "kind"
                ],
                "additionalProperties": false
            },
            "annotations": {
                "readOnlyHint": true,
                "openWorldHint": false
            }
        },
        {
            "name": "zone_list",
            "description": "Zone movement: newly registered domains (newcomers), domains that left the zone (expired), recently changed domains, zone-list revisions with added/removed counts, or wwwapex: domains whose www and bare name differ (kind=network: different ASNs; www_missing: only the bare domain resolves; apex_missing: only www resolves).",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "what": {
                        "type": "string",
                        "enum": [
                            "newcomers",
                            "expired",
                            "changed",
                            "revisions",
                            "wwwapex"
                        ]
                    },
                    "days": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 365
                    },
                    "kind": {
                        "type": "string",
                        "enum": [
                            "network",
                            "www_missing",
                            "apex_missing"
                        ],
                        "description": "wwwapex only (default network)"
                    },
                    "page": {
                        "type": "integer",
                        "minimum": 1
                    },
                    "per_page": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 100
                    }
                },
                "required": [
                    "what"
                ],
                "additionalProperties": false
            },
            "annotations": {
                "readOnlyHint": true,
                "openWorldHint": false
            }
        },
        {
            "name": "nameserver_profile",
            "description": "Probe profile of an authoritative nameserver: AXFR/IXFR open, ANY handling, glue, CHAOS version, and data.protocols: protocol support (TCP, EDNS + version negotiation + unknown options, NSID, cookies, TCP keepalive, ECS, extended errors, ZONEVERSION, error reporting, refusing recursion, DoT, DoH; null until probed).",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "nameserver": {
                        "type": "string"
                    }
                },
                "required": [
                    "nameserver"
                ],
                "additionalProperties": false
            },
            "annotations": {
                "readOnlyHint": true,
                "openWorldHint": false
            }
        }
    ],
    "resources": [],
    "prompts": [],
    "documentation": "https://www.dhd.dk/?tool=api#mcp",
    "api": "https://www.dhd.dk/api/v1"
}