Skip to main content
Glama
cenemil

DNS MCP Server

by cenemil

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
NameRequiredDescriptionDefault
domainYesThe domain name to lookup
recordTypeNoThe type of DNS record to queryA
useCustomServerNoUse custom DNS server if configured
timeoutNoQuery timeout in milliseconds

Implementation Reference

  • 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; } }
  • 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'] } },
  • 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) } ] }; }
  • 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; }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/cenemil/dns-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server