mcpField
D
domani

domani

Remote
domani.runCloud & Infra2Updated 2d ago

About domani

domani provides domain registration, DNS management, and email for people and AI agents through its web app, CLI, API, and agent integrations. Its MCP bridge keeps credentials local while forwarding requests to Domani's hosted service.

Key features

  1. 01Search, suggest, purchase, and renew domains
  2. 02Manage DNS records and provider connections
  3. 03Create mailboxes and send or receive email
  4. 04Use multiple accounts and scoped credentials
  5. 05Structured JSON output and command schemas

Use cases

  1. 01Find and register a domain for a project
  2. 02Configure DNS for a supported hosting provider
  3. 03Create a project mailbox and route inbound email
  4. 04Let an agent manage domains without exposing an API key

MCP support

The CLI provides a stdio MCP bridge that resolves credentials locally and forwards MCP requests to https://domani.run/mcp. Login credentials can be stored in the operating-system keychain, and scoped, expiring access can be requested.

Configuration

Remote servers need no local install. Pick your client, then copy the config or install in one click.

Endpointhttps://domani.run/mcp
Copy install command
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

Run commands in a terminal; paste JSON into the client’s MCP config and restart. Servers that need sign-in will prompt on first connect.

Tools

Details

From the project README

domani

Domains and email - for humans and AI agents.

Register domains, manage DNS, create mailboxes, send and receive email. From your terminal, your agent, or the web.

npm version license

How it works

domani gives you one account and multiple ways in:

  • Web - Dashboard with a full inbox (compose, reply, threads), DNS editor, domain management
  • CLI - This package. Everything the web app does, from your terminal
  • MCP Server - typed tools for Claude Code, Cursor, Codex, and any MCP-compatible agent
  • OpenClaw - openclaw skills install @gwendall/domani
  • Agent Skill - Step-by-step guide your agent can follow. Install with npx skills add domani.run
  • REST API - Direct HTTP access to everything

All interfaces share the same API key and the same data.

Install

npm install -g domani-cli

Secure MCP bridge

Agent plugins can use Domani without placing an API key in a prompt, shell history, or editor configuration:

domani login --surface mcp
domani mcp serve

domani login stores the credential in the operating-system keychain when one is available. The stdio bridge resolves it locally and forwards MCP requests to https://domani.run/mcp; stdout remains reserved for JSON-RPC messages. To pin the bridge to one of several saved accounts, start it with DOMANI_ACCOUNT=<name> domani mcp serve (or domani --account <name> mcp serve).

For an agent acting on someone else's behalf, request a scoped, expiring credential instead of their account key:

domani login --scopes domains:read,search --label "Project agent" --expires-in 86400

The approval screen shows the requested access and the resulting credential is stored in the keychain without being printed.

After login, prove one complete inbound loop before browsing other tools or buying a domain:

domani email create [email protected]
domani email webhook [email protected] --url https://my-agent.example/webhook
domani email webhook-test [email protected]

Use --surface plugin, --surface skill, or --surface api when that is the entry point. This keeps activation attribution consistent without exposing a credential.

This installs the domani command. Or run directly with npx:

npx domani-cli search myapp .com .dev .ai

Quick start

# Domain
domani search myapp .com .io .dev     # Check availability
domani buy myapp.dev                  # Purchase a domain
domani connect myapp.dev vercel       # Auto-configure DNS for Vercel

# Email
domani email create [email protected]               # Create [email protected]
domani email send [email protected] \
  --to [email protected] --subject "Hello" --body "Sent from my terminal"
domani email forward [email protected] \
  --forward-to [email protected]                        # Forward inbound to personal email

# Health
domani status myapp.dev               # DNS, SSL, email, expiry check

Examples

# Find available domains with a budget
domani search startup --expand --max-price 20

# AI-powered name suggestions
domani suggest "minimalist productivity app" --style brandable --tlds com,dev,ai

# Buy multiple domains at once
domani buy startup.dev startup.ai --yes

# Set up Vercel + Google Workspace in two commands
domani connect startup.dev vercel
domani connect startup.dev google-workspace

# Full email workflow: create, send, check inbox, forward
domani email create [email protected]
domani email send [email protected] \
  --to [email protected] --subject "Deck" --body "Here's our deck."
domani email inbox [email protected] --direction in
domani email forward [email protected] --forward-to [email protected]

