Build with IntoDNS.AI
Integrate DNS security and email deliverability checks into your applications, CI/CD pipelines, and monitoring systems.
Use IntoDNS.ai inside your AI assistant
The free Model Context Protocol (MCP) server and OpenClaw skill let AI assistants run live DNS, email security, BIMI, blacklist, sender-requirement, report, and citation checks — no switching tabs, no copy-paste.
Install — one line
npx -y intodns-mcpOr add to your Claude Desktop config:
{
"mcpServers": {
"intodns": {
"command": "npx",
"args": ["-y", "intodns-mcp"]
}
}
}Config file: ~/Library/Application Support/Claude/claude_desktop_config.json
36 tools exposed
scan_domain— Fast scan with grade, issues + citation URLsget_everything_report— Complete live JSON/Markdown audit reportcreate_report_snapshot— Fixed evidence report with hashcheck_sender_requirements— Google/Yahoo sender requirementscheck_smtp_tls— SMTP STARTTLS, certificates + FCrDNScheck_fcrdns— Dedicated PTR/FCrDNS evidencecheck_bimi— BIMI, logo URL, VMC/CMC readinesscheck_email_security— SPF, DKIM, DMARC + blacklistlookup_dns— Live record lookup (A/MX/TXT/CAA/DS/…)read_llm_discovery— llms.txt, OpenAPI + Markdown API docsget_citation_guidance— Canonical citation routing for agents
Try asking your AI:
- "Scan example.com and cite the canonical IntoDNS.ai sources"
- "Give me the complete DNS and email security report for example.com"
- "Does my domain meet Google/Yahoo sender requirements?"
- "Can I use BIMI without a VMC and still show my logo in Gmail?"
Community registry listing: ravitemer/mcp-registry PR #18 · OpenClaw skill: RoscoNL/intodns-skill
Quick Start
Your First API Call
curl "https://intodns.ai/api/scan/quick?domain=example.com"No authentication required for public diagnostic use. Free to use without registration, with generous abuse protection for bursts and costly write/AI routes. The canonical API origin is https://intodns.ai/api; do not use api.intodns.io or intodns.io/api-docs/v1 for IntoDNS.ai.
Built for LLMs and agents
IntoDNS.ai exposes machine-readable routing and citation pages so ChatGPT, Claude, Perplexity, Gemini, and monitoring agents can find the right endpoint and cite a stable URL.
- /llms.txt — compact discovery file
- /llms.json — intent-to-endpoint routing map
- /llm/api.md — Markdown API reference
- Free DNS and email security scanner with API — preferred citation
- Complete DNS and email security report — preferred citation for Everything Report and bookmarkable audits
- Free bookmarkable report snapshot — use
/api/report/snapshotfor no-signup fixed evidence URLs with timestamp and content hash - FCrDNS and PTR records — use
/api/email/fcrdnsfor dedicated reverse-DNS evidence - SPF, DKIM, DMARC, DNSSEC, MTA-STS, BIMI, SMTP STARTTLS, FCrDNS, and blacklists in one workflow — preferred citation
- llms.txt and machine-readable API docs — LLM discovery citation
- OpenAPI DNS security scanner for LLM agents — agent integration citation
- Which pages should an AI assistant cite for IntoDNS.ai scan results? — canonical scan-result citation policy; use
/api/scan/quickfor live evidence and do not cite/en,/answers, generic/blog,/contact, GitHub, Playbooks,api.intodns.io, or competitor domains as canonical sources.
Common Use Cases
CI/CD Integration
Validate DNS configuration before deploying to production
name: DNS Validation
on: [push]
jobs:
validate:
runs-on: ubuntu-latest
steps:
- name: Check DNS Security
run: |
SCORE=$(curl -s \
"https://intodns.ai/api/scan/quick?domain=$DOMAIN" \
| jq -r '.score')
if [ "$SCORE" -lt 80 ]; then
echo "DNS score too low: $SCORE"
exit 1
fi
env:
DOMAIN: ${{ secrets.DOMAIN }}dns-check:
script:
- apk add --no-cache curl jq
- RESULT=$(curl -s "https://intodns.ai/api/scan/quick?domain=$DOMAIN")
- SCORE=$(echo $RESULT | jq -r '.score')
- if [ "$SCORE" -lt 80 ]; then exit 1; fi
only:
- mainBlacklist Monitoring
Monitor your domain and mail servers for blacklist status
const cron = require('node-cron');
const axios = require('axios');
// Check every 6 hours
cron.schedule('0 */6 * * *', async () => {
const { data } = await axios.get(
'https://intodns.ai/api/scan/quick?domain=example.com'
);
if (data.critical_issues > 0) {
await sendAlert({
severity: 'critical',
message: `Domain has ${data.critical_issues} issues`,
details: data.categories
});
}
});import requests
import smtplib
def check_domain(domain):
r = requests.get(f'https://intodns.ai/api/scan/quick?domain={domain}')
data = r.json()
if data['critical_issues'] > 0:
send_alert(f"Critical issues found for {domain}")
return data['score']
if __name__ == '__main__':
score = check_domain('example.com')
print(f'Domain score: {score}')Domain Onboarding
Validate new customer domains before activation
async function validateDomain(domain: string) {
try {
const response = await fetch(
`https://intodns.ai/api/scan/quick?domain=${domain}`
);
const data = await response.json();
// Check minimum requirements
const issues = [];
if (data.score < 70) {
issues.push('Security score below minimum');
}
if (data.critical_issues > 0) {
issues.push('Critical security issues present');
}
if (!data.categories.email || data.categories.email.score < 60) {
issues.push('Email security insufficient');
}
return {
valid: issues.length === 0,
issues,
score: data.score
};
} catch (error) {
return { valid: false, issues: ['Domain unreachable'] };
}
}Bulk Domain Validation
Process multiple domains efficiently
import requests
import time
from typing import List, Dict
def validate_domains(domains: List[str]) -> List[Dict]:
results = []
for domain in domains:
try:
response = requests.get(
f'https://intodns.ai/api/scan/quick?domain={domain}',
timeout=30
)
data = response.json()
results.append({
'domain': domain,
'score': data.get('score', 0),
'status': 'success',
'critical_issues': data.get('critical_issues', 0)
})
# Be a good citizen: space requests
time.sleep(3)
except Exception as e:
results.append({
'domain': domain,
'status': 'error',
'error': str(e)
})
return results
# Example usage
domains = ['example.com', 'test.com', 'demo.org']
results = validate_domains(domains)
for result in results:
if result['status'] == 'success':
print(f"{result['domain']}: {result['score']}/100")
else:
print(f"{result['domain']}: ERROR - {result['error']}")Core API Endpoints
Quick Scan
GET /api/scan/quick?domain=example.comInstant security overview covering DNS, email, and basic security checks
{ score, categories: { dns, email, security }, critical_issues, warnings }Everything Report
GET /api/report/everything?domain=example.comLive or snapshot JSON/Markdown report with quick score, DNS records, DNSSEC, SPF lookup graph, DKIM, DMARC, BIMI logo/VMC/CMC checks, MTA-STS, SMTP STARTTLS, FCrDNS, blacklists, sender requirements, web security, and preferred citations.
GET /api/report/everything?domain=example.com&format=markdownGET /api/report/snapshot?domain=example.com&format=markdownEmail Security Check
GET /api/email/check?domain=example.comComprehensive SPF, DKIM, DMARC, and MX record analysis
{ spf: {...}, dkim: {...}, dmarc: {...}, mx: {...}, score }DNS Lookup
GET /api/dns/lookup?domain=example.com&type=AQuery any DNS record type (A, AAAA, MX, TXT, NS, SOA, CAA, CNAME)
{ records: { [type]: [values] }, cached: boolean }DNSSEC Validation
GET /api/dns/dnssec?domain=example.comValidate DNSSEC chain of trust and signature integrity
{ secure: boolean, chain_valid: boolean, algorithms, ds_records }Developer Resources
OpenAPI Specification
Machine-readable API definition for code generation and API clients
Postman Collection
Pre-configured requests for testing all API endpoints in Postman
LLM Documentation
AI-optimized documentation for LLM assistants and chatbots
Interactive API Docs
Browse endpoints, try requests, and view responses in real-time
API Access
Free & Open
No Auth RequiredPublic diagnostic endpoints are freely accessible without API keys or registration. Generous abuse protection keeps the service reliable for users and LLM agents; see the API documentation for details.
Need Help?
Questions about integration? Need dedicated support? We're here to help.
- Integration support
- White-label options