Skip to main content
Glama
AcuityScan

AcuityScan MCP Server

Official
by AcuityScan

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

TableJSON Schema
NameRequiredDescriptionDefault
domainYesDomain 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,
    },
  • 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" },
    };
  • 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}` }],
        };
      }
    });
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully bears the burden of behavioral disclosure. It lists a comprehensive set of checks (SPF, DKIM with 16 selectors, DMARC, etc.), giving the agent a clear picture of what the tool does. It does not explicitly state that it is read-only and non-destructive, but the nature of the checks implies that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that front-loads the main function and lists many checks concisely, followed by a usage guideline. It is efficient but could be slightly more readable with splitting, hence a 4.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has only one parameter, no output schema, and no annotations, the description provides a very complete picture of what the tool checks and when to use it. It leaves no significant gaps for the agent to interpret.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% coverage with a clear description for the single 'domain' parameter. The tool description adds usage context but does not further clarify the parameter beyond the schema. Thus, it meets the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Email deliverability deep check' and enumerates specific checks (SPF, DKIM, DMARC, etc.), making the tool's purpose unmistakable. It distinguishes from sibling tools like acuityscan_dns by focusing exclusively on email deliverability.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly mentions when to use: 'when the user asks about email auth, deliverability, blacklists, or "why aren't my emails getting through".' This provides clear guidance on usage scenarios, though it does not mention when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

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/AcuityScan/mcp'

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