# Webhook for inbound emails (for bots, support systems, etc.)
# CURSOR_AUTH contains the complete value, e.g. "Bearer sender-key"
domani email webhook [email protected] --url https://myapp.dev/hooks/email \
  --authorization-env CURSOR_AUTH
domani email webhook-test [email protected]

# Provision domain + mailbox + authenticated event webhook in one call.
# The secret stays in the environment; only its variable name is in argv.
AGENT_AUTH="Bearer sender-key" domani provision agent.dev \
  --webhook https://agent.example/inbox --authorization-env AGENT_AUTH

# Export DNS records before making changes
domani dns startup.dev snapshot
domani dns startup.dev set TXT @ "v=spf1 include:_spf.google.com ~all"

# Pipe to jq (auto-JSON when piped, no --json needed)
domani list | jq '.domains[] | {domain, expires_at}'

# Introspect command schemas for agent integration
domani schema buy --json

Commands

Domains
domani search <name> [tlds...]    Check availability across TLDs (--expand for 30+)
domani suggest <prompt>           AI-powered domain suggestions (--style, --lang, --tlds)
domani buy <domains...>           Purchase one or more domains
domani adopt <domain>             Inspect and plan a safe connection or transfer
domani transfer <domain>          Transfer registration, preserving current nameservers
domani renew <domain>             Renew a domain (--years 1-10)
domani import <domain>            Import a domain you own elsewhere (DNS monitoring only)
domani list                       List your domains
domani status <domain>            Health check (DNS, SSL, email, expiry)
domani tlds                       List all TLDs with pricing (--sort, --max-price)
domani whois <domain>             WHOIS/RDAP lookup
domani deals [id]                 Marketplace deals (--role, --status, --limit, --cursor) or one deal
Email
domani email list                    List all mailboxes
domani email create user@domain      Create a mailbox
domani email delete user@domain      Delete a mailbox
domani email inbox user@domain       List messages (--folder, --view, --direction, --since, --until, --cursor)
domani email folders user@domain     List folder and view counts
domani email contacts                Address book (--q, --cursor; --order created for a full sync)
domani email archive user@domain --message-ids m1,m2
domani email trash user@domain --message-ids m1
domani email restore user@domain --message-ids m1
domani email read|unread|star|unstar user@domain --message-ids m1,m2
domani email send user@domain        Send an email (--to, --subject, --body, --cc, --bcc)
domani email forward user@domain     Forward inbound to a personal address (--forward-to)
domani email webhook user@domain     Forward inbound as JSON (--url, --authorization-env, --api-key-env, --clear-headers)
domani email webhook-test user@domain Deliver one signed test event to the configured webhook
domani email setup --domain <domain>       Auto-configure MX, SPF, DKIM, DMARC
domani email status --domain <domain>      Check email DNS health
domani email connect --domain <domain> <provider>   Connect external provider (Gmail, Fastmail, Proton)
Mailzero assistant (private preview)
domani assistant today               Now, Needs you, Waiting, Upcoming, Handled
domani assistant settings            Opt-in state, consent, and mailbox scope
domani assistant set                 Change settings (--enable, --shadow, --pause, --mailboxes, --none, --days)
domani assistant preview             Record consent and start a background history import (--mailboxes, --consent)
domani assistant backfill|retry      Follow the import or requeue its terminal failures
domani assistant item <id>           One work item with its Decision and options
domani assistant choose <id>         Record a decision (--item-version, --decision, --decision-version, --option)
domani assistant instruct|snooze|ignore|take-over|correct <id>
domani assistant plan <id>           Exact preview of a prepared reply; nothing is sent by the CLI
domani assistant activity            Content-free interaction and receipt log
domani assistant rules               The standing delegations (match, assignee, level, grants)
domani assistant approvals           The plans waiting for you and the questions your agents asked
domani assistant suggestions         The rules the assistant proposes from what recurred
domani assistant metrics             The seven numbers per account and per rule (--days)
domani assistant task <id>           The task envelope an assignee works from
domani assistant lease|release|effects|escalate|report <id>
domani assistant export|delete       Export or delete derived data (source mail is never touched)

Tokens need assistant:read for reads and assistant:write for changes.

DNS
domani dns <domain> get            List all DNS records
domani dns <domain> set <type> <name> <value>   Add/update a record
domani dns <domain> delete <type> <name>        Remove a record
domani dns <domain> snapshot       Export DNS to file
domani dns <domain> restore        Restore DNS from snapshot
domani nameservers <domain>        Get or set nameservers (--reset for defaults)
domani connect <domain> <target>   Auto-configure DNS for a provider
domani route [action] [id]         Short-lived HTTP routes (list: --domain, --status, --limit, --cursor)

