Skip to main content
Glama
Davison-Francis

@deliveriq/mcp

Verify Email Address

deliveriq_verify_email
Idempotent

Verify email deliverability with syntax, MX, SMTP, disposable, and role-based checks. Returns reachability status (safe/risky/invalid/unknown) and a 0-100 score.

Instructions

Verify a single email address for deliverability. Returns reachability status (safe/risky/invalid/unknown), a 0-100 score, and detailed checks (syntax, MX, SMTP, disposable, role-based, etc.).

Args:

  • email (string): Email address to verify

  • skip_smtp (boolean): Skip SMTP check (faster, default: false)

  • check_gravatar (boolean): Check for Gravatar profile (default: false)

  • check_hibp (boolean): Check Have I Been Pwned breaches (default: false)

  • include_intelligence (boolean): Include DNSBL, spam trap, domain age, infrastructure analysis (default: false)

Returns: Markdown report with reachability, score, and check details.

Examples:

  • "Is john@acme.com a valid email?" -> { email: "john@acme.com" }

  • "Deep check on user@example.com" -> { email: "user@example.com", include_intelligence: true, check_hibp: true }

Credit cost: 1 credit (0 if syntax is invalid)

Error Handling:

  • Returns "Authentication failed..." if API key is invalid

  • Returns "Insufficient credits..." if balance is 0

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
emailYesEmail address to verify (e.g. "user@example.com")
skip_smtpNoSkip SMTP verification step (faster but less accurate)
check_gravatarNoCheck if email has a Gravatar profile
check_hibpNoCheck if email appears in Have I Been Pwned breach data
include_intelligenceNoInclude deep intelligence (DNSBL, spam trap, domain age, infrastructure)

