acuityscan_email
Analyze email authentication and deliverability with a comprehensive scan of SPF, DKIM, DMARC, MX, BIMI, MTA-STS, TLSRPT, reverse DNS, and 77 blacklists to identify why emails aren't reaching inboxes.
Instructions
Email deliverability deep check — SPF, DKIM (16 selectors), DMARC, MX, BIMI, MTA-STS, TLSRPT, reverse DNS, 77 RBL blacklists, and Google/Yahoo bulk-sender compliance. Use when the user asks about email auth, deliverability, blacklists, or 'why aren't my emails getting through'.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain to scan, e.g. 'example.com'. Don't include protocol or path. |
Implementation Reference
- src/index.ts:72-77 (registration)Tool definition registration in TOOLS array — declares 'acuityscan_email' with description and DOMAIN_SCHEMA input schema.
{ name: "acuityscan_email", description: "Email deliverability deep check — SPF, DKIM (16 selectors), DMARC, MX, BIMI, MTA-STS, TLSRPT, reverse DNS, 77 RBL blacklists, and Google/Yahoo bulk-sender compliance. Use when the user asks about email auth, deliverability, blacklists, or 'why aren't my emails getting through'.", inputSchema: DOMAIN_SCHEMA, }, - src/index.ts:46-57 (schema)DOMAIN_SCHEMA — the shared input schema for acuityscan_email (and all other tools), requiring a single 'domain' string argument.
const DOMAIN_SCHEMA: Tool["inputSchema"] = { type: "object", properties: { domain: { type: "string", description: "Domain to scan, e.g. 'example.com'. Don't include protocol or path.", }, }, required: ["domain"], additionalProperties: false, }; - src/index.ts:124-135 (registration)ENDPOINT_FOR_TOOL mapping — maps 'acuityscan_email' to POST /api/v1/tools/email for REST API dispatch.
const ENDPOINT_FOR_TOOL: Record<string, { method: "GET" | "POST"; path: string }> = { acuityscan_full_scan: { method: "POST", path: "/api/v1/scan" }, acuityscan_latest_scan: { method: "GET", path: "/api/v1/scan/latest" }, acuityscan_email: { method: "POST", path: "/api/v1/tools/email" }, acuityscan_dns: { method: "POST", path: "/api/v1/tools/dns" }, acuityscan_ssl: { method: "POST", path: "/api/v1/tools/ssl" }, acuityscan_performance: { method: "POST", path: "/api/v1/tools/performance" }, acuityscan_seo: { method: "POST", path: "/api/v1/tools/seo" }, acuityscan_accessibility: { method: "POST", path: "/api/v1/tools/accessibility" }, acuityscan_privacy: { method: "POST", path: "/api/v1/tools/privacy" }, acuityscan_mobile: { method: "POST", path: "/api/v1/tools/mobile" }, }; - src/index.ts:148-225 (handler)CallToolRequestSchema handler — generic handler that dispatches all tools (including acuityscan_email) by looking up the endpoint in ENDPOINT_FOR_TOOL, POSTs the domain, and returns the JSON response.
server.setRequestHandler(CallToolRequestSchema, async (req) => { const { name, arguments: args } = req.params; const endpoint = ENDPOINT_FOR_TOOL[name]; if (!endpoint) { return { isError: true, content: [{ type: "text", text: `Unknown tool: ${name}` }], }; } const domain = typeof args?.domain === "string" ? args.domain.trim() : ""; if (!domain) { return { isError: true, content: [{ type: "text", text: 'Missing required argument: "domain".' }], }; } // Performance + accessibility have long natural runtimes — call needs // a generous timeout. Other endpoints finish in well under 60s. const heavyTools = new Set(["acuityscan_performance", "acuityscan_accessibility", "acuityscan_full_scan"]); const timeoutMs = heavyTools.has(name) ? 300_000 : 60_000; try { const url = endpoint.method === "GET" ? `${API_BASE}${endpoint.path}?domain=${encodeURIComponent(domain)}` : `${API_BASE}${endpoint.path}`; const res = await fetch(url, { method: endpoint.method, headers: { Authorization: `Bearer ${API_KEY}`, "Content-Type": "application/json", "User-Agent": `acuityscan-mcp/0.1.0`, }, body: endpoint.method === "POST" ? JSON.stringify({ domain }) : undefined, signal: AbortSignal.timeout(timeoutMs), }); const text = await res.text(); let json: unknown; try { json = JSON.parse(text); } catch { json = { raw: text }; } if (!res.ok) { const err = json as { error?: string; code?: string }; return { isError: true, content: [ { type: "text", text: `AcuityScan API error (${res.status} ${err?.code ?? "unknown"}): ${err?.error ?? text}`, }, ], }; } return { content: [{ type: "text", text: JSON.stringify(json, null, 2) }], }; } catch (err) { const msg = err instanceof Error ? err.name === "TimeoutError" ? `Scan timed out after ${timeoutMs / 1000}s.` : err.message : String(err); return { isError: true, content: [{ type: "text", text: `Request failed: ${msg}` }], }; } });