get_a_records
Retrieve A records for any domain to identify associated IPv4 addresses and analyze DNS infrastructure.
Instructions
Get A records for a domain.
Args: domain: The domain name to query (e.g., example.com) ctx: Request context
Returns: Formatted string containing A records
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes |
Implementation Reference
- server.py:230-340 (handler)Full implementation of the get_a_records tool handler, including decorator. Queries DNSDumpster API for A records, processes and formats the output with IP details, ASN info, and banner information.@mcp.tool() async def get_a_records(domain: str, ctx: Context) -> str: """Get A records for a domain. Args: domain: The domain name to query (e.g., example.com) ctx: Request context Returns: Formatted string containing A records """ if not domain: return "Error: Domain is required" # Validate domain if not is_valid_domain(domain): return "Error: Invalid domain name format" try: api_key = os.environ.get("DNSDUMPSTER_API_KEY") if not api_key: return "Error: API key not configured. Set DNSDUMPSTER_API_KEY environment variable." client = DNSDumpsterClient(api_key) try: ctx.info(f"Querying A records for {domain}") result = await client.get_dns_records(domain) if "a" not in result or not result["a"]: return f"No A records found for {domain}" output_lines = [f"A Records for {domain}:"] for record in result["a"]: host = record.get("host", "") output_lines.append(f"\nHost: {host}") for ip_info in record.get("ips", []): ip = ip_info.get("ip", "") country = ip_info.get("country", "Unknown") asn = ip_info.get("asn", "") asn_name = ip_info.get("asn_name", "") asn_range = ip_info.get("asn_range", "") output_lines.append(f" IP: {ip}") output_lines.append(f" Country: {country}") if asn: output_lines.append(f" ASN: {asn}") if asn_name: output_lines.append(f" ASN Name: {asn_name}") if asn_range: output_lines.append(f" ASN Range: {asn_range}") # If banner information is available if "banners" in ip_info: output_lines.append(" Banners:") banners = ip_info["banners"] if "http" in banners: http_banner = banners["http"] output_lines.append(" HTTP:") if "title" in http_banner: output_lines.append( f" Title: {http_banner['title']}" ) if "server" in http_banner: output_lines.append( f" Server: {http_banner['server']}" ) if "apps" in http_banner: output_lines.append( f" Apps: {', '.join(http_banner['apps'])}" ) if "https" in banners: https_banner = banners["https"] output_lines.append(" HTTPS:") if "title" in https_banner: output_lines.append( f" Title: {https_banner['title']}" ) if "server" in https_banner: output_lines.append( f" Server: {https_banner['server']}" ) if "apps" in https_banner: output_lines.append( f" Apps: {', '.join(https_banner['apps'])}" ) if "cn" in https_banner: output_lines.append(f" CN: {https_banner['cn']}") if "alt_n" in https_banner: output_lines.append( f" Alt Names: {', '.join(https_banner['alt_n'])}" ) return "\n".join(output_lines) finally: await client.close() except Exception as e: return f"Error: {str(e)}"
- server.py:230-230 (registration)MCP tool registration decorator for get_a_records.@mcp.tool()
- server.py:170-181 (helper)Helper function used by get_a_records to validate domain names.def is_valid_domain(domain: str) -> bool: """Validate a domain name. Args: domain: Domain name to validate Returns: True if the domain is valid, False otherwise """ pattern = r"^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$" return bool(re.match(pattern, domain))