# run.domani/domani (remote · domani.run)

Internet identity for AI agents: register or broker domains, email, DNS - pay by card or USDC.

- Trust score: 80/100 (high trust)
- Change this week: +9
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- remote · `domani.run`: 80/100 (this document), [markdown](https://verifymcp.io/servers/run-domani-domani/domani.md), [page](https://verifymcp.io/servers/run-domani-domani/domani)

## Channel facts

- Endpoint: `https://domani.run/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `0.4.15`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Endpoint Security**: 91/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation is enforced on tool calls, but the challenge carries no valid RFC 9728 metadata, so a client cannot discover where to get a token.
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC is configured correctly; the domain's records validate against the full chain to the root.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 72/100
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 13023 tokens (~106/item across 122 items; 122 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 99/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 97% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add --transport http run-domani-domani https://domani.run/mcp
```

### Codex

```toml
[mcp_servers.run-domani-domani]
url = "https://domani.run/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "run-domani-domani": {
      "type": "remote",
      "url": "https://domani.run/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add run-domani-domani --url https://domani.run/mcp --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  run-domani-domani:
    url: "https://domani.run/mcp"
```

### Other

```json
{
  "mcpServers": {
    "run-domani-domani": {
      "type": "http",
      "url": "https://domani.run/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-03 (score 80, +1)

No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-08-01 (score 79, +1)

No change was recorded against any check on this day. Stability & Change Management went from 17 to 20. That category is still filling its 30-day observation window: 5 days of observed history at the previous scan, 6 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-31 (score 78, +5)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 73, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-29 (score 73, +1)

No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-28 (score 72, +1)

No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes. Other categories moved too: Schema Quality & AI Usability rose 2.

### 2026-07-27 (score 71, +1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-26 (score 70)

First indexed and scored.

## MCP tools (122)

### `get_account` (~36 tokens)

Get Account

Get your account details, payment status, contact info status (has_contact), and referral code. Contact info must be set before purchasing domains.

### `get_activation` (~33 tokens)

Get Activation

Get truthful product milestones and the next useful actions for this account. Use this after authentication instead of treating token setup as success.

### `search` (~181 tokens)

Search Domains

Check availability and price for one or more domains. Pass full domain names (e.g. mysite.com). For bulk TLD search, pass an array like ["myapp.com", "myapp.io", "myapp.dev"]. Uses RDAP + retail pricing.

Input parameters:

- `domains` (array, required): Full domain names to check, e.g. ["myapp.com", "myapp.io"]
- `max_price` (number): Maximum price in USD to filter results
- `order` (string): Sort order (default: asc)
- `sort` (string): Sort results by price or TLD name (default: price)
- `source` (string): Filter results: 'all' (default), 'primary' (new registrations only), 'secondary' (marketplace listings only). Use source='secondary' with domains=['*'] to browse all marketplace listings.

### `suggest_domains` (~211 tokens)

Suggest Domains

AI-powered domain suggestions. Given a project description, generates full domain names with creative TLDs (e.g. codebuddy.dev, wavify.fm), checks availability, and returns only available domains with pricing.

Input parameters:

- `count` (number): Number of suggestions to return (default 10)
- `exclude` (array): Domains to exclude from suggestions (e.g. from previous calls)
- `lang` (string): Language/cultural inspiration: names will draw from this language's words, aesthetics, and culture
- `prompt` (string, required): Project description or keywords, e.g. 'AI coding assistant'
- `style` (string): Name style: 'single' (one word), 'creative' (evocative/metaphorical single word), 'short' (3-6 chars), 'brandable' (invented names), 'keyword' (descriptive)
- `tlds` (array): Preferred TLDs without dots (e.g. ['com', 'dev']). Results will prioritize these.

### `list_tlds` (~108 tokens)

List TLDs

List all available TLDs with registration and renewal pricing

Input parameters:

- `limit` (number): Max results to return
- `max_price` (number): Maximum registration price in USD
- `min_price` (number): Minimum registration price in USD
- `offset` (number): Pagination offset
- `order` (string): Sort order (default: asc)
- `search` (string): Filter TLDs containing this string
- `sort` (string): Sort field. Defaults to tld

### `dns_check` (~203 tokens)

DNS Check

Fast DNS-based domain existence check. Tests if a name is taken across many TLDs at once (faster than search, no pricing). Returns 'taken' (definitely registered) and 'candidates' (potentially available). Use this to narrow down before calling search for pricing. Use preset: 'extended' to check 30+ creative/exotic TLDs when basic ones are all taken.

Input parameters:

- `name` (string, required): Domain name without TLD, e.g. 'myapp'
- `preset` (string): Use a curated TLD preset: 'basic' (10 common TLDs) or 'extended' (30+ including creative/exotic TLDs). Merged with explicit tlds if both provided. Defaults to 'basic' when tlds is omitted.
- `tlds` (array): TLDs to check, e.g. ['com', 'dev', 'ai', 'io']. Optional if preset is provided.

### `buy_domain` (~326 tokens)

Buy Domain

Purchase one or more domains. Always confirm with the user before calling. Accepts a single domain or an array of up to 10 (card only for bulk). If the user wants to pay with crypto/USDC: call with payment_method: 'usdc' - you'll get a 402 with a wallet address and amount. Tell the user to send that amount in USDC, then once they give you the tx hash, retry with payment_tx and payment_chain. Don't explain protocol details to the user - just tell them the address, amount, and chain.

Input parameters:

- `domain` (string): Single domain to purchase, e.g. mysite.com
- `domains` (array): Array of domains to purchase, e.g. ["a.com", "b.dev"]. Max 10.
- `max_price` (number): Ceiling in USD for the total charge. If the real price is above it, the purchase fails with PRICE_ABOVE_MAX and nothing is charged. Set it from the price the user approved.
- `payment_chain` (string): Chain the USDC payment was sent on. Required with payment_tx.
- `payment_method` (string): Payment method: 'card' to charge card on file, 'usdc' to pay with USDC. Overrides the user's default preference for this request.
- `payment_tx` (string): Transaction hash of a USDC payment already sent on-chain. Required for step 2 of USDC flow.
- `years` (integer): Number of years to register (1-10, default 1). Price is multiplied by years.

### `buy_aftermarket` (~240 tokens)

Buy Aftermarket Domain

Buy a taken domain that's listed for sale on an aftermarket (Afternic/Sedo) at its buy-now price, natively - no external site. Use when search shows a domain with for_sale.buyable = true. Always confirm the price with the user first. Pass max_price to cap it. If the listing is make-offer only (not buyable), use acquire_domain (broker) to negotiate instead. Crypto/USDC works like buy_domain (402 -> pay -> retry with payment_tx).

Input parameters:

- `domain` (string, required): The taken, for-sale domain to buy, e.g. kami.world
- `max_price` (number): Hard ceiling in USD. Defaults to the listing's buy-now price. The purchase is rejected if the live price is above this.
- `payment_chain` (string): Chain the USDC payment was sent on. Required with payment_tx.
- `payment_method` (string): 'card' to charge the card on file, 'usdc' to pay with crypto.
- `payment_tx` (string): Tx hash of a USDC payment already sent on-chain (step 2 of the USDC flow).

### `provision_agent` (~232 tokens)

Provision Agent Identity

Give an AI agent a complete internet identity in one call: buy a domain, set up email, create a mailbox, and (optionally) register a webhook for inbound email. Use this when someone wants to 'give my agent a domain and email' or 'set up an agent from scratch'. Confirm the domain and price with the user first (it charges for the domain). The domain purchase is the only step that can fail the call; mailbox/webhook are best-effort and report warnings.

Input parameters:

- `domain` (string, required): Domain to give the agent, e.g. myagent.run. Bought if not already owned.
- `name` (string): Display name for outbound email.
- `payment_method` (string): How to pay for the domain: card, usdc, or balance (marketplace credit).
- `slug` (string): Mailbox local part, e.g. 'hi' for hi@domain. Default 'hi'.
- `webhook_url` (string): Optional HTTPS URL to receive inbound email + domain events.
- `years` (integer): Registration years (1-10, default 1).

### `list_domains` (~14 tokens)

List Domains

List all domains you own

### `get_dns` (~56 tokens)

Get DNS Records

Get DNS records for a domain you own. Returns each record with a stable id, plus a zone_version token - pass it to set_dns to detect concurrent zone changes.

Input parameters:

- `domain` (string, required): Domain name to get DNS records for

### `set_dns` (~185 tokens)

Set DNS Records

Upsert DNS records for a domain you own, at the rrset level: records at a (type, name) you send replace that rrset; rrsets you don't mention are preserved (NS never touched). An automatic zone backup is taken before every write. Best practice: call get_dns first and pass its zone_version so a concurrent change fails with DNS_VERSION_CONFLICT instead of being clobbered. Common patterns: Vercel (A @ 76.76.21.21), GitHub Pages (CNAME @ user.github.io), Cloudflare Pages (CNAME @ project.pages.dev)

Input parameters:

- `domain` (string, required): Domain name to set DNS records for
- `records` (array, required): Array of DNS records to set
- `zone_version` (string): The zone_version from get_dns - rejects the write with DNS_VERSION_CONFLICT if the zone changed since

### `snapshot_dns` (~72 tokens)

Snapshot DNS

Capture all DNS records for a domain via public DNS lookups. Discovers subdomains from CT logs, SPF, and common names. Stores a server-side backup. Use before migrations or transfers.

Input parameters:

- `domain` (string, required): Domain name to snapshot
- `extra_subdomains` (array): Additional subdomains to include

### `restore_dns` (~82 tokens)

Restore DNS

Restore DNS records from the server-side backup (created by snapshot_dns or during transfers). Uses diff to avoid duplicates. Call snapshot_dns first to create a backup. Pass dry_run to preview what would be applied without writing.

Input parameters:

- `domain` (string, required): Domain name to restore DNS for
- `dry_run` (boolean): Preview only - returns would_apply without writing anything

### `clone_dns` (~120 tokens)

Clone DNS

Copy the DNS setup of one domain you own onto another (e.g. brand.com → brand.dev with the same A/CNAME/MX). Merges by default (source wins on collisions, keeps the target's other records); set replace=true for an exact mirror.

Input parameters:

- `from_domain` (string, required): Source domain to copy DNS from (must be yours)
- `replace` (boolean): Exact mirror - drop target records the source doesn't have. Default: merge
- `to_domain` (string, required): Target domain to write the DNS onto (must be yours)

### `claim_identity` (~150 tokens)

Claim a free identity

Give your agent a free identity at <handle>.domani.run - a live profile page, no domain purchase, instantly. The frictionless way to start; upgrade to your own real domain later. Optional name/bio/emoji/email/links.

Input parameters:

- `bio` (string): Short description (<= 280 chars)
- `email` (string): Public contact email (e.g. your free @domani.run inbox)
- `emoji` (string): Avatar emoji
- `links` (array): Up to 6 links
- `name` (string): Display name
- `slug` (string, required): The handle - becomes <slug>.domani.run (lowercase letters, numbers, hyphens)

### `list_identities` (~24 tokens)

List identities

List the free agent identities (<handle>.domani.run) you've claimed.

### `update_identity` (~68 tokens)

Update identity

Update a free identity's name/bio/emoji/email/links.

Input parameters:

- `bio` (string)
- `email` (string)
- `emoji` (string)
- `links` (array)
- `name` (string)
- `slug` (string, required): The handle to update

### `release_identity` (~29 tokens)

Release identity

Release a free identity handle so it's available again.

Input parameters:

- `slug` (string, required): The handle to release

### `get_dnssec` (~58 tokens)

Get DNSSEC

List the DNSSEC delegation-signer (DS) records for a domain you own, and whether DNSSEC is enabled. Pair with TLSA records (via set_dns) for DANE.

Input parameters:

- `domain` (string, required): Domain name to inspect

### `add_dnssec` (~164 tokens)

Add DNSSEC DS Record

Publish a DNSSEC delegation-signer (DS) record at the registry to enable DNSSEC. Get the DS values from your zone provider after signing the zone.

Input parameters:

- `algorithm` (string, required): DNSSEC algorithm number, e.g. 13 (ECDSAP256SHA256)
- `digest` (string, required): Hex digest of the DNSKEY
- `digestType` (string, required): Digest type number, e.g. 2 (SHA-256)
- `domain` (string, required): Domain name to enable DNSSEC for
- `flags` (string): Optional DNSKEY flags, e.g. 257 (KSK)
- `keyTag` (string, required): Key tag, e.g. 12345
- `maxSigLife` (string): Optional max signature life in seconds

### `delete_dnssec` (~61 tokens)

Delete DNSSEC DS Record

Remove a DNSSEC delegation-signer (DS) record at the registry by its key tag. Removing all DS records disables DNSSEC.

Input parameters:

- `domain` (string, required): Domain name
- `keyTag` (string, required): Key tag of the DS record to remove

### `get_nameservers` (~50 tokens)

Get Nameservers

Get the authoritative nameservers configured for a domain you own. If empty, DNS operations (parking, email, connect) will fail.

Input parameters:

- `domain` (string, required): Domain name to get nameservers for

### `set_nameservers` (~109 tokens)

Set Nameservers

Replace the nameservers for a domain you own. Requires 2–13 valid hostnames. Common values: OpenSRS DNS (ns1.systemdns.com, ns2.systemdns.com, ns3.systemdns.com), Cloudflare (assigned per account), custom NS.

Input parameters:

- `domain` (string, required): Domain name to set nameservers for
- `nameservers` (array, required): Array of nameserver hostnames, e.g. ['ns1.systemdns.com', 'ns2.systemdns.com']

### `setup_billing` (~115 tokens)

Setup Billing

Get a checkout URL for the user to add a payment card. Returns a URL - tell the user to open it in their browser. After they complete the form, call get_account to verify has_payment_method is true. Only needed for card payments - agents with crypto wallets can skip this and pay with USDC on Base via x402 protocol.

Input parameters:

- `mode` (string): 'checkout' (default) returns a URL for the user to open in browser. 'setup_intent' returns a client_secret for Stripe.js integration.

### `upgrade_plan` (~93 tokens)

Upgrade to Pro

Get a Stripe checkout URL to upgrade the user to the Pro plan ($9/month). Returns a URL. Tell the user to open it in their browser to complete the upgrade. Pro includes 10,000 emails/month, unlimited mailboxes on custom domains, API/MCP/CLI access, webhooks, and forwarding. Use this when the user hits the free plan monthly send limit (MONTHLY_LIMIT_EXCEEDED error).

### `cancel_plan` (~40 tokens)

Cancel Pro Plan

Cancel the user's Pro subscription. The subscription remains active until the end of the current billing period, then reverts to the free plan. Returns the cancellation date.

### `list_invoices` (~67 tokens)

List Invoices

List the user's payment invoices. Returns invoice number, amount, date, and links to view/download the PDF. Each invoice is generated by Stripe when a domain is purchased, renewed, or transferred.

Input parameters:

- `limit` (integer): Max invoices to return (default 20, max 100)

### `list_tokens` (~39 tokens)

List API Tokens

List all API tokens for your account. Shows token name, masked key, creation date, last used, and expiration status. Expired tokens are marked.

### `create_token` (~933 tokens)

Create API Token

Create a new API token with optional scoped permissions and spend caps. The full key is returned only once - save it immediately. A token can only grant scopes it already has (scope attenuation) and spend caps at or below its own. Scopes: domains:read (GET /api/domains, GET /api/domains/{domain}, GET /api/domains/{domain}/dns, /dnssec, /status, /email/check, /auth-code, /transfer-away, /transfer-status, /analytics), domains:write (PUT /api/domains/{domain}/dns, POST/DELETE /api/domains/{domain}/dnssec, POST /connect, POST /verify, PUT /settings, PUT /parking, PUT/DELETE /api/domains/{domain}/for-sale, POST /api/domains/import, POST /import/verify), domains:transfer (POST /api/domains/buy, POST /transfer, POST /renew (involves payment, includes marketplace purchases)), tokens:read (GET /api/tokens), tokens:write (POST /api/tokens, DELETE /api/tokens/{id}), webhooks:read (GET /api/webhooks, GET /api/webhooks/{id}/deliveries), webhooks:write (POST /api/webhooks, PATCH /api/webhooks/{id}, DELETE /api/webhooks/{id}), email:read (GET /api/emails, /api/emails/{address}, /api/emails/{address}/messages, /api/emails/{address}/aliases, /api/email/changes, /api/domains/{domain}/email/status, /api/domains/{domain}/email/deliverability, /api/suppressions), email:write (POST /api/emails, POST /api/emails/{address}/send, POST /api/domains/{domain}/email/setup, aliases + catch-all, POST/DELETE /api/suppressions), email:delete (Permanently delete messages already in Trash. Moving messages to Trash only requires email:write. Grant this scope only to agents allowed to irreversibly erase email content), email:auth_secrets (Read messages classified as authentication mail (OTP / verification codes, password resets, magic links). Without it, email:read still lists them but subject and body come back redacted - so a stolen agent token can't harvest 2FA codes. Grant it only to agents that genuinely need to complete logins), account:read (GET /api/me, GET /api/agents/identity), account:write…

Input parameters:

- `agent_identity_id` (string): Optional owned AgentIdentity id. Mail actions made with this token are attributed to that agent
- `expires_at` (string): Absolute expiration date (ISO 8601). Alternative to expires_in
- `expires_in` (integer): Token lifetime in seconds (min 3600 = 1h, max 31536000 = 1y). Omit for no expiration
- `max_per_month` (number): Rolling calendar-month spend cap in USD for all paid operations with this token
- `max_per_tx` (number): Per-transaction spend cap in USD - any single charge above it is rejected server-side (SPEND_CAP_EXCEEDED)
- `name` (string): Human-readable label, e.g. 'CI/CD', 'Sub-Agent'. Defaults to 'CLI'
- `scopes` (array): Permission scopes for this token. Defaults to parent token's scopes. Use ['*'] for full access

### `list_audit_events` (~94 tokens)

List Audit Events

The account's security audit trail, newest first: token lifecycle (created/revoked/escalation attempts), spend-cap and max_price denials, charges, payout requests. Use it to review what the account's tokens have been doing.

Input parameters:

- `limit` (integer): Events to return (default 50)
- `type` (string): Filter by event type, e.g. purchase.denied_cap, token.created

### `revoke_token` (~47 tokens)

Revoke API Token

Revoke an API token immediately. The token will stop working. Use list_tokens to find token IDs.

Input parameters:

- `token_id` (string, required): ID of the token to revoke (from list_tokens)

### `connect_domain` (~287 tokens)

Connect Domain

Connect a domain to a hosting or email provider. Auto-detects provider from target, or accepts explicit provider name. For domains bought through the platform, DNS records are set automatically (status: dns_set). For imported domains (external registrar), returns the records as instructions to add manually (status: manual_setup_required). If the connect would REPLACE existing MX records pointing at another provider, it fails with MX_REPLACEMENT_REQUIRES_CONFIRMATION - preview with dry_run, confirm with the user, then retry with confirm_replace_mx. The response includes a next_steps array with provider-specific actions. Supported hosting: vercel, netlify, cloudflare-pages, github-pages, railway, fly. Email: google-workspace, fastmail, proton.

Input parameters:

- `confirm_replace_mx` (boolean): Confirm replacing existing MX records that point at another provider (moves the domain's email)
- `domain` (string, required): Domain to connect, e.g. mysite.com
- `dry_run` (boolean): Preview only - returns the diff (create/replace/keep) without writing
- `method` (string): Connection method if provider has multiple, e.g. cname-only
- `provider` (string): Explicit provider name, e.g. vercel, google-workspace
- `target` (string): Target URL for auto-detection, e.g. my-app.vercel.app

### `domain_status` (~40 tokens)

Domain Status

Check domain health: DNS propagation, SSL status, email (MX) configuration, and expiry date

Input parameters:

- `domain` (string, required): Domain to check status for

### `verify_connection` (~87 tokens)

Verify Connection

Verify that a provider connection is working by checking DNS propagation. Use after connect_domain to confirm records are live.

Input parameters:

- `domain` (string, required): Domain to verify
- `method` (string): Method name if applicable
- `provider` (string): Provider name, e.g. vercel
- `target` (string): Target for auto-detection, e.g. my-app.vercel.app

### `verify_service` (~113 tokens)

Verify Service

Add DNS records to verify domain ownership for a third-party service (Stripe, Google Search Console, AWS SES, Postmark, Resend, Facebook, HubSpot, Microsoft 365). Unknown services fall back to a generic TXT record.

Input parameters:

- `domain` (string, required): Domain name
- `service` (string, required): Service name (e.g. stripe, google-search-console, aws-ses, postmark, resend, facebook, hubspot, microsoft-365)
- `token` (string, required): Verification token provided by the service

### `list_services` (~24 tokens)

List Services

List all supported services for domain verification (Stripe, Google Search Console, etc.)

### `whois_lookup` (~80 tokens)

WHOIS Lookup

Look up domain registration data via RDAP (modern WHOIS). Returns registrar, dates, status, nameservers, DNSSEC, and contact information (registrant, admin, tech, billing - often redacted for privacy). Works for any domain - no ownership required.

Input parameters:

- `domain` (string, required): Domain to look up, e.g. example.com

### `get_domain_preview` (~62 tokens)

Get Domain Preview

Get website preview metadata (title, description, image, favicon) for any domain. Useful for understanding what a taken domain is currently used for. Data is cached for 7 days.

Input parameters:

- `domain` (string, required): Domain to preview, e.g. google.com

### `set_auto_renew` (~62 tokens)

Set Auto-Renew

Enable or disable auto-renew for a domain you own. When enabled, the domain will be renewed automatically before expiry.

Input parameters:

- `domain` (string, required): Domain name to configure
- `enabled` (boolean, required): true to enable auto-renew, false to disable

### `set_whois_privacy` (~68 tokens)

Set WHOIS Privacy

Enable or disable WHOIS privacy for a domain you own. When enabled, your personal contact information is hidden from public WHOIS lookups.

Input parameters:

- `domain` (string, required): Domain name to configure
- `enabled` (boolean, required): true to enable WHOIS privacy, false to disable

### `set_security_lock` (~66 tokens)

Set Security Lock

Lock or unlock a domain's transfer lock (clientTransferProhibited). When locked, transfer requests are rejected. Unlock before transferring to another registrar.

Input parameters:

- `domain` (string, required): Domain name to configure
- `locked` (boolean, required): true to lock (prevent transfers), false to unlock

### `set_domain_redirect` (~121 tokens)

Set Domain Redirect

Forward a domain you own to another URL (e.g. brand.com -> brand.dev). The domain must point at domani's nameservers/parking IP. Permanent (308) by default, or temporary (307). Send an empty url to stop forwarding.

Input parameters:

- `domain` (string, required): The domain to forward (must be one you own)
- `permanent` (boolean): true = permanent redirect (default), false = temporary
- `url` (string, required): Target URL to forward to, e.g. https://brand.dev. Empty string clears the redirect.

### `get_auth_code` (~58 tokens)

Get Auth Code

Get the EPP/auth code needed to transfer a domain to another registrar. Automatically unlocks the domain if it's locked. Give this code to the new registrar to initiate the transfer.

Input parameters:

- `domain` (string, required): Domain to get auth code for

### `get_transfer_away` (~47 tokens)

Get Transfer Away Status

Check the status of an outbound domain transfer. Use after getting an auth code and initiating the transfer at the new registrar.

Input parameters:

- `domain` (string, required): Domain to check transfer status for

### `check_transfer_status` (~52 tokens)

Check Transfer Status

Check the status of an inbound domain transfer. Returns detailed status (pending_owner, pending_admin, pending_registry, completed, cancelled) with actionable hints.

Input parameters:

- `domain` (string, required): Domain to check transfer status for

### `set_contact` (~198 tokens)

Set Contact

Set your WHOIS contact information (recommended for ICANN compliance, required before transfers). You can purchase domains without setting contact info first - a default contact is used until you set your own.

Input parameters:

- `address1` (string, required): Street address line 1
- `address2` (string): Street address line 2 (optional)
- `city` (string, required): City
- `country` (string, required): ISO 3166-1 alpha-2 country code, e.g. US, GB, FR
- `email` (string, required): Contact email address
- `first_name` (string, required): First name
- `last_name` (string, required): Last name
- `org_name` (string): Organization name (optional)
- `phone` (string, required): Phone in +CC.NUMBER format, e.g. +1.5551234567
- `postal_code` (string, required): Postal/ZIP code
- `state` (string, required): State or province

### `resend_email_verification` (~60 tokens)

Resend Email Verification

Resend a verification email for your WHOIS contact email. If the contact email matches your login email, it's already verified. Rate limited to once per 15 minutes.

Input parameters:

- `email` (string): Email to verify (defaults to your contact email)

### `get_domain_info` (~48 tokens)

Get Domain Info

Get detailed information about a domain you own, including auto-renew status, security lock, WHOIS privacy, and provider data.

Input parameters:

- `domain` (string, required): Domain name to get info for

### `plan_domain_adoption` (~96 tokens)

Plan Domain Adoption

Read-only planner for an existing domain. Inspects registrar, nameservers, DNS provider, DNSSEC, account state, transfer eligibility, and price. Returns safe next actions. Call this before asking for an EPP code. Connecting is free and leaves registrar and DNS unchanged. Transferring preserves nameservers and never migrates DNS implicitly.

Input parameters:

- `domain` (string, required): Existing domain to inspect, e.g. mysite.com

### `check_transfer_eligibility` (~78 tokens)

Check Transfer Eligibility

Pre-check whether a domain can be transferred. Returns transfer price, eligibility status, and any blockers (unsupported TLD, ICANN waiting period, domain locked, etc.). Always call this before transfer_domain to verify eligibility and show the user the price.

Input parameters:

- `domain` (string, required): Domain to check, e.g. mysite.com

### `transfer_domain` (~235 tokens)

Transfer Domain

Initiate a domain transfer from another provider. PAID. The transfer includes 1 year of renewal, preserves current nameservers, and does not migrate DNS. Call plan_domain_adoption first, show the exact price and continuity plan, then get explicit confirmation before calling this. Requires the authorization/EPP code from the current provider.

Input parameters:

- `auth_code` (string, required): Authorization/EPP code from the current provider
- `domain` (string, required): Domain to transfer, e.g. mysite.com
- `extra_subdomains` (array): Additional subdomains to include in the pre-transfer DNS snapshot. We auto-discover subdomains via CT logs, SPF, MX/DKIM inference, and a common wordlist - use this for any custom subdomains we might…
- `payment_chain` (string): Chain the USDC payment was sent on.
- `payment_method` (string): Payment method: 'card' to charge card on file, 'usdc' to pay with USDC. Overrides the user's default preference for this request.
- `payment_tx` (string): Transaction hash of a USDC payment already sent on-chain.

### `watch_transfer` (~91 tokens)

Watch Transfer

Watch a domain and get notified (email + webhook) when it becomes eligible for transfer. Uses RDAP to check ICANN lock periods and EPP status codes. If the domain is already eligible, returns immediately without creating a watch. If not eligible but has a known date, creates a watch and notifies you when it's ready.

Input parameters:

- `domain` (string, required): Domain to watch, e.g. example.com

### `renew_domain` (~170 tokens)

Renew Domain

Renew a domain you own for additional years. Always confirm with the user before calling this.

Input parameters:

- `domain` (string, required): Domain to renew, e.g. mysite.com
- `max_price` (number): Ceiling in USD for the renewal charge. Fails with PRICE_ABOVE_MAX (nothing charged) if the real price is above it.
- `payment_chain` (string): Chain the USDC payment was sent on.
- `payment_method` (string): Payment method: 'card' to charge card on file, 'usdc' to pay with USDC. Overrides the user's default preference for this request.
- `payment_tx` (string): Transaction hash of a USDC payment already sent on-chain.
- `years` (number): Number of years to renew (1-10, default 1)

### `list_providers` (~38 tokens)

List Providers

List all supported hosting and email providers with their connection methods, target requirements, and setup notes

Input parameters:

- `category` (string): Filter by category

### `import_domain` (~73 tokens)

Import Domain

Import an external domain you already own (registered at GoDaddy, Namecheap, Cloudflare, etc.) to manage through domani.run. Free, no transfer needed. Returns a TXT record to add at your DNS provider for ownership verification.

Input parameters:

- `domain` (string, required): Domain to import, e.g. mysite.com

### `verify_import` (~44 tokens)

Verify Import

Verify DNS TXT record and complete domain import. Call after adding the TXT record from import_domain.

Input parameters:

- `domain` (string, required): Domain to verify, e.g. mysite.com

### `set_parking` (~162 tokens)

Set Parking

Enable or disable the parking page for a domain you own. When enabled, visitors to the domain see a default parking page (or a 'For Sale' page if a listing price is set). Parking is enabled by default for newly purchased domains. IMPORTANT: If the domain has existing DNS records, the response will include requires_confirmation=true and show the records that will be overwritten. You MUST inform the user and get their approval before calling again with confirm=true.

Input parameters:

- `confirm` (boolean): Set to true to confirm overwriting existing DNS records. Only needed when the first call returns requires_confirmation=true.
- `domain` (string, required): Domain to configure, e.g. example.com
- `enabled` (boolean, required): true to enable the parking page, false to disable it

### `get_parking_analytics` (~78 tokens)

Get Parking Analytics

Get visitor analytics for a parked domain - page views, inquiries, conversion rate, 30-day daily breakdown, and the 5 most recent inquiries. Use this to check how much traffic a parked domain gets and whether it's converting into buyer inquiries.

Input parameters:

- `domain` (string, required): Domain to get analytics for, e.g. example.com

### `set_listing_price` (~106 tokens)

Set Listing Price

Set a 'For Sale' price on a parked domain, or remove the listing. When a price is set and parking is enabled, visitors see a 'For Sale' page with the price and a contact form to reach the domain owner. Set price to null to remove the listing.

Input parameters:

- `domain` (string, required): Domain to configure, e.g. example.com
- `price` (required): Sale price in USD (e.g. 499.99), or null to remove the listing

### `sell_domain` (~92 tokens)

Sell Domain

List a domain you own for sale on the Domani marketplace. Buyers can purchase it directly via the API. The domain must be active and not already listed. Requires domains:write scope.

Input parameters:

- `description` (string): Optional listing description
- `domain` (string, required): Domain to list for sale, e.g. premium.com
- `price` (number, required): Sale price in USD (e.g. 5000)

### `update_listing` (~65 tokens)

Update Listing

Update the price and/or description of an active marketplace listing. Requires domains:write scope.

Input parameters:

- `description`: New description (null to clear)
- `domain` (string, required): Domain with active listing, e.g. premium.com
- `price` (number): New price in USD

### `unsell_domain` (~61 tokens)

Unsell Domain

Remove an active for-sale listing for a domain you own. The domain stays in your account but is no longer purchasable on the marketplace. Requires domains:write scope.

Input parameters:

- `domain` (string, required): Domain to unlist, e.g. premium.com

### `make_offer` (~101 tokens)

Make an Offer

Open an anonymous price negotiation on a listed domain with an initial offer (below or at the asking price). The seller can counter, accept, or decline. Neither side sees the other's identity. Requires deals:write scope.

Input parameters:

- `domain` (string, required): The listed domain to negotiate on, e.g. premium.com
- `message` (string): Optional message to the seller
- `offer` (number, required): Your initial offer in USD, e.g. 500

### `respond_to_offer` (~96 tokens)

Respond to Offer

Counter, accept, or decline the current offer in a negotiation when it's your turn. 'accept' locks the price at the amount on the table; the buyer then finalizes payment. Requires deals:write scope.

Input parameters:

- `action` (string, required): Your response
- `counter` (number): New amount in USD (required when action=counter)
- `message` (string)
- `negotiation_id` (string, required): The negotiation ID

### `finalize_negotiation` (~135 tokens)

Finalize Negotiation

As the buyer, pay the agreed price to create the escrow deal and start the transfer. Same payment methods as a purchase (card, USDC, x402). Requires domains:transfer scope. For a broker-sourced acquisition, if the agreed price is above the max_budget you set, this returns BUDGET_EXCEEDED - retry with confirm_over_budget: true to proceed anyway.

Input parameters:

- `confirm_over_budget` (boolean): Set true to finalize a broker deal above the max_budget you set on the acquisition request
- `negotiation_id` (string, required): The agreed negotiation to finalize
- `payment_method` (string)

### `list_negotiations` (~66 tokens)

List Negotiations

List your active and past price negotiations (as buyer or seller). Counterparties are anonymized. Requires deals:read scope.

Input parameters:

- `role` (string): Filter by your role
- `status` (string): Filter by status (open|agreed|completed|all)

### `get_deal_invoice` (~66 tokens)

Get Deal Invoice

Get a role-aware receipt/statement for a marketplace deal. Buyers see what they paid; sellers see the sale, the platform commission line, and the net payout. Works for every payment method. Requires deals:read scope.

Input parameters:

- `deal_id` (string, required): The deal ID

### `acquire_domain` (~110 tokens)

Acquire Domain (Broker)

Ask domani to acquire a specific taken, unlisted domain on your behalf. Agents source the owner via RDAP, reach out anonymously, and negotiate - commission-only, no upfront fee. Owner interest opens an anonymous negotiation you can accept/counter. Note: many owners are unreachable (GDPR-redacted WHOIS). Requires deals:write scope.

Input parameters:

- `domain` (string, required): The taken domain you want, e.g. dream.com
- `max_budget` (number): Your ceiling in USD (optional)

### `list_broker_requests` (~55 tokens)

List Broker Requests

List your domain acquisition requests and their status (sourcing/contacted/negotiating/agreed/no_contact/declined). Requires deals:read scope.

Input parameters:

- `status` (string): Filter by status, or 'all'

### `cancel_broker_request` (~35 tokens)

Cancel Broker Request

Cancel an active domain acquisition request. Requires deals:write scope.

Input parameters:

- `request_id` (string, required): The broker request ID

### `respond_to_broker_inquiry` (~162 tokens)

Respond to Broker Inquiry (Owner)

Owner-agent path: respond to a broker's acquisition inquiry using the token from the outreach email in your inbox - fully autonomous, no email round-trip, no magic-link. offer/counter names a price and opens/advances an anonymous negotiation; accept agrees to the buyer's current offer on the table; decline/opt_out ends it. Token-authorized (no scope needed).

Input parameters:

- `action` (string, required): offer/counter to name a price; accept to take the buyer's current offer; decline to refuse; opt_out to stop contact
- `price` (number): Your asking price in USD (required for offer/counter)
- `token` (string, required): The outreach token from your inquiry email (reply-to is broker+<token>@)

### `get_broker_inquiry_state` (~80 tokens)

Read Broker Inquiry State (Owner)

Owner-agent read path: poll the current, anonymized state of a broker inquiry with your token before acting. Returns the domain, the buyer's offer on the table, whose move it is, and the actions available now. Never exposes the buyer's identity or budget.

Input parameters:

- `token` (string, required): The outreach token from your inquiry email

### `browse_marketplace` (~77 tokens)

Browse Marketplace

Browse domains for sale on the Domani marketplace. Returns all active listings with prices. Use buy_domain to purchase a listed domain.

Input parameters:

- `max_price` (number): Maximum price in USD
- `order` (string): Sort order (default: asc)
- `sort` (string): Sort by price or TLD (default: price)

### `create_backorder` (~171 tokens)

Create Backorder

Place a backorder on a domain that is currently registered to someone else. We watch it and automatically register it for the user when it becomes available (drops) - availability is polled every few minutes. The user is charged only if the catch succeeds - no upfront fee. Requires a card on file or payment_method 'balance'. Confirm the domain with the user first. Best-effort: a contested drop may be taken by a specialized drop-catcher first.

Input parameters:

- `domain` (string, required): The currently-taken domain to watch and catch on drop, e.g. taken.com
- `max_price` (number): Max USD to pay when caught. Defaults to the current registration price.
- `payment_method` (string): How to pay when caught: 'card' or 'balance' (marketplace credit).

### `list_backorders` (~42 tokens)

List Backorders

List the user's backorders (watching, caught, failed, cancelled, expired). Optionally filter by status.

Input parameters:

- `status` (string): Filter by status

### `cancel_backorder` (~46 tokens)

Cancel Backorder

Stop watching a domain by cancelling a backorder. Only backorders in the 'watching' state can be cancelled.

Input parameters:

- `id` (string, required): The backorder ID to cancel

### `list_webhooks` (~32 tokens)

List Webhooks

List all webhook endpoints configured for the user's account. Returns URL, subscribed events, and active status for each webhook.

### `create_webhook` (~114 tokens)

Create Webhook

Register a new webhook endpoint to receive event notifications. The URL must use HTTPS. Choose which events to subscribe to (e.g. domain.purchased, transfer.completed). The webhook secret is returned only once - save it to verify incoming payloads with HMAC-SHA256.

Input parameters:

- `events` (array, required): Event types to subscribe to, e.g. ["domain.purchased", "dns.updated"]. Use list_webhook_events to see all available types.
- `url` (string, required): HTTPS URL that will receive webhook POST requests

### `update_webhook` (~94 tokens)

Update Webhook

Update an existing webhook's URL, subscribed events, or active status. Use list_webhooks to get the webhook ID first.

Input parameters:

- `active` (boolean): Set to false to pause the webhook, true to resume
- `events` (array): New list of event types to subscribe to
- `url` (string): New HTTPS URL for the webhook
- `webhook_id` (string, required): ID of the webhook to update

### `delete_webhook` (~41 tokens)

Delete Webhook

Delete a webhook endpoint. All pending deliveries will be cancelled. This action cannot be undone.

Input parameters:

- `webhook_id` (string, required): ID of the webhook to delete

### `list_webhook_deliveries` (~74 tokens)

List Webhook Deliveries

Get recent delivery attempts for a webhook - shows event type, HTTP status, number of attempts, and any errors. Useful for debugging webhook issues.

Input parameters:

- `limit` (integer): Maximum number of deliveries to return (default 20)
- `webhook_id` (string, required): ID of the webhook to get deliveries for

### `replay_webhook_delivery` (~88 tokens)

Replay Webhook Delivery

Redeliver one immutable webhook event. Requires a caller-stable idempotency key; retries with the same key return the same receipt and never send twice.

Input parameters:

- `delivery_id` (string, required): Original delivery ID from list_webhook_deliveries
- `idempotency_key` (string, required): Stable unique key for this replay operation
- `webhook_id` (string, required): Webhook ID

### `setup_domain_email` (~101 tokens)

Setup Domain Email

Pre-configure email DNS on a domain (optional). This is called automatically by create_mailbox when needed. Use this only to pre-configure DNS before creating mailboxes. Pass force=true to override existing email provider (Google Workspace, Fastmail, Proton).

Input parameters:

- `domain` (string, required): Domain to enable email on, e.g. mysite.com
- `force` (boolean): Override existing MX records (e.g. Google Workspace). Default: false

### `get_domain_email_status` (~45 tokens)

Get Domain Email Status

Check if email is enabled on a domain and whether DNS records are verified. Returns record status and mailbox count.

Input parameters:

- `domain` (string, required): Domain to check email status for

### `create_mailbox` (~257 tokens)

Create Mailbox

Create an email address. Specify slug (required) and optionally domain. Pass workspace_id to create it inside a workspace you own; custom-domain creation atomically adopts the domain and all unscoped sibling mailboxes so a domain is never split. For custom domains: email DNS is auto-configured on first use. For imported domains (external registrar): returns DNS records to add manually at your registrar. For domani.run: omit domain. Max 5 mailboxes per account, 1 free @domani.run per user. Pass force=true to override existing email provider (Google Workspace, etc.). API: POST /api/emails with {address}.

Input parameters:

- `domain` (string): Domain for the mailbox. Omit for domani.run
- `force` (boolean): Override existing MX records (e.g. Google Workspace). Default: false
- `name` (string): Display name for outbound emails, e.g. 'John Doe'. Shows as 'John Doe <slug@domain>' in recipients' inboxes
- `slug` (string, required): Local part of the email address, e.g. 'hello' for hello@mysite.com
- `workspace_id` (string): Workspace ID from list_workspaces; owner-only

### `list_mailboxes` (~58 tokens)

List Mailboxes

List all your email addresses. Optionally filter by domain. API: GET /api/emails (or GET /api/email).

Input parameters:

- `domain` (string): Filter by domain, e.g. mysite.com. Omit to list all

### `check_email_deliverability` (~194 tokens)

Check Email Deliverability

Run the same deliverability and abuse-safety checks used by send_email, without sending or consuming quota. Use this before authentication, payment, onboarding, or high-volume messages. API: POST /api/emails/{address}/deliverability-check.

Input parameters:

- `allow_risky_content` (boolean): Deprecated compatibility field. Public HTTPS third-party auth links are allowed with a warning; objective safety blocks cannot be overridden
- `attachments` (array): Attachment metadata only; content is not required for preflight
- `domain` (string, required): Sender mailbox domain, e.g. mysite.com or domani.run
- `html` (string): HTML body
- `idempotency_key` (string): Stable idempotency key for this logical message
- `slug` (string, required): Sender mailbox slug, e.g. hello
- `subject` (string): Email subject line
- `text` (string): Plain-text body

### `send_email` (~309 tokens)

Send Email

Send an email from one of your mailboxes. Specify domain and slug to identify the sender mailbox. Supports text and/or HTML body, CC/BCC, attachments (base64), and threading via In-Reply-To/References. Rate limited to 100 sends per hour per mailbox. API: POST /api/emails/{address}/send.

Input parameters:

- `allow_risky_content` (boolean): Deprecated compatibility field. Public HTTPS third-party auth links are allowed with a warning; objective safety blocks cannot be overridden
- `attachments` (array): File attachments (max 10, max 40MB total)
- `bcc`: BCC recipient(s)
- `cc`: CC recipient(s)
- `domain` (string, required): Sender mailbox domain, e.g. mysite.com or domani.run
- `html` (string): HTML body
- `idempotency_key` (string): Unique key to prevent duplicate sends. If a message with this key was already sent from this mailbox, the original result is returned.
- `in_reply_to` (string): Message-ID of the email being replied to (for threading)
- `references` (string): Space-separated Message-ID chain (for threading)
- `reply_to` (string): Reply-to email address
- `slug` (string, required): Sender mailbox slug, e.g. hello or k7x9m2
- `subject` (string): Email subject line
- `text` (string): Plain text body
- `to` (required): Recipient email address(es)

### `list_email_messages` (~229 tokens)

List Email Messages

List messages in a system folder or virtual view. Defaults to Inbox. Supports pagination, direction and search filters. API: GET /api/emails/{address}/messages.

Input parameters:

- `cursor` (string): Pagination cursor from previous response
- `direction` (string): Filter by direction: 'in' for received, 'out' for sent
- `domain` (string, required): Mailbox domain
- `folder` (string): System folder. Mutually exclusive with view. Defaults to inbox
- `from` (string): Filter by sender address (case-insensitive, partial match)
- `limit` (number): Max messages to return (default 20, max 100)
- `slug` (string, required): Mailbox slug
- `spam` (boolean): Filter by spam flag. Pass false to hide spam-flagged inbound; omit to include all.
- `subject` (string): Filter by subject (case-insensitive, partial match)
- `to` (string): Filter by recipient address (case-insensitive, partial match)
- `view` (string): Virtual view. Mutually exclusive with folder

### `list_mailbox_changes` (~79 tokens)

List Mailbox Changes

Incrementally synchronize a mailbox with an opaque cursor. Call without a cursor before a bounded full snapshot, then replay changes from next_cursor. API: GET /api/email/changes.

Input parameters:

- `cursor` (string): Opaque next_cursor from the previous response
- `limit` (integer)
- `mailbox_id` (string, required): Accessible mailbox ID

### `list_email_folders` (~61 tokens)

List Email Folders

List canonical mailbox folders, virtual views, server-derived total/unread counts, and backend capabilities. API: GET /api/emails/{address}/folders.

Input parameters:

- `domain` (string, required): Mailbox domain
- `slug` (string, required): Mailbox slug

### `update_email_messages` (~161 tokens)

Update Email Messages

Apply a retry-safe lifecycle action to up to 100 messages. Returns a durable per-item operation receipt. Reuse the exact idempotency key after timeouts; never invent a new key for the same logical action. Permanent deletion requires email:delete. API: POST /api/emails/{address}/messages/actions.

Input parameters:

- `action` (string, required)
- `destination` (string): Required for move
- `domain` (string, required): Mailbox domain
- `idempotency_key` (string, required): Caller-stable key for this exact logical batch
- `message_ids` (array, required): Explicit message IDs
- `read` (boolean): Required for mark_read
- `slug` (string, required): Mailbox slug
- `starred` (boolean): Required for star

### `get_message` (~72 tokens)

Get Message

Get a single message by ID with full content, headers, delivery events, and attachment download URLs. API: GET /api/emails/{address}/messages/{id}.

Input parameters:

- `domain` (string, required): Mailbox domain
- `message_id` (string, required): Message ID
- `slug` (string, required): Mailbox slug

### `set_email_webhook` (~111 tokens)

Set Email Webhook

Set or remove the inbound webhook URL for a mailbox. When set, incoming emails are POSTed to this URL in real-time with HMAC-SHA256 signing. Must be HTTPS. Set to null to remove. API: PUT /api/emails/{address}/webhook or DELETE /api/emails/{address}/webhook.

Input parameters:

- `domain` (string, required): Mailbox domain
- `slug` (string, required): Mailbox slug
- `webhook_url` (required): HTTPS webhook URL, or null to remove

### `rotate_email_webhook_secret` (~66 tokens)

Rotate Email Webhook Secret

Regenerate the HMAC signing secret for a mailbox webhook. The old secret is immediately invalidated. API: POST /api/emails/{address}/webhook/rotate.

Input parameters:

- `domain` (string, required): Mailbox domain
- `slug` (string, required): Mailbox slug

### `test_email_webhook` (~63 tokens)

Test Email Webhook

Send a signed test payload to the mailbox webhook URL. Returns HTTP status and success/failure. API: POST /api/emails/{address}/webhook/test.

Input parameters:

- `domain` (string, required): Mailbox domain
- `slug` (string, required): Mailbox slug

### `set_email_forward` (~117 tokens)

Set Email Forward

Configure inbound handling for a mailbox: forward incoming emails to another address (in addition to storing) and/or drop spam-flagged messages. Set forward_to to null to remove forwarding. API: PATCH /api/emails/{address}.

Input parameters:

- `domain` (string, required): Mailbox domain
- `drop_spam` (boolean): If true, spam-flagged inbound is dropped (not stored or webhooked)
- `forward_to`: Email address to forward to, or null to remove
- `slug` (string, required): Mailbox slug

### `add_mailbox_alias` (~137 tokens)

Add Mailbox Alias

Add an alias address that delivers into an existing mailbox, without using a mailbox slot. Useful for multiple public addresses (sales@, hello@, contact@) landing in one inbox. The alias must be on the same domain as the mailbox. API: POST /api/emails/{address}/aliases.

Input parameters:

- `alias` (string, required): Alias address - a bare slug ('sales') or a full address on the same domain ('sales@mysite.com')
- `domain` (string, required): Mailbox domain, e.g. mysite.com
- `slug` (string, required): Mailbox slug the alias delivers to, e.g. inbox

### `list_mailbox_aliases` (~53 tokens)

List Mailbox Aliases

List all alias addresses that deliver into a mailbox. API: GET /api/emails/{address}/aliases.

Input parameters:

- `domain` (string, required): Mailbox domain
- `slug` (string, required): Mailbox slug

### `remove_mailbox_alias` (~78 tokens)

Remove Mailbox Alias

Remove an alias address from a mailbox. Email to that address stops being delivered. API: DELETE /api/emails/{address}/aliases/{alias}.

Input parameters:

- `alias` (string, required): Alias address to remove - a bare slug or full address
- `domain` (string, required): Mailbox domain
- `slug` (string, required): Mailbox slug

### `set_catch_all` (~122 tokens)

Set Catch-All

Route any email sent to an unmatched address on a domain into a designated mailbox. Anything that does not match a mailbox, subaddress, or alias lands in the catch-all. The mailbox must already exist on the domain. API: PUT /api/domains/{domain}/email/catch-all.

Input parameters:

- `domain` (string, required): Domain to set the catch-all on, e.g. mysite.com
- `mailbox` (string, required): Catch-all mailbox - a bare slug ('inbox') or full address ('inbox@mysite.com') on this domain

### `clear_catch_all` (~56 tokens)

Clear Catch-All

Remove the catch-all on a domain. Email to unmatched addresses will be dropped again. API: DELETE /api/domains/{domain}/email/catch-all.

Input parameters:

- `domain` (string, required): Domain to clear the catch-all on

### `list_suppressions` (~78 tokens)

List Suppressions

List addresses on your suppression list - hard bounces and complaints (added automatically) plus manual entries. Sends to these addresses are skipped. API: GET /api/suppressions.

Input parameters:

- `cursor` (string): Pagination cursor from a previous response
- `limit` (number): Max entries to return (default 50, max 100)

### `add_suppression` (~76 tokens)

Add Suppression

Manually add an address to your suppression list so future sends skip it. Hard bounces and complaints are added automatically - use this for addresses you want to stop emailing. API: POST /api/suppressions.

Input parameters:

- `address` (string, required): Email address to suppress
- `reason` (string): Reason (default: manual)

### `remove_suppression` (~60 tokens)

Remove Suppression

Remove an address from your suppression list so you can email it again (e.g. after the recipient fixed their mailbox). API: DELETE /api/suppressions/{address}.

Input parameters:

- `address` (string, required): Email address to remove from the suppression list

### `add_mail_rule` (~200 tokens)

Add Mail Rule

Add an inbound filtering rule to a mailbox. If a message matches (by from/to/subject/body), the action runs: drop, mark_read, forward (to action_arg), webhook_only (skip forward-to), or label (with action_arg). Rules run in priority order (lower first); first match wins. API: POST /api/emails/{address}/rules.

Input parameters:

- `action` (string, required): What to do on match
- `action_arg` (string): For 'forward': the destination email. For 'label': the label value.
- `domain` (string, required): Mailbox domain
- `enabled` (boolean): Default true
- `match_field` (string, required): Which field to match on
- `match_op` (string, required): How to match
- `match_value` (string, required): The value/pattern to match
- `priority` (integer): Lower runs first (default 0)
- `slug` (string, required): Mailbox slug

### `list_mail_rules` (~57 tokens)

List Mail Rules

List a mailbox's inbound filtering rules, in the priority order they are applied. API: GET /api/emails/{address}/rules.

Input parameters:

- `domain` (string, required): Mailbox domain
- `slug` (string, required): Mailbox slug

### `remove_mail_rule` (~66 tokens)

Remove Mail Rule

Remove an inbound filtering rule from a mailbox. API: DELETE /api/emails/{address}/rules/{ruleId}.

Input parameters:

- `domain` (string, required): Mailbox domain
- `rule_id` (string, required): The rule ID to remove
- `slug` (string, required): Mailbox slug

### `delete_mailbox` (~83 tokens)

Delete Mailbox

Delete a mailbox and all its messages (including attachments). Requires confirm=true. Call without confirm first to see what will be deleted. API: DELETE /api/emails/{address}.

Input parameters:

- `confirm` (boolean): Must be true to actually delete. Omit to preview.
- `domain` (string, required): Mailbox domain
- `slug` (string, required): Mailbox slug

### `mark_messages_read` (~121 tokens)

Mark Messages Read/Unread

Retry-safely mark messages read or unread and return a durable per-item receipt. Reuse the exact idempotency key after timeouts. API: PATCH /api/emails/{address}/messages/read.

Input parameters:

- `domain` (string, required): Mailbox domain
- `idempotency_key` (string, required): Caller-stable key for this exact logical batch
- `message_ids` (array, required): IDs of messages to mark
- `read` (boolean, required): true = mark as read, false = mark as unread
- `slug` (string, required): Mailbox slug

### `delete_message` (~74 tokens)

Delete Message

Move an email message to Trash. This is reversible with update_email_messages action=restore. API: DELETE /api/emails/{address}/messages/{id}.

Input parameters:

- `domain` (string, required): Mailbox domain
- `message_id` (string, required): ID of the message to delete
- `slug` (string, required): Mailbox slug

### `delete_messages` (~111 tokens)

Delete Messages (Bulk)

Retry-safely move messages to Trash and return a durable per-item receipt. Reuse the exact idempotency key after timeouts. Reversible with update_email_messages action=restore. API: POST /api/emails/{address}/messages/delete.

Input parameters:

- `domain` (string, required): Mailbox domain
- `idempotency_key` (string, required): Caller-stable key for this exact logical batch
- `message_ids` (array, required): IDs of messages to delete
- `slug` (string, required): Mailbox slug

### `forward_message` (~121 tokens)

Forward Email

Forward an email message to another address. Includes the original message context (sender, date, subject, body). Optionally prepend a note. Subject is auto-prefixed with 'Fwd:'. API: POST /api/emails/{address}/messages/{id}/forward.

Input parameters:

- `domain` (string, required): Mailbox domain
- `message_id` (string, required): ID of the message to forward
- `slug` (string, required): Mailbox slug
- `text` (string): Optional note to prepend to the forwarded message
- `to` (required): Recipient email address(es)

### `reply_to_message` (~203 tokens)

Reply to Email

Reply to an email message. For shared human-agent mailboxes, first heartbeat composing presence and pass coordination plus a stable idempotency_key; the server atomically rejects stale/double replies. Threading headers are automatic. API: POST /api/emails/{address}/messages/{id}/reply.

Input parameters:

- `all` (boolean): Reply-all: auto-CC original To and CC recipients (default: false)
- `cc`: Additional CC recipients (overrides auto-CC when all=true)
- `coordination` (object): Compose lease and reply generation returned by heartbeat_conversation_presence
- `domain` (string, required): Mailbox domain
- `html` (string): HTML reply body
- `idempotency_key` (string): Required with coordination; reuse this exact key after timeouts
- `message_id` (string, required): ID of the message to reply to
- `slug` (string, required): Mailbox slug
- `text` (string): Plain text reply body

### `check_email` (~51 tokens)

Check Email

Check email DNS health for a domain: MX records, SPF, DMARC, DKIM. Auto-detects the email provider from MX records.

Input parameters:

- `domain` (string, required): Domain to check email health for

### `get_email_deliverability` (~81 tokens)

Get Email Deliverability

Get an owner-scoped email health report for a domain. Separates deterministic DNS readiness, 30-day bounce and complaint outcomes, account safety state, and measured inbox placement. A readiness score is not an Inbox probability. API: GET /api/domains/{domain}/email/deliverability.

Input parameters:

- `domain` (string, required): Domain to inspect

### `create_hosted_mailbox` (~176 tokens)

Create Hosted Mailbox

Create a real IMAP/SMTP mailbox on a domain you own (connect Apple Mail, Thunderbird, or any mail client), instead of an API mailbox. Pass workspace_id to create it in a workspace you own and atomically adopt the domain boundary. Provisions the mailbox on our mail server, publishes DNS when we manage it, and returns the DNS records, mail client settings, and a one-time app password. API: POST /api/emails with kind=hosted.

Input parameters:

- `domain` (string, required): A domain you own, e.g. mysite.com
- `name` (string): Display name for the mailbox
- `slug` (string, required): Local part, e.g. 'me' for me@mysite.com
- `workspace_id` (string): Workspace ID from list_workspaces; owner-only

### `get_mailbox_client_settings` (~77 tokens)

Get Mail Client Settings

Get IMAP/SMTP settings for a hosted mailbox to configure a mail client (Apple Mail, Thunderbird). Username is the full address; password is an app password. API: GET /api/emails/{address}/client-settings.

Input parameters:

- `domain` (string, required): Hosted mailbox domain
- `slug` (string, required): Hosted mailbox slug

### `create_mailbox_credential` (~90 tokens)

Create App Password

Create an app password for a hosted mailbox, used as the password in a mail client. The secret is returned once - store it. API: POST /api/emails/{address}/credentials.

Input parameters:

- `domain` (string, required): Hosted mailbox domain
- `label` (string): Label to identify this app password, e.g. 'Laptop Mail'
- `slug` (string, required): Hosted mailbox slug

### `list_mailbox_credentials` (~63 tokens)

List App Passwords

List the app passwords for a hosted mailbox (labels + metadata; secrets are shown only once at creation). API: GET /api/emails/{address}/credentials.

Input parameters:

- `domain` (string, required): Hosted mailbox domain
- `slug` (string, required): Hosted mailbox slug

### `revoke_mailbox_credential` (~79 tokens)

Revoke App Password

Revoke an app password on a hosted mailbox. Any mail client using it stops connecting. API: DELETE /api/emails/{address}/credentials/{id}.

Input parameters:

- `credential_id` (string, required): App password id from list_mailbox_credentials
- `domain` (string, required): Hosted mailbox domain
- `slug` (string, required): Hosted mailbox slug

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/run-domani-domani/domani#diagnostics

## Score history

- 2026-08-03: 80
- 2026-08-02: 79
- 2026-08-01: 79
- 2026-07-31: 78
- 2026-07-30: 73
- 2026-07-29: 73
- 2026-07-28: 72
- 2026-07-27: 71
- 2026-07-26: 70

## Links

- Remote endpoint: https://domani.run/mcp
- Repository: https://github.com/gwendall/domani
- Website: https://domani.run/
- Changelog RSS feed: https://verifymcp.io/servers/run-domani-domani/domani/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/run-domani-domani/domani/changelog.json
- HTML version of this page: https://verifymcp.io/servers/run-domani-domani/domani