Implementation Reference

  • The handler function for deliveriq_verify_email. Calls client.verify() with the email address and optional flags (skip_smtp, check_gravatar, check_hibp, include_intelligence), then formats the result into a Markdown report with reachability status, score, and detailed checks (syntax, MX, SMTP, disposable, gravatar, DNSBL, spam trap, infrastructure, HIBP).
      async (params) => {
        try {
          const res = await client.verify({
            email: params.email,
            options: {
              skipSmtp: params.skip_smtp,
              checkGravatar: params.check_gravatar,
              checkHibp: params.check_hibp,
              includeIntelligence: params.include_intelligence,
            },
          });
    
          const r = res.result;
          const lines: string[] = [
            `# Email Verification: ${r.email}`,
            '',
            `**Reachability**: ${r.reachability.toUpperCase()} | **Score**: ${r.score}/100 | **Credits Used**: ${res.creditsUsed}`,
            '',
            '## Checks',
            `- **Syntax**: ${r.syntax.valid ? 'Valid' : 'Invalid'}${r.syntax.error ? ` (${r.syntax.error})` : ''}`,
            `- **MX Records**: ${r.mx.valid ? `Valid (${r.mx.records.length} records)` : 'No MX records'}`,
            `- **SMTP**: ${r.smtp.isDeliverable === true ? 'Deliverable' : r.smtp.isDeliverable === false ? 'Not deliverable' : 'Unknown'} | Catch-all: ${r.smtp.isCatchAll ? 'Yes' : 'No'}`,
            `- **Disposable**: ${r.misc.isDisposable ? 'Yes' : 'No'} | Role-based: ${r.misc.isRoleBased ? 'Yes' : 'No'} | Free provider: ${r.misc.isFreeProvider ? 'Yes' : 'No'}`,
          ];
    
          if (r.misc.hasGravatar) lines.push('- **Gravatar**: Found');
          if (r.suggestion) lines.push(`- **Did you mean**: ${r.suggestion}`);
    
          if (r.intelligence?.dnsbl) {
            const d = r.intelligence.dnsbl;
            lines.push(`- **DNSBL**: ${d.listed ? `Listed on ${d.hits.filter((h) => h.listed).length}/${d.checkedZones} zones` : `Clean (${d.checkedZones} zones checked)`}`);
          }
          if (r.intelligence?.spamTrapClassification) {
            const s = r.intelligence.spamTrapClassification;
            lines.push(`- **Spam Trap**: ${s.riskLevel} risk (type: ${s.trapType}, confidence: ${(s.confidence * 100).toFixed(0)}%)`);
          }
          if (r.intelligence?.infrastructure) {
            const i = r.intelligence.infrastructure;
            lines.push(`- **Infrastructure**: Score ${i.score}/100 | SPF: ${i.hasSpf ? 'Yes' : 'No'} | DKIM: ${i.hasDkim ? 'Yes' : 'No'} | DMARC: ${i.hasDmarc ? 'Yes' : 'No'}`);
          }
          if (r.intelligence?.hibp) {
            lines.push(`- **HIBP**: ${r.intelligence.hibp.breached ? `Breached (${r.intelligence.hibp.breachCount} breaches)` : 'No breaches found'}`);
          }
    
          lines.push('', `*Verified in ${r.durationMs}ms*`);
          return successResponse(lines.join('\n'));
        } catch (error) {
          return handleSdkError(error);
        }
      },
    );
  • Zod schema defining input validation for deliveriq_verify_email. Accepts: email (required, must be valid email), skip_smtp (boolean, default false), check_gravatar (boolean, default false), check_hibp (boolean, default false), include_intelligence (boolean, default false).
    export const VerifyEmailSchema = z.object({
      email: z.string().email('Must be a valid email address')
        .describe('Email address to verify (e.g. "user@example.com")'),
      skip_smtp: z.boolean().default(false)
        .describe('Skip SMTP verification step (faster but less accurate)'),
      check_gravatar: z.boolean().default(false)
        .describe('Check if email has a Gravatar profile'),
      check_hibp: z.boolean().default(false)
        .describe('Check if email appears in Have I Been Pwned breach data'),
      include_intelligence: z.boolean().default(false)
        .describe('Include deep intelligence (DNSBL, spam trap, domain age, infrastructure)'),
    }).strict();
  • Registration of the tool 'deliveriq_verify_email' on the MCP server within the registerVerificationTools function. Called from index.ts line 39.
      server.registerTool(
        'deliveriq_verify_email',
        {
          title: 'Verify Email Address',
          description: `Verify a single email address for deliverability. Returns reachability status (safe/risky/invalid/unknown), a 0-100 score, and detailed checks (syntax, MX, SMTP, disposable, role-based, etc.).
    
    Args:
      - email (string): Email address to verify
      - skip_smtp (boolean): Skip SMTP check (faster, default: false)
      - check_gravatar (boolean): Check for Gravatar profile (default: false)
      - check_hibp (boolean): Check Have I Been Pwned breaches (default: false)
      - include_intelligence (boolean): Include DNSBL, spam trap, domain age, infrastructure analysis (default: false)
    
    Returns:
      Markdown report with reachability, score, and check details.
    
    Examples:
      - "Is john@acme.com a valid email?" -> { email: "john@acme.com" }
      - "Deep check on user@example.com" -> { email: "user@example.com", include_intelligence: true, check_hibp: true }
    
    Credit cost: 1 credit (0 if syntax is invalid)
    
    Error Handling:
      - Returns "Authentication failed..." if API key is invalid
      - Returns "Insufficient credits..." if balance is 0`,
          inputSchema: VerifyEmailSchema,
          annotations: {
            readOnlyHint: false,
            destructiveHint: false,
            idempotentHint: true,
            openWorldHint: true,
          },
        },
        async (params) => {
          try {
            const res = await client.verify({
              email: params.email,
              options: {
                skipSmtp: params.skip_smtp,
                checkGravatar: params.check_gravatar,
                checkHibp: params.check_hibp,
                includeIntelligence: params.include_intelligence,
              },
            });
    
            const r = res.result;
            const lines: string[] = [
              `# Email Verification: ${r.email}`,
              '',
              `**Reachability**: ${r.reachability.toUpperCase()} | **Score**: ${r.score}/100 | **Credits Used**: ${res.creditsUsed}`,
              '',
              '## Checks',
              `- **Syntax**: ${r.syntax.valid ? 'Valid' : 'Invalid'}${r.syntax.error ? ` (${r.syntax.error})` : ''}`,
              `- **MX Records**: ${r.mx.valid ? `Valid (${r.mx.records.length} records)` : 'No MX records'}`,
              `- **SMTP**: ${r.smtp.isDeliverable === true ? 'Deliverable' : r.smtp.isDeliverable === false ? 'Not deliverable' : 'Unknown'} | Catch-all: ${r.smtp.isCatchAll ? 'Yes' : 'No'}`,
              `- **Disposable**: ${r.misc.isDisposable ? 'Yes' : 'No'} | Role-based: ${r.misc.isRoleBased ? 'Yes' : 'No'} | Free provider: ${r.misc.isFreeProvider ? 'Yes' : 'No'}`,
            ];
    
            if (r.misc.hasGravatar) lines.push('- **Gravatar**: Found');
            if (r.suggestion) lines.push(`- **Did you mean**: ${r.suggestion}`);
    
            if (r.intelligence?.dnsbl) {
              const d = r.intelligence.dnsbl;
              lines.push(`- **DNSBL**: ${d.listed ? `Listed on ${d.hits.filter((h) => h.listed).length}/${d.checkedZones} zones` : `Clean (${d.checkedZones} zones checked)`}`);
            }
            if (r.intelligence?.spamTrapClassification) {
              const s = r.intelligence.spamTrapClassification;
              lines.push(`- **Spam Trap**: ${s.riskLevel} risk (type: ${s.trapType}, confidence: ${(s.confidence * 100).toFixed(0)}%)`);
            }
            if (r.intelligence?.infrastructure) {
              const i = r.intelligence.infrastructure;
              lines.push(`- **Infrastructure**: Score ${i.score}/100 | SPF: ${i.hasSpf ? 'Yes' : 'No'} | DKIM: ${i.hasDkim ? 'Yes' : 'No'} | DMARC: ${i.hasDmarc ? 'Yes' : 'No'}`);
            }
            if (r.intelligence?.hibp) {
              lines.push(`- **HIBP**: ${r.intelligence.hibp.breached ? `Breached (${r.intelligence.hibp.breachCount} breaches)` : 'No breaches found'}`);
            }
    
            lines.push('', `*Verified in ${r.durationMs}ms*`);
            return successResponse(lines.join('\n'));
          } catch (error) {
            return handleSdkError(error);
          }
        },
      );
  • Credit cost configuration: deliveriq_verify_email costs 1 credit.
    export const CREDIT_COSTS: Record<string, number | string> = {
      deliveriq_verify_email: 1,
      deliveriq_batch_verify: '1 per email',
      deliveriq_batch_status: 0,
      deliveriq_batch_download: 0,
      deliveriq_list_jobs: 0,
      deliveriq_find_email: 2,
      deliveriq_blacklist_check: 1,
      deliveriq_infrastructure_check: 1,
      deliveriq_spam_trap_analysis: 1,
      deliveriq_domain_intel: 1,
      deliveriq_org_intel: 0,
      deliveriq_check_credits: 0,
    };
