Skip to main content
Glama

Cooper Email

Verify a custom domain now

cooper_verify_domain

Use this when DNS for a custom domain may have been published and you should check it now instead of waiting for the daily cron. Requires auth. Inputs: domain_id (required; the dom_… id from cooper_add_domain or cooper_list_domains). At most once per 60 seconds; the next call returns HTTP 429 rate_limited with Retry-After. Runs the same DNS check as the cron, stores per-record status (valid, missing, or invalid), found, and hint, plus warnings, and returns the domain. hint is null when the record is valid or no specific mistake was found. warnings is an empty array when none. For dns.mode external the check reads public DNS for the receiving MX, return-path, DKIM, and verify TXT. Fires domain.verified once when status moves from pending to verified. Custom domains are included on Starter (15) and Pro (200). Free includes 1. Past that cap is HTTP 402 plan_limit_exceeded. Publish exactly the records returned, with their host, type, value, priority for MX, and ttl. The receiving MX hostname and the DKIM value come from that response. Do not invent them. dns.mode automatic means Cooper wrote the records in an active Cloudflare zone it already controls. dns.mode external means you publish them at your DNS host. Cooper does not register a domain, create a zone, or move nameservers. Keep one SPF TXT with a single include; an existing SPF is merged into it. A DMARC p=reject record is left as published and blocks mail until DKIM for that domain verifies. mail.receiving and mail.sending stay false until the matching records verify. Then POST /api/v1/inboxes with domain creates username@domain. Failure codes: unauthorized, domain_not_found, rate_limited.

Input Schema

NameRequiredDescriptionDefault
domain_idYesDomain id (dom_…) from cooper_add_domain or cooper_list_domains

Output Schema

NameRequiredDescriptionDefault
idNoDomain id (dom_…). Pass it as domain_id to cooper_verify_domain.
dnsNo{mode}: automatic when Cooper wrote the records, external when you publish them.
mailNo{receiving, sending, inboxes} flags. Each turns true once its records verify.
domainNoHostname of the custom domain.
statusNopending until DNS matches, then verified.
noticesNoUsage notices, such as [{type: limit_warning, resource, used, limit, upgrade_url}] at 80 percent of a plan limit.
recordsNoDNS records to publish [{host, type, value, priority, ttl, status, found, hint}]. Publish exactly these.
warningsNoProblems found in existing DNS, such as existing_mail_provider. Empty when none.
created_atNoISO-8601 time the object was created.
idempotentNoTrue when this result replays an earlier request with the same key instead of acting again.
status_detailNoPlain-language note on what is still pending.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "additionalProperties": true,
      +  "description": "The domain after a fresh DNS check.",
      +  "properties": {
      +    "created_at": {
      +      "description": "ISO-8601 time the object was created."
      +    },
      +    "dns": {
      +      "description": "{mode}: automatic when Cooper wrote the records, external when you publish them."
      +    },
      +    "domain": {
      +      "description": "Hostname of the custom domain."
      +    },
      +    "id": {
      +      "description": "Domain id (dom_…). Pass it as domain_id to cooper_verify_domain."
      +    },
      +    "idempotent": {
      +      "description": "True when this result replays an earlier request with the same key instead of acting again."
      +    },
      +    "mail": {
      +      "description": "{receiving, sending, inboxes} flags. Each turns true once its records verify."
      +    },
      +    "notices": {
      +      "description": "Usage notices, such as [{type: limit_warning, resource, used, limit, upgrade_url}] at 80 percent of a plan limit."
      +    },
      +    "records": {
      +      "description": "DNS records to publish [{host, type, value, priority, ttl, status, found, hint}]. Publish exactly these."
      +    },
      +    "status": {
      +      "description": "pending until DNS matches, then verified."
      +    },
      +    "status_detail": {
      +      "description": "Plain-language note on what is still pending."
      +    },
      +    "warnings": {
      +      "description": "Problems found in existing DNS, such as existing_mail_provider. Empty when none."
      +    }
      +  },
      +  "type": "object"
      +}
  2. Added

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the annotations, the description discloses authentication requirements, rate limiting, what gets stored per DNS record, the exact return fields and their null/empty semantics, event emission (domain.verified), plan caps with HTTP 402, dns.mode behavior, SPF/DMARC handling, and the mail.receiving/mail.sending gating logic. This is far richer than the annotations alone and is consistent with readOnlyHint=false.

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 front-loaded with the when-to-use condition and the rate-limit constraint, then proceeds through behavioral details. It is long and dense for a one-parameter tool, and a few details (such as the final inbox creation note) are tangential, but most sentences carry actionable information for correct invocation.

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's open-world DNS behavior, mutation side effects, and single-parameter schema, the description covers everything an agent needs: prerequisites, rate limits, failure codes, return semantics, dns.mode distinctions, plan limits, and downstream effects. An output schema exists, but the extra return-field explanation is still coherent and useful.

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?

Schema description coverage is 100%, and the single domain_id parameter is already fully documented in the schema. The description adds only a minor restatement that the id comes from cooper_add_domain or cooper_list_domains, which is essentially the same information.

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 opens with a specific verb and resource: checking DNS for a custom domain now rather than waiting for the daily cron. It is clearly distinguishable from sibling tools like cooper_add_domain and cooper_list_domains, which are referenced only as sources of the domain_id.

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

Usage Guidelines5/5

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

It explicitly states when to use this tool: after DNS may have been published, to check immediately instead of waiting for the cron. It also names the alternative behavior (daily cron) and gives a hard usage constraint: at most once per 60 seconds, with HTTP 429 on violation.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.