dns_lookup
Perform DNS lookups to retrieve A, AAAA, MX, TXT, and other record types for domain analysis and troubleshooting.
Instructions
Perform DNS lookup for a domain to retrieve various record types (A, AAAA, MX, TXT, etc.)
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | The domain name to lookup | |
| recordType | No | The type of DNS record to query | A |
| useCustomServer | No | Use custom DNS server if configured | |
| timeout | No | Query timeout in milliseconds |
Implementation Reference
- src/dns-resolver.ts:22-147 (handler)Core implementation of the DNS lookup tool logic, handling different DNS record types (A, AAAA, CNAME, etc.) using Node.js 'dns/promises' Resolver class.async lookup(domain: string, recordType: DnsRecordType, timeout?: number): Promise<DnsLookupResult> { const startTime = Date.now(); const records: DnsRecord[] = []; try { switch (recordType) { case 'A': const aRecords = await this.resolver.resolve4(domain, { ttl: true }); records.push(...aRecords.map(r => ({ type: 'A' as DnsRecordType, name: domain, value: r.address, ttl: r.ttl }))); break; case 'AAAA': const aaaaRecords = await this.resolver.resolve6(domain, { ttl: true }); records.push(...aaaaRecords.map(r => ({ type: 'AAAA' as DnsRecordType, name: domain, value: r.address, ttl: r.ttl }))); break; case 'CNAME': const cnameRecords = await this.resolver.resolveCname(domain); records.push(...cnameRecords.map(r => ({ type: 'CNAME' as DnsRecordType, name: domain, value: r }))); break; case 'MX': const mxRecords = await this.resolver.resolveMx(domain); records.push(...mxRecords.map(r => ({ type: 'MX' as DnsRecordType, name: domain, value: r.exchange, priority: r.priority }))); break; case 'TXT': const txtRecords = await this.resolver.resolveTxt(domain); records.push(...txtRecords.map(r => ({ type: 'TXT' as DnsRecordType, name: domain, value: r.join('') }))); break; case 'NS': const nsRecords = await this.resolver.resolveNs(domain); records.push(...nsRecords.map(r => ({ type: 'NS' as DnsRecordType, name: domain, value: r }))); break; case 'SOA': const soaRecord = await this.resolver.resolveSoa(domain); if (soaRecord) { records.push({ type: 'SOA' as DnsRecordType, name: domain, value: JSON.stringify(soaRecord) }); } break; case 'PTR': const ptrRecords = await this.resolver.resolvePtr(domain); records.push(...ptrRecords.map(r => ({ type: 'PTR' as DnsRecordType, name: domain, value: r }))); break; case 'SRV': const srvRecords = await this.resolver.resolveSrv(domain); records.push(...srvRecords.map(r => ({ type: 'SRV' as DnsRecordType, name: domain, value: r.name, priority: r.priority, weight: r.weight, port: r.port }))); break; case 'CAA': const caaRecords = await this.resolver.resolveCaa(domain); records.push(...caaRecords.map(r => ({ type: 'CAA' as DnsRecordType, name: domain, value: `${r.critical ? '128' : '0'} ${r.issue || r.issuewild || r.iodef || ''}` }))); break; default: throw new Error(`Unsupported record type: ${recordType}`); } return { domain, recordType, records, queryTime: Date.now() - startTime, server: this.config.servers[0], timestamp: new Date().toISOString() }; } catch (error: any) { throw { code: error.code || 'UNKNOWN_ERROR', message: error.message || 'An unknown error occurred', domain, recordType } as DnsError; } }
- src/tools/schemas.ts:7-12 (schema)Zod schema defining the input parameters for the dns_lookup tool, including domain, recordType, useCustomServer, and timeout.export const DnsLookupSchema = z.object({ domain: z.string().min(1).describe('The domain name to lookup'), recordType: DnsRecordTypeSchema.default('A').describe('The type of DNS record to query'), useCustomServer: z.boolean().optional().describe('Use custom DNS server if configured'), timeout: z.number().min(100).max(30000).optional().describe('Query timeout in milliseconds') });
- src/index.ts:47-74 (registration)Registration of the 'dns_lookup' tool in the MCP server's TOOLS array, including name, description, and input schema definition.{ name: 'dns_lookup', description: 'Perform DNS lookup for a domain to retrieve various record types (A, AAAA, MX, TXT, etc.)', inputSchema: { type: 'object', properties: { domain: { type: 'string', description: 'The domain name to lookup' }, recordType: { type: 'string', enum: ['A', 'AAAA', 'CNAME', 'MX', 'TXT', 'NS', 'SOA', 'PTR', 'SRV', 'CAA'], default: 'A', description: 'The type of DNS record to query' }, useCustomServer: { type: 'boolean', description: 'Use custom DNS server if configured' }, timeout: { type: 'number', description: 'Query timeout in milliseconds' } }, required: ['domain'] } },
- src/index.ts:165-182 (handler)MCP server request handler case for 'dns_lookup', which parses input using DnsLookupSchema and delegates to DnsResolver.lookup.case 'dns_lookup': { const input = DnsLookupSchema.parse(args) as DnsLookupInput; logger.info(`DNS lookup request for ${input.domain} (${input.recordType})`); const result = await dnsResolver.lookup( input.domain, input.recordType as DnsRecordType, input.timeout ); logger.debug('DNS lookup result', result); return { content: [ { type: 'text', text: JSON.stringify(result, null, 2) } ] }; }
- src/types/dns.ts:13-20 (schema)TypeScript interface defining the output structure of the dns_lookup tool.export interface DnsLookupResult { domain: string; recordType: DnsRecordType; records: DnsRecord[]; queryTime: number; server?: string; timestamp: string; }