Behavior4/5

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

Annotations already declare idempotentHint=true, but the description adds valuable behavioral details: credit cost (1 credit, 0 if invalid), error handling (auth failure, insufficient credits), and return format (Markdown report). These go beyond annotations. Minor missing info about rate limits, but overall good.

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

Conciseness5/5

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

The description is well-structured: purpose sentence, Args list, Returns, Examples, Credit cost, Error Handling. Every sentence earns its place. Front-loaded with the core action. No redundant text. Appropriate length for a tool with 5 params.

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

Completeness4/5

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

Given 5 parameters, no output schema, and diverse siblings, the description covers essential aspects: action, parameters, return format, credit cost, error conditions. It lacks contrast with siblings and does not detail the 0-100 score scale, but these are minor gaps. Overall sufficient for an agent to invoke correctly.

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?

Input schema has 100% description coverage, so the baseline is 3. The description restates parameter purposes and adds examples, but does not significantly extend the meaning beyond the schema. Credit cost info is somewhat param-related but not semantic. No new constraints or formatting details.

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 starts with a specific verb+resource: 'Verify a single email address for deliverability'. It clearly distinguishes from siblings like deliveriq_batch_verify (bulk) and deliveriq_find_email (search). The examples reinforce the one-off verification use case.

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

Usage Guidelines3/5

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

The description implies usage for single email verification and provides example queries, but does not explicitly state when to use this tool versus alternatives like batch verification or domain intelligence. No when-not or exclusion criteria are given, so the agent must infer context from sibling tool names.

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/Davison-Francis/min8t-sdks'

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