Supported providers: Vercel, Netlify, Cloudflare Pages, GitHub Pages, Fly.io, Railway, Render, Google Workspace, Fastmail, Proton Mail.

Settings
domani settings <domain>           View/update auto-renew, WHOIS privacy, security lock
domani contact [view|set]          Manage WHOIS contact info
domani parking <domain>            Manage parking page (enable/disable/price)
domani analytics <domain>          View parking analytics
domani auth-code <domain>          Get EPP auth code for outbound transfer
domani transfer-away <domain>      Check outbound transfer status
Account
domani login                       Log in to domani.run (opens browser)
domani logout                      Forget the current account's login (--account <name> for another)
domani accounts                    List saved accounts, * marks the one in use
domani use <name>                  Switch the active account
domani me                          Show account info and the CLI account in use
domani billing                     Add or update payment method (opens browser)
domani invoices                    List payment invoices
domani notifications               List notifications (--unread, --limit, --cursor; --read marks all read)
domani token                       Print your API key
domani tokens [list|create|revoke] Manage API tokens (scoped, expiring)
domani webhooks [action]           Manage webhook endpoints (auth headers via --authorization-env/--api-key-env)
Introspection
domani schema [command]            Show command schemas for AI agent integration
domani update                      Update to the latest version
domani uninstall                   Remove domani CLI and config

Agent integration

Built for AI agents and scripts, not just humans.

TTY auto-detect: When stdout is not a terminal, the CLI automatically switches to JSON output and skips confirmation prompts. No --json flag needed.

domani list | jq '.domains[].domain'

Paging: list commands print More: --cursor <next_cursor> when another page exists (in JSON mode, read next_cursor); pass it back with --cursor to get the next page.

Structured errors: In JSON mode, errors include code, hint, and fix_command for auto-recovery:

{ "error": "Not logged in", "code": "auth_required", "fix_command": "domani login" }
CodeFixDescription
auth_requireddomani loginNot logged in
payment_requireddomani billingNo payment method on file
contact_requireddomani contact setWHOIS contact info missing
validation_errorRead hintInvalid input
not_found-Domain doesn't exist or not owned
rate_limitedWait Retry-AfterToo many requests

Flags:

FlagDescription
--jsonForce JSON output
--fields <f>Filter JSON fields (comma-separated)
--dry-runPreview mutations without executing
--yesSkip confirmation prompts

Input hardening: All inputs are validated against path traversal, control characters, query strings, and double encoding - common agent hallucinations.

Schema introspection: Run domani schema <command> --json to get parameter types, constraints, and enums before constructing a command.

Payments

Domains are charged to your saved card. Add one at domani.run/dashboard or with domani card add.

domani buy myapp.dev                     # Charged to saved card

Authentication

MethodDescription
domani loginInteractive login (opens browser)
$DOMANI_API_KEYAPI key as environment variable
OS keychainCredential saved by domani login when available
~/.domani/config.jsonNon-secret CLI settings, plus legacy fallback on systems without a keychain

The CLI checks $DOMANI_API_KEY first, then falls back to the saved login.

domani login                             # Interactive (opens browser)
export DOMANI_API_KEY=domani_sk_...      # Or set env var
Several accounts

The CLI can keep more than one Domani account, each under a name, with its own keychain entry:

domani login --account work              # save a second account as "work"
domani accounts                          # list them; * marks the one in use
domani use work                          # make "work" the active account
domani --account personal list           # use another account for one command
DOMANI_ACCOUNT=work domani mcp serve     # pin an agent's MCP bridge to "work"
domani logout --account work             # forget that login only

The credential a command uses is, in order: DOMANI_API_KEY, --account, DOMANI_ACCOUNT, then the active account. domani me shows the account in use, and the buy, renew and transfer confirmations name it before anything is charged. A login saved by an earlier CLI version becomes the account default, with nothing to redo.

Scoped API tokens can be created with domani tokens create --scopes read,dns --expires-in 86400.

Environment variables

VariableDescription
DOMANI_API_KEYAPI key (takes precedence over saved config)
DOMANI_ACCOUNTSaved CLI account to use (below --account, above domani use)
DOMANI_CONFIG_DIRConfig directory (default ~/.domani)

License

MIT

Comments

Markdown supported

New to MCP?

From what the protocol is to installing your first server, these answers cover most first questions.

An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.