Skip to main content
Glama

mxroute-mcp

npm version Node.js >=20 License: MIT

MXroute is an email hosting provider. Its Email Hosting REST API lives at https://api.mxroute.com and manages the moving parts of a hosted mail account: domains and their DNS, mailboxes, forwarders, spam filtering, quotas, and — for reseller accounts — the users and packages underneath them.

mxroute-mcp is an MCP (Model Context Protocol) stdio server that wraps that API. It exposes 43 tools so an AI agent in Claude Desktop, Cursor, or any other MCP client can operate an MXroute account end to end: onboarding domains, creating mailboxes and forwarders, tuning spam handling, reading DNS records, setting catch-alls, investigating quota usage, and administering reseller users and packages. Requires Node.js 20 or newer.

Contents

Related MCP server: PurelyMail MCP Server

Requirements and quick start

  • Node.js 20 or newer.

  • An MXroute API key. Create a dedicated key just for this server at https://panel.mxroute.com/api-keys.php — that page also shows the mail server hostname and username to use. See Security for why a dedicated key and what else to lock down before connecting.

  • Every tool call requires the three environment variables MXROUTE_API_KEY, MXROUTE_SERVER, and MXROUTE_USERNAME; without them calls fail with CONFIG_MISSING.

Claude Desktop

Edit the config file: %APPDATA%\Claude\claude_desktop_config.json on Windows, ~/Library/Application Support/Claude/claude_desktop_config.json on macOS.

{
  "mcpServers": {
    "mxroute": {
      "command": "npx",
      "args": ["-y", "mxroute-mcp"],
      "env": {
        "MXROUTE_API_KEY": "your-api-key",
        "MXROUTE_SERVER": "your-server-hostname",
        "MXROUTE_USERNAME": "your-username"
      }
    }
  }
}

Cursor

Edit ~/.cursor/mcp.json:

{
  "mcpServers": {
    "mxroute": {
      "command": "npx",
      "args": ["-y", "mxroute-mcp"],
      "env": {
        "MXROUTE_API_KEY": "your-api-key",
        "MXROUTE_SERVER": "your-server-hostname",
        "MXROUTE_USERNAME": "your-username"
      }
    }
  }
}

From source

Clone this repository, then:

npm install
npm run build

Point the MCP client at the built entry point instead of npx:

{
  "mcpServers": {
    "mxroute": {
      "command": "node",
      "args": ["/path/to/build/index.js"],
      "env": {
        "MXROUTE_API_KEY": "your-api-key",
        "MXROUTE_SERVER": "your-server-hostname",
        "MXROUTE_USERNAME": "your-username"
      }
    }
  }
}

Claude CLI one-liner

claude mcp add mxroute --env MXROUTE_API_KEY=... --env MXROUTE_SERVER=... --env MXROUTE_USERNAME=... -- npx -y mxroute-mcp

Configuration

The server reads its configuration from environment variables.

Variable

Required

Description

Example

MXROUTE_API_KEY

Yes

API key. Send the complete key unchanged (no keyid: prefix).

your-api-key

MXROUTE_SERVER

Yes

Mail server hostname.

eagle.mxlogin.com

MXROUTE_USERNAME

Yes

DirectAdmin username. Resellers can send reseller|user to act as an owned user.

your-username or your-reseller|your-user

MXROUTE_API_BASE

No

API base URL override.

https://api.mxroute.com

Where the values come from: create an API key at https://panel.mxroute.com/api-keys.php. The server hostname and username are shown on that same page. Send the complete key unchanged, including any colons; do not prepend the key ID — the legacy keyid:password parsing is no longer supported. Account passwords only work if DirectAdmin permits password-based API access (api_with_password=yes in the account's user.conf); login keys are unaffected — prefer API keys.

The server starts even without credentials (it prints a warning to stderr naming the missing variables) and tools/list works, but every tool call returns CONFIG_MISSING until all three required variables are set. Values are trimmed; a blank value counts as missing. MXROUTE_API_BASE defaults to https://api.mxroute.com and has trailing slashes removed.

Reseller impersonation

A reseller can act as one of its owned ordinary users by setting MXROUTE_USERNAME to reseller|user — for example:

"MXROUTE_USERNAME": "your-reseller|their-user"

Keep MXROUTE_API_KEY as the reseller's own complete key and MXROUTE_SERVER as the reseller's server (the equivalent API call is X-Username: reseller|user with the reseller's key, as in the API's own curl examples). Each name on either side of the pipe must be 1–16 characters of letters, digits, or underscores. Chained pipes and self-impersonation are rejected; use the plain username to manage the reseller's own account.

While impersonating, all account and domain operations apply to the target user. Reseller-only endpoints (the reseller users and packages tools) are unavailable and return FORBIDDEN — switch MXROUTE_USERNAME back to the plain reseller username to use them. Only ordinary user targets are supported; admin credentials and user-to-user impersonation are not. The reseller and all impersonated targets share the reseller's rate-limit bucket on that server.

Security

The MXroute API has no OAuth or delegation flow, so this server must hold a real credential, and every request it makes is triggered by the agent driving it. Whoever or whatever can make the agent call tools can exercise everything the key permits — deleting domains, mailboxes, and, for reseller keys, users. The model never sees the key value: it reaches only the server process as an environment variable, and nothing echoes it in tool output or logs. Prompt injection or a mistaken instruction can still trigger any tool the key authorizes, so the controls that matter are how powerful the key is and what the client's approval gate lets through.

Before you connect

  1. Create a dedicated API key just for this server at https://panel.mxroute.com/api-keys.php. Never use the account password, and never reuse a key that something else depends on. A dedicated key can be revoked on its own if the agent misbehaves or the config leaks.

  2. If the key's settings support command restrictions, restrict the key to what this server needs.

  3. Keep the client's per-tool approval prompts on for this server; never auto-approve everything. Eight tools carry destructiveHint: true annotations:

    Tool

    What it deletes

    delete_domain

    The domain and everything configured under it

    delete_email_account

    The mailbox and its stored mail

    delete_forwarder

    The forwarder

    delete_domain_pointer

    The pointer — the pointed domain stops serving mail through it

    remove_spam_whitelist_entry

    The whitelist entry (sender lists are shared across the account's domains)

    remove_spam_blacklist_entry

    The blacklist entry (shared the same way)

    delete_reseller_user

    The user and everything under it

    delete_package

    The package

    Clients may ignore annotations; approval gates are user-controlled. Treat the prompts for these eight tools as the last line of defense.

Scoping what the credential can reach

  • Resellers: set MXROUTE_USERNAME to reseller|user so the server manages one owned ordinary user instead of the reseller account. Reseller-admin endpoints (the reseller users and packages tools) are unavailable while impersonating, and only that user's domains and mailboxes are reachable. The reseller and all impersonated targets share the reseller's rate-limit bucket.

  • Isolation pattern: provision a dedicated user with a small package and a single domain, then run this server impersonating it. The blast radius becomes that user's single domain, not the reseller account. This scopes what the server will do with the key — the config file still stores the reseller's key, so guard it as described in Where the key lives.

  • Informational use only: if you need only quota reads, DNS records, and listings, say so in your agent's instructions and decline write tool calls at the approval prompt. The API has no read-only key type; unless the key's command restrictions enforce it, read-only use depends on you and the client.

Where the key lives

  • The key sits in plaintext in the MCP client config file (claude_desktop_config.json, ~/.cursor/mcp.json), readable by anything running as your user. On macOS/Linux, chmod 600 the config file; on Windows it lives under the user profile — the same exposure class.

  • The claude mcp add --env one-liner also records the key in shell history. Prefer editing the config file directly.

  • MXROUTE_API_BASE receives the key on every request — only set it deliberately, when you have a specific reason to redirect API traffic.

  • The server never prints the key. The only config value that can appear in an error message is MXROUTE_API_BASE (in the network-error message); the startup warning names only the missing variable names.

Tool reference

Field order in each signature: required parameters first, then optional ones marked with ?. Types are called out in prose where they are not obvious. Where the API documents no success body, the tool returns a success message instead of a payload.

Account

get_verification_key

get_verification_key()

Returns the account's domain verification key plus the exact TXT record to publish: { key, record: { type, name, value }, description? }. To add a new domain, create a TXT record at the registrar named <key>.<yourdomain> with value domain-verified, wait for DNS propagation (typically 5–15 minutes), then call create_domain.

Domains

A domain must pass ownership verification before create_domain accepts it (see get_verification_key).

list_domains

list_domains()

Lists all domains on the account. Returns an array of domain names, e.g. ["example.com", "mydomain.org"]. Use get_domain for the details of a single domain.

create_domain

create_domain(domain)

Adds a new domain to the account for email hosting. The verification TXT record must already exist and have propagated. Returns the created domain and its ssl_enabled status (or a success message when the API returns an empty body). A 409 CONFLICT means the domain already exists on the account.

get_domain

get_domain(domain)

Returns the details of one domain: { domain, mail_hosting?, ssl_enabled?, pointers? }, where pointers lists the pointer domain names attached to it. Use list_domains to discover the domain names on the account.

delete_domain

delete_domain(domain)

Removes the domain from the account. Deletes the domain and everything configured under it — mailboxes and forwarders stop working and mail to the domain is no longer handled. Destructive and irreversible. Use set_domain_mail_hosting to pause mail service without deleting the domain. Returns a success message.

set_domain_mail_hosting

set_domain_mail_hosting(domain, enabled)

Enables or disables mail hosting for a domain. enabled is a boolean: true to have MXroute handle mail for the domain, false to pause mail hosting. Pure state change — the domain, its mailboxes, and their settings are kept. Returns a success message.

Domain pointers

A domain pointer attaches a second domain to an existing one: an alias serves the same mailboxes as the target domain, a redirect forwards it elsewhere.

list_domain_pointers

list_domain_pointers(domain)

Lists the pointers (aliases and redirects) attached to a domain. Each entry has { pointer, type, target }, where type is "alias" or "redirect" and target is the domain it serves.

create_domain_pointer

create_domain_pointer(domain, pointer, alias?)

Attaches a pointer domain to an existing domain. alias is a boolean, true by default (alias serving the same mailboxes); false makes it a redirect. Returns a success message.

delete_domain_pointer

delete_domain_pointer(domain, pointer)

Removes a pointer from a domain; the pointer domain stops serving the target domain's mailboxes and the target domain itself is unchanged. Returns a success message.

Email accounts

Mailboxes live under a domain; the username, user parameters are the local part (the part before the @).

list_email_accounts

list_email_accounts(domain)

Lists the mailboxes under a domain. Each entry has { username, email, quota, usage, limit, sent, suspended }: quota in MB (0 = unlimited), current usage in MB, daily send limit, messages sent today, and suspended status.

create_email_account

create_email_account(domain, username, password, quota?, limit?)

Creates a mailbox. username is the local part (before the @). Passwords are 8–72 characters plus the mail server's own character and strength rules (enforced server-side). quota in MB (integer, default 1024, 0 = unlimited); limit is the daily send cap (integer 0–9600, default 9600). Returns a success message.

get_email_account

get_email_account(domain, user)

Returns one mailbox's details, same shape as the list_email_accounts entries. user is the mailbox local part (the part before the @).

update_email_account

update_email_account(domain, user, password?, quota?, limit?)

Updates a mailbox's password, storage quota in MB, or daily send limit. At least one of the three fields must be provided; omitted fields keep their current values. The mailbox is looked up case-insensitively by local part. Password rejections return field-specific errors naming the password field. Returns a success message.

delete_email_account

delete_email_account(domain, user)

Deletes the mailbox and its stored mail — irreversible; the address immediately stops accepting mail. Read the exact username casing back from list_email_accounts or get_email_account before deleting: updates resolve the local part case-insensitively, but deletes should use the exact stored casing. Returns a success message.

Forwarders

Forwarders route mail for an address without storing it in a mailbox.

list_forwarders

list_forwarders(domain)

Lists all forwarders on a domain. Each entry has { alias, email, destinations }: the alias local part, the full forwarder address, and the destination addresses it forwards to.

create_forwarder

create_forwarder(domain, alias, destinations)

Creates a forwarder for an alias on a domain. destinations is a non-empty array of email addresses; the special values :blackhole: (silently discard mail) and :fail: (reject mail) are also accepted. Forwarding to Gmail, Yahoo, AOL, and similar providers automatically enables Expert Spam Filtering for the domain to protect its sending reputation. Returns a success message.

delete_forwarder

delete_forwarder(domain, alias)

Deletes a forwarder by its alias; mail sent to the alias is no longer forwarded. Read the alias's exact stored casing back from list_forwarders before deleting, and pass it unchanged. Returns a success message.

Spam settings

Sender lists (whitelist and blacklist) are shared across all domains on the account. Entries match case-insensitively, so adding a duplicate returns 409 CONFLICT, and writes are serialized account-wide — a 503 means another update on the account is in progress.

get_spam_settings

get_spam_settings(domain)

Returns { high_score }, the SpamAssassin-style score threshold (1–50) at which incoming mail is automatically deleted.

update_spam_settings

update_spam_settings(domain, high_score)

Sets the spam auto-deletion threshold. high_score is an integer 1–50; lower values delete more aggressively, higher values keep more mail. If the save fails (for example 503), re-read the settings before retrying. Returns a success message.

get_spam_whitelist

get_spam_whitelist(domain)

Lists the whitelist entries. Whitelisted senders bypass spam filtering. Entries support wildcards (for example *@trusted.com) and match case-insensitively. Returns the entry list.

add_spam_whitelist_entry

add_spam_whitelist_entry(domain, entry)

Adds an entry to the whitelist; supports wildcards such as *@trusted.com. A 409 means the entry already exists (entries match case-insensitively). Because sender lists are account-wide, this affects every domain on the account. Returns a success message.

remove_spam_whitelist_entry

remove_spam_whitelist_entry(domain, entry)

Removes an entry from the whitelist. Entries match case-insensitively, so the stored casing may differ. Affects every domain on the account. Returns a success message.

get_spam_blacklist

get_spam_blacklist(domain)

Lists the blacklist entries; blacklisted senders are always treated as spam. Entries support wildcards and match case-insensitively. An empty 200 response is treated as an empty list. Returns the entry list.

add_spam_blacklist_entry

add_spam_blacklist_entry(domain, entry)

Adds an entry to the blacklist; supports wildcards such as *@example.com. A 409 means the entry already exists (entries match case-insensitively). Affects every domain on the account. Returns a success message.

remove_spam_blacklist_entry

remove_spam_blacklist_entry(domain, entry)

Removes an entry from the blacklist. Entries match case-insensitively, so the stored casing may differ. Affects every domain on the account. Returns a success message.

DNS

get_dns_records

get_dns_records(domain)

Read-only. Returns the DNS records to configure at the domain's registrar for MXroute mail delivery: { mx_records: [{ priority, hostname, description? }], spf: { type, name, value }, dkim, verification }, where each TXT record is { type, name, value, description? }. dkim and verification are null when the record does not apply to this domain.

Catch-all

The catch-all decides what happens to mail addressed to nonexistent local parts on a domain.

get_catch_all

get_catch_all(domain)

Returns { type, address, description? }: type is "fail" (reject), "blackhole" (silently discard), or "address" (forward); address holds the forwarding destination when type is "address", otherwise null.

set_catch_all

set_catch_all(domain, type, address?)

Sets how the domain handles mail to nonexistent local parts: fail rejects the mail, blackhole silently discards it, address forwards it to a chosen mailbox or forwarder. address is an email address, required when type is "address" and must be omitted otherwise. Returns a success message.

Quota

Both tools report data refreshed hourly, so values can lag recent changes by up to an hour. Sizes are in bytes.

get_disk_quota

get_disk_quota()

Returns account disk usage: { username, total_used, total_limit, percent_used, breakdown, grace_period, updated_at } — totals in bytes (total_limit 0 = unlimited), a per-category breakdown in bytes (email, web, databases, backups, other), and the over-quota grace period ({ days_remaining, deadline }, null when not over quota).

get_email_usage

get_email_usage()

Returns per-mailbox disk usage for the account, largest mailbox first: { username, accounts: [{ email_address, size_bytes, updated_at }] }. Useful for finding which mailboxes to trim when the account nears its quota.

Reseller users

Reseller-only: every tool in this group must be called while authenticated as the reseller (plain reseller username), not while impersonating a user — they return 403 FORBIDDEN otherwise.

list_reseller_users

list_reseller_users()

Lists the usernames of all users under the reseller account. Returns an array of strings.

create_reseller_user

create_reseller_user(username, email, password, package)

Creates a user under the reseller account. username is 1–10 characters [a-z0-9_]; password has a minimum of 8 characters (no maximum); email is a contact email address; package is an existing package name (see list_packages — 422 means it does not exist). Returns a success message.

get_reseller_user

get_reseller_user(username)

Returns one user's details: { username, email, domain, package, suspended, quota }, where quota is { limit, used, unlimited } with limit in MB (null when unlimited). A 404 means the user does not exist.

update_reseller_user

update_reseller_user(username, quota?, password?)

Updates a user's disk quota and/or password; at least one of the two fields must be provided. quota is a digit string in MB or "unlimited". password follows the reseller rule (minimum 8 characters). A 404 means the user does not exist. Returns a success message.

delete_reseller_user

delete_reseller_user(username)

Deletes the user and everything under it — irreversible. Per DirectAdmin behavior the deletion may fail or cascade, so double-check the username first. Returns a success message.

suspend_reseller_user

suspend_reseller_user(username)

Suspends a user, blocking their access without deleting data. Repeating the call is harmless. Returns a success message.

unsuspend_reseller_user

unsuspend_reseller_user(username)

Reverses a suspension, restoring the user's access. Repeating the call is harmless. Returns a success message.

set_reseller_user_package

set_reseller_user_package(username, package)

Moves a user to a different package and returns the updated user (same shape as get_reseller_user). Changing the package can change the quota and limits of every domain under the user. A 422 means the package does not exist.

Reseller packages

Reseller-only, same as the user tools: unavailable while impersonating. Limit values are digit strings or the literal "unlimited"; the package quota is in GB.

list_packages

list_packages()

Lists the names of all packages defined under the reseller account. Returns an array of strings.

create_package

create_package(name, quota?, domains?, email_accounts?, email_forwarders?, domain_pointers?)

Creates a package that reseller users can be assigned to. name may contain letters, numbers, underscores, and hyphens. Each limit is a digit string or "unlimited"; quota is in GB. Unset limits take the API defaults: quota 1 GB, 1 domain, 100 email accounts, 100 email forwarders, 10 domain pointers. Returns a success message.

get_package

get_package(name)

Returns one package: { name, settings } with settings.quota_gb (null when unlimited), settings.quota_unlimited, and the domains, email_accounts, email_forwarders, domain_pointers limits (null = unlimited; email_accounts excludes the system mailbox). A 404 means the package does not exist.

update_package

update_package(name, quota?, domains?, email_accounts?, email_forwarders?, domain_pointers?)

Updates a package's limits; at least one field must be provided, omitted fields keep their current values. quota is in GB here (the reseller user quota is in MB). Changes affect every user on the package. A 404 means the package does not exist. Returns a success message.

delete_package

delete_package(name)

Deletes a package. Fails with 422 while any user is still on the package; move affected users to another package first (set_reseller_user_package). Returns a success message.

Input formats

Recurring input formats shared across tools:

Input

Format and rules

domain

Hostname such as example.com; trimmed and lowercased before validation. Letters, digits, hyphens per label; no leading/trailing hyphen or dot; at least one dot; labels up to 63 characters; total up to 253.

Local part (username, user, alias)

1–64 characters: letters, digits, dot, and the special characters !#$%&'*+-/=?^_ plus backtick, braces, tilde, and vertical bar. Must not be . or ...

Mailbox password (password)

8–72 characters, and must additionally pass the mail server's character and strength rules (enforced server-side).

Reseller user password

Minimum 8 characters, no maximum.

Spam entry (entry)

Up to 254 characters from letters, digits, and @ . - _ * + =; wildcards supported, e.g. *@trusted.com. Must not be . or ... Duplicate matching is case-insensitive.

high_score

Integer 1–50.

Mailbox quota

Integer number of MB, 0 or more; 0 = unlimited.

Mailbox limit

Integer 0–9600 (daily send cap).

Package/user limits

Digit string or the literal "unlimited". Units: package quota is GB, reseller user quota is MB, the other fields are plain counts.

Catch-all type

One of fail, blackhole, address; address input required exactly when type is address.

Package name

Letters, numbers, underscores, and hyphens.

Reseller username

1–10 characters, lowercase letters, digits, and underscores.

Rate limits

The API allows 200 reads per minute (GET), 60 writes per minute (POST, PATCH, DELETE), and 10 bulk/import requests per minute. Every response carries X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset (a Unix timestamp) headers.

When a limit is hit, the tool returns a RATE_LIMITED error whose hint names the wait derived from the response's Retry-After header (falling back to X-RateLimit-Reset), e.g. Wait 30s (Retry-After) before retrying. The server does not auto-retry: writes are not idempotent, so a blind retry could duplicate a create — let the agent wait out the interval and retry deliberately. While impersonating, the reseller and all impersonated targets share the reseller's rate-limit bucket on that server.

Error reference

Errors surface as tool results in the form [CODE] message, followed by Field: <field>. for validation errors and Hint: <hint>. with the actionable fix when one applies.

Code

Meaning

What to do

VALIDATION_ERROR

Invalid input; the API rejected a field, and the error names it in Field:. Also raised locally for path parameters that are . or ...

Fix the highlighted field and retry.

UNAUTHORIZED

Invalid or missing credentials.

Check MXROUTE_API_KEY, MXROUTE_SERVER, MXROUTE_USERNAME. Send the complete key unchanged, without the keyid: prefix. Create keys at https://panel.mxroute.com/api-keys.php.

FORBIDDEN

The credential lacks permission.

Reseller endpoints need reseller privileges and are unavailable while impersonating a user with reseller|user.

NOT_FOUND

Resource not found.

Check that the name is spelled exactly and exists on this account/server.

CONFLICT

The resource already exists (spam entries match case-insensitively).

Inspect the existing resource instead of creating it again.

BUSINESS_ERROR

The request violates a business rule (e.g. a limit was reached).

See the message.

RATE_LIMITED

Too many requests.

Wait for the interval named in the hint (from Retry-After) before retrying. Limits: 200 reads/min, 60 writes/min, 10 bulk/min.

SERVER_ERROR

API internal error; also raised locally for a non-JSON response or an unexpected empty response from a documented endpoint.

Retry later; if it persists check MXroute status/discord. A 503 means another update may be in progress on this account — wait a few seconds, re-read the settings, then retry.

CONFIG_MISSING

Required environment variables are not set; the error hint lists all three required variables (the startup warning names only the missing ones).

Set the three variables in the MCP client's env block and restart the client.

TIMEOUT

The API request exceeded the 30-second per-request timeout.

Retry; if it persists, check network conditions.

NETWORK_ERROR

Could not reach the API base URL.

Check the network connection and MXROUTE_API_BASE.

Workflows

Onboard a new domain

  1. get_verification_key — returns the key and the exact TXT record to publish.

  2. Add the TXT record at the registrar (outside this API): name <key>.<yourdomain>, value domain-verified.

  3. Wait for DNS propagation — typically 5–15 minutes.

  4. create_domain with { "domain": "example.com" }.

  5. get_dns_records for the domain — apply the returned MX, SPF, and DKIM records at the registrar.

Create a mailbox

  1. create_email_account with the domain, username (local part), and password. Optional: quota in MB (default 1024, 0 = unlimited) and limit, the daily send limit (0–9600, default 9600).

  2. get_email_account or list_email_accounts to confirm.

  3. update_email_account later to change password, quota, or limit; omitted fields stay unchanged.

Forward an alias to Gmail

  1. create_forwarder with the domain, alias (local part), and destinations: ["user@gmail.com"].

  2. Side effect: forwarding to Gmail (or Yahoo/AOL-like providers) auto-enables Expert Spam Filtering for the domain. Use get_spam_settings and update_spam_settings if the threshold needs adjusting.

  3. delete_forwarder to remove the alias.

Manage spam filtering

  1. add_spam_whitelist_entry with *@trusted.com to whitelist a trusted sender — wildcards cover the whole domain. To block instead, use add_spam_blacklist_entry.

  2. get_spam_settings to read the current high_score, then update_spam_settings to tune it — lower values delete more aggressively, higher values keep more mail (integer 1–50).

  3. Remember the lists are account-wide: an entry added through one domain applies to every domain on the account, and duplicates match case-insensitively (409).

Set a catch-all

  1. get_catch_all to inspect the current setting.

  2. set_catch_all to change it: fail rejects mail to unknown addresses, blackhole silently discards it, address forwards it to a chosen mailbox or forwarder. The address parameter is required exactly when the type is address.

Run a reseller account

  1. create_package to define the plan — unset limits default to quota 1 GB, 1 domain, 100 email accounts, 100 forwarders, 10 domain pointers.

  2. create_reseller_user with the new package (the package must exist first; 422 otherwise).

  3. set_reseller_user_package later to move a user to a different plan; update_package to change limits for everyone on a package.

  4. suspend_reseller_user / unsuspend_reseller_user for non-payment-style scenarios — access blocked, data kept.

  5. These tools require the plain reseller username; they return FORBIDDEN while impersonating a user.

Investigate quota usage

  1. get_disk_quota for account-level usage in bytes, including the per-category breakdown and any over-quota grace period.

  2. get_email_usage to find the largest mailboxes.

  3. Trim by lowering a mailbox's quota via update_email_account or removing unused mailboxes with delete_email_account. Both quota tools refresh hourly, so re-check after changes lag by up to an hour.

Troubleshooting

Symptom

Fix

UNAUTHORIZED

Check MXROUTE_API_KEY, MXROUTE_SERVER, and MXROUTE_USERNAME. Send the complete key unchanged, without the keyid: prefix. Create keys at https://panel.mxroute.com/api-keys.php.

CONFIG_MISSING at call time

The environment variables were not passed to the server process. Check the env block in the MCP client config; the server itself starts without credentials.

FORBIDDEN

The credential lacks permission: reseller endpoints need reseller privileges, and they are unavailable while impersonating a user with reseller|user.

RATE_LIMITED

Wait for the interval named in the error message (from Retry-After) before retrying. Limits: 200 reads/min, 60 writes/min, 10 bulk/min.

CONFLICT (409)

The resource already exists; spam list entries match case-insensitively.

TIMEOUT / NETWORK_ERROR

The request exceeded 30 seconds or the API base could not be reached. Check the network connection and MXROUTE_API_BASE; retry.

SERVER_ERROR with "unexpected empty response"

The API returned an empty or unexpected body for a documented endpoint. Retry the call; if it persists, the API contract may have changed.

503 on settings or account updates

Another update on this account is in progress. Wait a few seconds, re-read the current settings, then retry.

Tools do not appear in the client

Restart the MCP client after changing its config.

Development

git clone <this repository>
cd mxroute-mcp
npm install
npm run build
npm test
npm run inspect
  • npm run build — compile TypeScript to build/.

  • npm run typecheck — type-check without emitting.

  • npm run typecheck:tests — type-check the test files (and src) without emitting.

  • npm test — run the vitest suite; tests run against a mocked fetch, so no credentials are needed.

  • npm run inspect — start the server under the MCP Inspector for interactive testing.

Project structure:

src/
  index.ts               Entry point: stdio transport, config load, tool registration
  client.ts              REST client: auth headers, 30s timeout, error mapping, path encoding
  config.ts              Environment-variable configuration loading
  errors.ts              ApiError type and MCP result formatting
  schemas.ts             Shared zod input validators with agent-facing descriptions
  types.ts               TypeScript types for the API payloads
  tools/
    account.ts           1 tool: verification key
    domains.ts           5 tools: domain list/create/get/delete, mail hosting toggle
    pointers.ts          3 tools: domain pointer list/create/delete
    emailAccounts.ts     5 tools: mailbox list/create/get/update/delete
    forwarders.ts        3 tools: forwarder list/create/delete
    spam.ts              8 tools: spam settings and sender lists
    dns.ts               1 tool: DNS records
    catchAll.ts          2 tools: catch-all get/set
    quota.ts             2 tools: disk quota and per-mailbox usage
    resellerUsers.ts     8 tools: reseller user management
    resellerPackages.ts  5 tools: reseller package management
tests/
  config.test.ts         Configuration loading
  schemas.test.ts        Input validators
  client.test.ts         Client behavior: errors, timeout, path encoding
  tools.test.ts          All 43 tools against a mocked fetch

The suite is 157 tests across four files, all running against a mocked fetch — no credentials or network access are needed. CI (GitHub Actions) runs on Node 20 and 22 with npm ci, npm run build, npm run typecheck:tests, and npm test on every push and pull request. Publishing: prepublishOnly builds before the package is packed, and the files field ships only the compiled build/ directory (bin.mxroute-mcp points at build/index.js).

License

MIT. See LICENSE.

Available Tools

43 tools
add_spam_blacklist_entryAdd Spam Blacklist EntryA

Adds an entry to the spam blacklist; blacklisted senders are always treated as spam. Supports wildcards (for example *@example.com). A 409 error means the entry already exists (entries match case-insensitively). Sender lists are shared across all domains on the account.

NameRequiredDescriptionDefault
entryYesEmail address or pattern to allow/block; wildcards supported, e.g. *@trusted.com or user@example.com
domainYesDomain name on this account, e.g. example.com (letters, digits, hyphens; at least one dot)

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=false, so the safety profile is structured. The description adds real value beyond that: the 409 duplicate-error semantic, case-insensitive matching, wildcard support, and the important scope fact that sender lists are shared across all domains on the account.

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?

Three compact clauses, front-loaded with the action and its effect, followed by the wildcard format, error semantics, and account-wide scope. No filler and nothing buried.

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?

With an output schema present, annotations covering safety, and full schema coverage, the description supplies everything else an agent needs for a 2-parameter mutation: duplicate handling, matching rules, and account-wide reach. Only a note on cross-domain authorization or immediate-effect timing would improve it further.

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%, so both `domain` and `entry` are already documented, including wildcard examples and patterns; the schema itself carries the heavy lifting. The description reiterates the wildcard example and adds the case-insensitivity note, but does not explain per-parameter syntax beyond what the schema states, so baseline 3 applies.

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?

States a specific verb and resource ('Adds an entry to the spam blacklist') and immediately gives the resulting behavior ('blacklisted senders are always treated as spam'). This is unmistakably distinct from the sibling remove_spam_blacklist_entry and get_spam_blacklist, so an agent can select it without opening a schema.

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?

Usage is implied by the name and effect statement, and the 409 note tells the agent what happens on a duplicate, but there is no explicit when-to-use-vs-alternatives guidance (e.g., blacklist vs. whitelist conflict, or when to prefer update_spam_settings). Adequate but with a clear gap.

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

add_spam_whitelist_entryAdd Spam Whitelist EntryA

Adds an entry to the spam whitelist; whitelisted senders bypass spam filtering. Supports wildcards (for example *@trusted.com). A 409 error means the entry already exists (entries match case-insensitively). Sender lists are shared across all domains on the account.

NameRequiredDescriptionDefault
entryYesEmail address or pattern to allow/block; wildcards supported, e.g. *@trusted.com or user@example.com
domainYesDomain name on this account, e.g. example.com (letters, digits, hyphens; at least one dot)

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare a non-read-only, non-idempotent, non-destructive mutation, and the description adds genuinely new behavior: a 409 response when the entry already exists, case-insensitive matching, and the fact that whitelists are shared across all domains. It does not describe auth requirements or the response payload, but the output schema covers the latter.

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?

Four tight clauses, front-loaded with purpose followed by syntax, error behavior, and scope. Each sentence carries distinct information, with only minor overlap between the wildcard note and the schema.

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?

An output schema exists, so return values need no explanation. For a two-parameter mutation the description covers purpose, accepted syntax, duplicate handling, and scope semantics, leaving nothing an agent needs in order to call it correctly.

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

Parameters4/5

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

Schema coverage is already 100%, so the baseline is 3; the description earns above that by explaining that wildcards like `*@trusted.com` are valid and that matching is case-insensitive. The note that sender lists are shared across all domains is especially valuable because it clarifies that `domain` does not scope the entry itself.

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

Purpose4/5

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

"Adds an entry to the spam whitelist; whitelisted senders bypass spam filtering" gives a concrete verb, resource, and the effect of the operation. The name alone separates it from add_spam_blacklist_entry and remove_spam_whitelist_entry, but the description never states those distinctions explicitly, so it falls short of a 5.

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?

Usage context is implied by the tool name and reinforced by notes on wildcard support and the account-wide sharing of sender lists, which tells the agent the entry is not scoped to one domain. However, there is no explicit when-to-use or when-not routing against add_spam_blacklist_entry, update_spam_settings, or a prerequisite of checking get_spam_whitelist first.

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

create_domainCreate DomainA

Adds a new domain to the account for email hosting. The domain must be verified first: call get_verification_key, then add a TXT record named <key>.<domain> with the value domain-verified at the registrar, and wait for DNS propagation (typically 5-15 minutes) before calling this tool. Returns the created domain and its ssl_enabled status. A 409 error means the domain already exists on the account.

NameRequiredDescriptionDefault
domainYesDomain name on this account, e.g. example.com (letters, digits, hyphens; at least one dot)

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the annotations, the description discloses the verification prerequisite, expected DNS propagation time, return fields, and the 409 conflict behavior. These details materially help an agent avoid calling the tool prematurely or misinterpreting an already-existing domain.

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 purpose, followed by the verification workflow, return behavior, and error case. It is efficient overall, though the return-value sentence slightly duplicates what the output schema already captures.

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 prerequisite verification workflow and output schema, the description covers what an agent needs: when the domain must be verified, how to verify it, expected propagation delay, return fields, and the duplicate-domain error. No critical invocation context is missing.

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

Parameters3/5

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

The schema already fully documents the single 'domain' parameter with format guidance. The description reinforces that the domain is for email hosting and appears in the TXT record name, but adds no new syntax or constraints beyond the schema.

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 states a specific verb and resource: 'Adds a new domain to the account for email hosting.' It distinguishes the operation from sibling tools like create_domain_pointer by tying it to email hosting and domain verification.

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

Usage Guidelines4/5

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

It gives clear preconditions: verify the domain first by calling get_verification_key, adding a TXT record, and waiting for DNS propagation. It also explains the 409 error for existing domains, though it does not explicitly compare alternatives such as get_domain or list_domains.

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

create_domain_pointerCreate Domain PointerB

Attaches a pointer domain to an existing domain. With alias=true (the default) the pointer is an alias serving the same mailboxes as the target domain; with alias=false it is a redirect.

NameRequiredDescriptionDefault
aliasNotrue (default) = alias serving the same mailboxes; false = redirect
domainYesDomain name on this account, e.g. example.com (letters, digits, hyphens; at least one dot)
pointerYesDomain name on this account, e.g. example.com (letters, digits, hyphens; at least one dot)

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false, so the agent knows this is a non-idempotent write with no destructive effect. The description adds useful context that the pointer is 'attached to an existing domain' and that alias mode serves the target's mailboxes, but it says nothing about permission/verification requirements, duplicate-pointer conflicts, or what happens on repeat calls.

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?

Two tight sentences with zero filler; the core operation is front-loaded and the alias semantics follow immediately. Slight redundancy with the schema's alias description is the only inefficiency.

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?

An output schema exists, annotations cover the safety profile, and the full parameter set is schema-documented, so the description need not explain return values. What remains thin is the precondition/error context around attaching a pointer, which keeps it just short of fully complete.

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%, so all three parameters are already documented in the input schema. The description's alias=true/false explanation largely restates the schema's own parameter description, adding no new syntax, constraints, or defaults beyond it. Baseline 3 applies when the schema does the heavy lifting.

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

Purpose4/5

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

The description uses a specific verb and resource: 'Attaches a pointer domain to an existing domain,' and immediately distinguishes the two resulting behaviors (alias vs redirect). It does not explicitly differentiate itself from siblings such as delete_domain_pointer or list_domain_pointers, but the name and verb make the create-only role unambiguous.

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

Usage Guidelines2/5

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

There is no explicit guidance on when to use this tool versus create_domain, delete_domain_pointer, or list_domain_pointers, nor any stated prerequisites (e.g., the target domain must exist on the account). The alias/redirect explanation clarifies a mode choice once the tool is selected, but not the tool-selection decision itself.

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

create_email_accountCreate Email AccountB

Creates a mailbox under a domain. username is the local part before the @; password is 8-72 characters (the mail server additionally enforces its own character and strength rules server-side). quota is the storage limit in MB; limit is the daily send limit. Omitted quota and limit use the API defaults.

NameRequiredDescriptionDefault
limitNoDaily send limit (integer 0-9600; default 9600)
quotaNoStorage quota in MB (integer; 0 = unlimited; default 1024)
domainYesDomain name on this account, e.g. example.com (letters, digits, hyphens; at least one dot)
passwordYesPassword (8-72 characters; must also meet the mail server's character/strength rules — enforced server-side)
usernameYesLocal part of the email address (the part before the @), e.g. your_mailbox (1-64 chars)

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

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

Annotations cover the safety profile (not read-only, not idempotent, not destructive), so the description's job is to add context. It does add useful notes about server-side password-strength enforcement and default quota/limit application, but omits prerequisites (domain must exist), behavior when the mailbox already exists, and irreversibility of creation.

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?

Three front-loaded sentences with the core action first, then parameter clarification. It is efficiently sized, though the parameter recap partially duplicates the already-complete schema.

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

Completeness3/5

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

An output schema exists, so return values need not be explained, and the parameter space is covered. However, for a creation tool with five parameters and many sibling tools, the absence of prerequisites and duplicate-name behavior leaves a meaningful gap.

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%, so the baseline is 3. The description restates what the schema already documents (username as local part, 8-72 char password, quota in MB, daily send limit) rather than adding new meaning such as quota interaction with the account's disk quota or username collision behavior.

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

Purpose4/5

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

"Creates a mailbox under a domain" gives a specific verb and resource, and the mailbox framing separates it from sibling tools like create_domain, create_forwarder, and create_domain_pointer. It stops short of explicitly naming which sibling handles adjacent cases (e.g. update_email_account), so it is clear but not fully differentiated.

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

Usage Guidelines2/5

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

There is no when-to-use or when-not-to-use guidance: nothing says the domain must already exist and be verified, nor how this differs from update_email_account for an existing mailbox. Usage is only inferable from the tool name and 'Creates a mailbox under a domain.'

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

create_forwarderCreate ForwarderA

Creates an email forwarder for an alias on a domain. Special destinations: :blackhole: silently discards mail and :fail: rejects it. Forwarding to Gmail, Yahoo, AOL and similar providers automatically enables Expert Spam Filtering for the domain to protect its sending reputation.

NameRequiredDescriptionDefault
aliasYesLocal part of the email address (the part before the @), e.g. your_mailbox (1-64 chars)
domainYesDomain name on this account, e.g. example.com (letters, digits, hyphens; at least one dot)
destinationsYesDestination email addresses (at least one); the special values :blackhole: (silently discard mail) and :fail: (reject mail) are also accepted

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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

The annotations already declare the mutating, non-idempotent, non-destructive profile, but the description adds a genuinely non-obvious side effect: forwarding to Gmail/Yahoo/AOL automatically enables Expert Spam Filtering for the domain. It also explains the semantic effect of the special destination values, which is real behavioral information beyond the safety hints. It does not cover duplicate-alias handling or failure modes.

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?

Three compact sentences, front-loading the core action before the special-destination semantics and the domain-wide side effect. Nothing is padded or repeated unnecessarily for a tool of this scope.

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?

An output schema exists, so return values need not be explained, and the annotations carry the safety profile; the description fills its remaining duty by disclosing the automatic spam-filtering side effect. The only material gap is preconditions and duplicate/error behavior for an alias that already has a forwarder.

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%, with the alias/domain formats and the :blackhole:/:fail: constants already documented in the schema itself, so the baseline is 3. The description re-states the special destination meanings in behavioral terms but adds no syntax, format, or constraint information the schema lacks.

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

Purpose4/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 ('Creates an email forwarder for an alias on a domain'), which is enough for an agent to distinguish it from sibling tools such as create_email_account or delete_forwarder. It stops short of explicitly naming the sibling it differs from, so it lands just below the top score.

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?

Usage is only implied by the purpose statement; there is no explicit when-to-use versus when-to-use-delete_forwarder or create_email_account guidance. It also omits prerequisites, such as the domain already existing on the account, or what happens when a forwarder for that alias already exists.

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

create_packageCreate PackageA

Creates a package that reseller users can be assigned to. Unset limits take the API defaults: quota 1 GB, 1 domain, 100 email accounts, 100 email forwarders, 10 domain pointers. Reseller-level operation: call while authenticated as the reseller (plain reseller username), not while impersonating a user.

NameRequiredDescriptionDefault
nameYesPackage name (letters, numbers, underscores, hyphens)
quotaNoDisk quota in GB or "unlimited" (default 1)
domainsNoDomain count or "unlimited" (default 1)
email_accountsNoCustomer mailbox count or "unlimited" (default 100; 0 = no customer mailboxes — the system mailbox is excluded)
domain_pointersNoDomain pointer count or "unlimited" (default 10)
email_forwardersNoEmail forwarder count or "unlimited" (default 100)

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

Annotations already state readOnlyHint=false, idempotentHint=false and destructiveHint=false, so the safety profile is covered; the description adds the authentication mode requirement and the fact that unset limits fall back to API defaults. It does not say what happens on a duplicate package name or whether defaults are frozen or inherited at creation time, leaving a small gap.

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

Conciseness3/5

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

Purpose and the reseller-auth constraint are front-loaded and earn their place, but the middle sentence enumerating all five default values duplicates the schema descriptions verbatim and is pure redundancy. Two strong sentences padded by one expendable one.

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?

With an output schema present the description need not explain return values, and annotations cover the mutation safety profile; purpose, defaults and auth mode are all addressed. The only missing piece is failure behavior (duplicate name, invalid quota) and how a created package is later assigned, which is minor for a straightforward create tool.

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 coverage is 100% and every parameter description already states its own default (quota default 1, domains default 1, email_accounts default 100, domain_pointers default 10, email_forwarders default 100). The description's default list therefore restates schema content rather than adding meaning, so the baseline 3 for a fully documented schema is right.

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?

Names a specific verb and resource ("Creates a package") and immediately defines what a package is for ("reseller users can be assigned to"), which separates it from create_reseller_user and from the list/get/update/delete_package siblings. An agent can decide between this and update_package without opening a schema.

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

Usage Guidelines4/5

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

Gives a real precondition: it is a reseller-level operation and must be called while authenticated as the reseller, not while impersonating a user. That is actionable context an agent would otherwise get wrong. It stops short of explicit when-to-use-vs-alternative routing (e.g. "use update_package to modify existing limits"), so not a 5.

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

create_reseller_userCreate Reseller UserA

Creates a user under the reseller account with the given username, contact email, password, and package. Reseller-level operation: call while authenticated as the reseller (plain reseller username), not while impersonating a user. The package must already exist (see list_packages); 422 means it does not.

NameRequiredDescriptionDefault
emailYesContact email address for the user
packageYesExisting package name to assign (see list_packages)
passwordYesReseller user password (minimum 8 characters; no maximum — the spec sets none)
usernameYesReseller username (1-10 chars, lowercase letters, digits, underscores)

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false, so the safety profile is covered; the description goes further by disclosing the auth context requirement and the 422-exists error semantics, both non-obvious. It does not address duplicate-username behavior or what happens to the created user's initial state, which matters given idempotentHint=false and an output schema it never contextualizes.

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?

Three sentences, each carrying a distinct load: what is created, the auth constraint, and the prerequisite/error. The critical call-condition constraint is front-loaded in the second sentence where it will be read before invocation.

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?

For a four-required-parameter mutation with full annotations, a 100%-covered schema, and an existing output schema, the description covers the gap-prone parts: auth mode, prerequisite, and error interpretation. The only shortfall is leaving duplicate-username/collision behavior unstated for a non-idempotent create.

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%, so formats, lengths, and patterns for all four parameters are already documented in the schema, making the baseline 3. The description restates the same four field names without adding syntax or validation detail, and its "package must already exist (see list_packages)" note duplicates what the package property description already says.

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

Purpose4/5

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

The description opens with a specific verb+resource ("Creates a user under the reseller account") and enumerates the identifying fields (username, contact email, password, package), so an agent knows exactly what is produced. It implicitly separates itself from create_email_account by scoping the operation to the reseller account, though it never names the sibling create tools it could be confused with.

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 states the precise call condition (authenticate as the reseller with the plain reseller username) and an explicit when-not (not while impersonating a user), which is the main failure mode for this API surface. It also gives a prerequisite and points to list_packages for satisfying it, plus the 422 signal when the package is missing.

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

delete_domainDelete DomainA
DestructiveIdempotent

Removes the domain from the account. Destructive: mailboxes and forwarders under this domain stop working and mail to the domain is no longer handled. Use set_domain_mail_hosting to pause mail service without deleting the domain.

NameRequiredDescriptionDefault
domainYesDomain name on this account, e.g. example.com (letters, digits, hyphens; at least one dot)

Output Schema

NameRequiredDescription
messageYes
successYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds the concrete blast radius beyond that flag: mailboxes and forwarders under the domain stop working and inbound mail is no longer handled. It does not say whether deletion is immediate or reversible (e.g. a grace period), which is the remaining behavioral gap for a destructive operation.

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?

Three short sentences with zero waste: action first, consequences second, safer alternative last. Every sentence earns its place and the destructive warning is front-loaded.

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?

With one required parameter, full schema coverage, an output schema, and annotations carrying the safety profile, the description covers what an agent needs to call it and what will break. Minor gap: it does not state whether the removal is permanent or whether prerequisites (e.g. no active pointers) apply.

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' parameter already documents format and an example, so the baseline of 3 applies. The description adds no additional meaning about the parameter, such as whether the domain must be verified or owned by the account first.

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?

States a specific verb and resource ('Removes the domain from the account'), scoped to this account. It is clearly distinguishable from the sibling delete_domain_pointer (which deletes a pointer, not the domain) and from set_domain_mail_hosting by naming that alternative explicitly.

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?

Gives an explicit alternative and the condition that selects it: use set_domain_mail_hosting to pause mail service without deleting the domain. The agent can decide between destructive deletion and temporary suspension without inference.

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

delete_domain_pointerDelete Domain PointerA
DestructiveIdempotent

Removes a domain pointer (alias or redirect) from a domain. The pointer domain stops serving the target domain's mailboxes; the target domain itself is unchanged.

NameRequiredDescriptionDefault
domainYesDomain name on this account, e.g. example.com (letters, digits, hyphens; at least one dot)
pointerYesDomain name on this account, e.g. example.com (letters, digits, hyphens; at least one dot)

Output Schema

NameRequiredDescription
messageYes
successYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare destructive=true, idempotent=true and readOnly=false, so safety is structured. The description still earns credit by spelling out the actual effect — the pointer domain stops serving the target's mailboxes while the target is unchanged — which is real blast-radius information annotations cannot convey. It stops short of stating whether the pointer record is recoverable or what happens if the pointer does not exist.

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?

Two short sentences, effect first and scope-reassurance second, with no filler. Every clause carries information an agent would otherwise have to guess.

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?

For a two-parameter destructive delete with an output schema and full annotation coverage, the description supplies the key missing piece: what breaks and what does not. Minor gaps remain around error behavior for nonexistent pointers and whether the change is reversible, but nothing essential to calling it correctly is absent.

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

Parameters4/5

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

Schema coverage is 100%, but both parameters carry identical boilerplate ("Domain name on this account..."), leaving the domain/pointer roles ambiguous in the schema alone. The description resolves this by framing it as removing a pointer domain from a target domain, which is genuine added meaning. It still does not state the expected format or which direction the alias points.

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?

"Removes a domain pointer (alias or redirect) from a domain" names a specific verb and resource, and the parenthetical disambiguates what a pointer actually is. The follow-up clause separates this from delete_domain by stating the target domain is untouched, so the agent can distinguish it from siblings without opening the schema.

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 when this applies (detaching a pointer/alias from a domain) but never states preconditions, alternatives, or exclusions. It does not point to create_domain_pointer or list_domain_pointers as the complementary or lookup operations, so routing must be inferred from sibling names.

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

delete_email_accountDelete Email AccountA
DestructiveIdempotent

Permanently deletes a mailbox and its stored mail. Destructive and irreversible: the address immediately stops accepting mail. user is the mailbox local part (the part before the @). Read the exact username casing back from list_email_accounts or get_email_account before deleting: updates resolve the local part case-insensitively and reject an ambiguous match, but deletes should use the exact stored casing.

NameRequiredDescriptionDefault
userYesLocal part of the email address (the part before the @), e.g. your_mailbox (1-64 chars)
domainYesDomain name on this account, e.g. example.com (letters, digits, hyphens; at least one dot)

Output Schema

NameRequiredDescription
messageYes
successYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true and idempotentHint=true, so the safety profile is known. Beyond that, the description adds what the annotations cannot say: that stored mail is destroyed, that the address stops accepting mail immediately, and that deletes are casing-sensitive while updates are not, with ambiguous matches rejected.

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?

Three sentences, front-loaded with the destructive consequence, then the parameter clarification, then the casing prerequisite. No filler, and the most consequential fact comes first.

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?

With two fully documented parameters and an output schema, return values need no explanation. The description covers the destruction scope and the casing pitfall well. It stops short of stating permission or authentication requirements, which is the only notable gap for a destructive two-parameter tool.

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

Parameters4/5

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

Schema coverage is 100%, and the schema already explains that user is the local part before the @. The description nonetheless adds meaning the schema lacks: that deletes must use the exact stored casing while updates resolve case-insensitively and reject ambiguous matches. It adds little about domain, but nothing is missing.

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 first sentence gives a specific verb and resource plus scope: 'Permanently deletes a mailbox and its stored mail.' That is clearly distinct from sibling deletes like delete_domain, delete_forwarder, and delete_domain_pointer, and from create_email_account and update_email_account.

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

Usage Guidelines4/5

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

The description names a real prerequisite workflow: call list_email_accounts or get_email_account first and use the exact stored casing. It does not explicitly rule out alternatives or state when not to delete, but for a terminal delete operation the relevant guidance is the lookup step, which is spelled out.

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

delete_forwarderDelete ForwarderA
DestructiveIdempotent

Deletes an email forwarder by its alias. Mail sent to the alias is no longer forwarded after deletion. Read the alias's exact stored casing back from list_forwarders before deleting, and pass it unchanged.

NameRequiredDescriptionDefault
aliasYesLocal part of the email address (the part before the @), e.g. your_mailbox (1-64 chars)
domainYesDomain name on this account, e.g. example.com (letters, digits, hyphens; at least one dot)

Output Schema

NameRequiredDescription
messageYes
successYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true; the description adds the concrete consequence ('Mail sent to the alias is no longer forwarded after deletion'), which tells the agent what is actually lost. It stops short of noting permission requirements or behavior when the alias is missing, but it meaningfully exceeds the annotation coverage.

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?

Three short sentences: purpose first, then effect, then the preparative instruction. No filler and nothing redundant with structured fields.

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?

For a destructive two-parameter tool with an output schema and full annotation coverage, this covers what to pass and what happens. Only secondary details (permissions, not-found behavior) are absent, which is reasonable.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds a genuinely non-obvious constraint: the alias must be passed with its exact stored casing, which the pattern/regex in the schema does not convey. That materially affects correct invocation.

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?

States a specific verb and resource ('Deletes an email forwarder by its alias') plus the scope of the effect, which cleanly distinguishes it from create_forwarder and list_forwarders.

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

Usage Guidelines4/5

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

Gives a concrete prerequisite workflow: read the alias's exact stored casing from list_forwarders and pass it unchanged. It doesn't state when not to delete (e.g., alternatives or confirmation expectations), but the actionable context is clear.

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

delete_packageDelete PackageA
DestructiveIdempotent

Deletes a package. Fails with 422 while any user is still on the package; move affected users to another package first (set_reseller_user_package). Reseller-level operation: call while authenticated as the reseller (plain reseller username), not while impersonating a user. A 404 means the package does not exist.

NameRequiredDescriptionDefault
nameYesPackage name (letters, numbers, underscores, hyphens)

Output Schema

NameRequiredDescription
messageYes
successYes

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the annotations, the description discloses the 422 dependency failure, the need to move users before deletion, and the reseller authentication requirement rather than user impersonation. It also explains the 404 case, adding meaningful operational context for a destructive operation.

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?

Three tight sentences front-load the action, then immediately cover the failure precondition, authentication constraint, and error handling. Every sentence carries distinct operational information with no filler.

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?

For a single-parameter destructive tool with an output schema and rich annotations, the description covers the missing pieces an agent needs: preconditions, auth scope, and error interpretation. Nothing material is left unspecified.

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?

There is only one parameter, 'name', and schema description coverage is 100%, so the schema already documents its format and constraints. The description does not add syntax or naming semantics beyond what the schema provides.

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

Purpose4/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 ('Deletes a package'), making the operation unambiguous. It also clarifies the reseller-level scope, though it does not explicitly contrast with other package-management siblings beyond naming set_reseller_user_package as a prerequisite step.

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 states exactly when deletion fails (422 while users are on the package) and tells the agent what to do first via the sibling tool set_reseller_user_package. It also specifies the required authentication context and the meaning of a 404, leaving little to inference.

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

delete_reseller_userDelete Reseller UserA
DestructiveIdempotent

Destructive: deletes the user and everything under it, irreversibly. Per DirectAdmin behavior the deletion may fail or cascade, so double-check the username first. Reseller-level operation: call while authenticated as the reseller (plain reseller username), not while impersonating a user. A 404 means the user does not exist.

NameRequiredDescriptionDefault
usernameYesReseller username (1-10 chars, lowercase letters, digits, underscores)

Output Schema

NameRequiredDescription
messageYes
successYes

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is known; the description adds value beyond that by disclosing the cascade scope ("everything under it"), the irreversibility, the possibility of failure per DirectAdmin behavior, and the auth-context requirement. Nothing here contradicts the annotations.

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?

Four tight sentences with the danger warning front-loaded before auth and error details, and no padding. The phrase "may fail or cascade" is somewhat hedged and could be sharper, but nothing is wasted.

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?

For a one-parameter destructive tool with an output schema already available, the description covers everything an agent needs to act safely: scope of deletion, auth context, and error interpretation. Return values are correctly left to the output schema.

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% — the single username parameter already carries type, pattern, length, and character rules. The description only adds the caution to double-check the username first, which is operational advice rather than new semantics, so baseline 3 applies.

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?

Opens with a specific verb and resource ("deletes the user and everything under it") and immediately scopes the blast radius. An agent can distinguish it from suspend_reseller_user, delete_domain, and delete_email_account without opening any schema.

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

Usage Guidelines4/5

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

Gives a clear precondition that is easy to get wrong — call while authenticated as the plain reseller, not while impersonating a user — and explains what a 404 means. It does not explicitly route an agent to the non-destructive alternative (suspend_reseller_user) when reversibility is desired, which keeps it short of a 5.

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

get_catch_allGet Catch-AllA
Read-onlyIdempotent

Returns the domain's catch-all setting: how mail addressed to nonexistent local parts is handled. type is fail (reject), blackhole (silently discard), or address (forward); address holds the forwarding destination when type is address, otherwise null.

NameRequiredDescriptionDefault
domainYesDomain name on this account, e.g. example.com (letters, digits, hyphens; at least one dot)

Output Schema

NameRequiredDescription
typeYes
addressYes
descriptionNo

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds real context by decoding the returned setting: the three `type` values with their mail-handling meaning and the conditional nullity of `address`. It stops short of stating error behavior for an unknown domain or any account/permission requirements.

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?

Two compact sentences: the purpose first, then the value semantics. Every clause carries information an agent would otherwise have to guess from the enum values, and there is no filler.

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?

With one fully documented parameter, safety annotations, and an output schema, the remaining burden is small, and the description covers the interpretation of the returned values. The only gap is failure behavior (nonexistent domain, insufficient permissions), which an agent might want before calling.

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 coverage is 100% and the single `domain` parameter is already documented with format constraints (letters, digits, hyphens, at least one dot). The description contributes no additional meaning about the parameter, so the baseline of 3 applies.

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?

States a specific verb and resource ("Returns the domain's catch-all setting") and immediately defines the resource in domain terms ("how mail addressed to nonexistent local parts is handled"). This distinguishes it cleanly from the write-side sibling set_catch_all and from unrelated getters like get_spam_settings.

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?

Usage is only implied: an agent can infer this is the read counterpart to set_catch_all, but the description never says when to call it (e.g., to inspect current routing before changing it) or what to do if the domain is missing. No exclusions or prerequisites are stated.

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

get_disk_quotaGet Disk QuotaA
Read-onlyIdempotent

Returns account disk usage: total bytes used and quota limit (0 = unlimited), percent used, a category breakdown (email, web, databases, backups, other — in bytes), and the grace period when the account is over quota. Data is refreshed hourly.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
usernameYes
breakdownYes
total_usedYes
updated_atYes
total_limitYes
grace_periodYes
percent_usedYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds two genuinely useful behavioral facts beyond that: results can be stale because 'Data is refreshed hourly', and a quota limit of 0 means unlimited, which prevents misreading the return value.

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?

A single sentence, front-loaded with the verb and resource, where every clause carries information (sentinel value, category list units, grace period, refresh cadence). Nothing is redundant or padding.

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?

For a zero-parameter read-only tool with an output schema and full annotations, the description covers what an agent needs: what comes back, the meaning of the 0 sentinel, and the hourly staleness window. Little is left to inference.

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

Parameters4/5

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

The tool takes zero parameters, so the baseline is 4 and there is no parameter meaning for the description to add. It correctly avoids inventing inputs and instead spends its words on output semantics.

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

Purpose4/5

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

Uses a specific verb+resource ('Returns account disk usage') and enumerates the data returned: total used, quota limit with 0=unlimited sentinel, percent used, category breakdown, and grace period. This makes it distinguishable from the narrower get_email_usage sibling, though it never names that sibling explicitly.

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?

Usage is only implied by the tool's scope — an agent can infer it should call this for account-wide quota checks. There is no explicit when-to-use or when-not guidance, and no routing to get_email_usage for email-only usage figures.

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

get_dns_recordsGet DNS RecordsA
Read-onlyIdempotent

Returns the DNS records to configure at the domain's registrar for MXroute mail delivery: MX records plus the SPF, DKIM, and verification TXT records. dkim and verification are null when the record does not apply to this domain.

NameRequiredDescriptionDefault
domainYesDomain name on this account, e.g. example.com (letters, digits, hyphens; at least one dot)

Output Schema

NameRequiredDescription
spfYes
dkimYes
mx_recordsYes
verificationYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. Beyond that, the description discloses which record types come back and, importantly, that `dkim` and `verification` are null when not applicable — a behavioral detail an agent would otherwise have to discover from a failed lookup.

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?

Two sentences, front-loaded with the core purpose, then the null-semantics caveat. Nothing is repeated from the title and no wording is wasted.

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?

With an output schema present and annotations covering safety, the description only needs to frame purpose and unusual return cases — both done. It stops short of noting whether records are generated by MXroute or read live from DNS, which would be the last useful detail for a read-only diagnostic tool.

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?

There is a single `domain` parameter with 100% schema description coverage including format constraints, so the schema does the work. The description adds no syntax, format, or constraint detail beyond it — baseline 3 applies.

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?

States a specific verb and resource ('Returns the DNS records') and enumerates exactly what is included: MX plus SPF, DKIM, and verification TXT records. The stated purpose ('to configure at the domain's registrar for MXroute mail delivery') makes it unmistakably different from siblings like get_domain or get_verification_key.

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 phrase 'to configure at the domain's registrar for MXroute mail delivery' implies the setup context in which this should be called, but there is no explicit when-to-use, no prerequisites (e.g. must the domain already exist / have mail hosting set?), and no routing to alternatives such as get_verification_key for the verification record alone.

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

get_domainGet DomainA
Read-onlyIdempotent

Returns the details of one domain: mail hosting status, SSL status, and the names of any domain pointers (aliases) attached to it. Use list_domains to discover the domain names on the account.

NameRequiredDescriptionDefault
domainYesDomain name on this account, e.g. example.com (letters, digits, hyphens; at least one dot)

Output Schema

NameRequiredDescription
domainYes
pointersNo
ssl_enabledNo
mail_hostingNo

TDQS

A4/5.0
Behavior3/5

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

The annotations already declare this is a read-only, idempotent, non-destructive operation, so the safety profile is covered. The description adds the returned fields, but because an output schema exists, this return-value detail is largely redundant; it does not mention permission requirements, error behavior, or domain-not-found handling.

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?

Two compact sentences with no wasted wording, and the primary purpose is front-loaded before the sibling-tool recommendation. Every sentence contributes useful information for selecting and invoking the tool.

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?

For a simple one-parameter read tool with annotations and an output schema, the description covers purpose, returned data, and discovery of valid domain names. It is nearly complete, with only minor gaps around domain-not-found behavior or prerequisites not being mentioned.

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' parameter already has a clear description with format examples. The tool description adds only that the domain must be one on the account and points to list_domains for discovery, which is marginally useful but does not meaningfully extend the schema.

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 states a specific verb and resource ('Returns the details of one domain') and enumerates the exact details returned: mail hosting status, SSL status, and domain pointer aliases. It also names the sibling tool used for discovery, so an agent can distinguish it from list_domains without opening either schema.

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

Usage Guidelines4/5

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

It explicitly directs the agent to use list_domains to discover domain names before calling this tool, which gives clear usage context and names the alternative. It does not state exclusions or what to do if the domain is unknown, but the core when-to-use guidance is present.

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

get_email_accountGet Email AccountA
Read-onlyIdempotent

Returns the details of one mailbox: username, full email address, quota in MB (0 = unlimited), current usage in MB, daily send limit, messages sent today, and suspended status. user is the mailbox local part (the part before the @).

NameRequiredDescriptionDefault
userYesLocal part of the email address (the part before the @), e.g. your_mailbox (1-64 chars)
domainYesDomain name on this account, e.g. example.com (letters, digits, hyphens; at least one dot)

Output Schema

NameRequiredDescription
sentYes
emailYes
limitYes
quotaYes
usageYes
usernameYes
suspendedYes

TDQS

A3.8/5.0
Behavior3/5

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

The annotations already declare that this is a safe, idempotent read operation, so the description does not need to restate that. It adds useful interpretation for quota values ('0 = unlimited') but does not describe error behavior, authentication requirements, or what happens when the mailbox does not exist.

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 two compact sentences with no filler. The core behavior is front-loaded, followed by a clarifying note about the 'user' parameter.

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?

For a simple read-only getter with full schema coverage, annotations, and an output schema, the description is largely complete. The only minor gap is that it does not mention failure behavior when the mailbox or domain does not exist.

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%, so both parameters are already documented in the input schema. The description repeats that 'user' is the mailbox local part but adds no new format or constraint details beyond the schema.

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 states a specific verb and resource: it returns details of one mailbox, and it lists the exact fields returned. The phrase 'one mailbox' clearly distinguishes it from list_email_accounts and other domain-level sibling tools.

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?

Usage is implied by 'one mailbox,' which suggests the tool is for fetching a single existing account rather than listing accounts. However, there is no explicit when-to-use guidance, no exclusions, and no mention of the sibling list_email_accounts.

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

get_email_usageGet Email UsageA
Read-onlyIdempotent

Returns per-mailbox disk usage for the account, largest mailbox first (email address, size in bytes, last update time). Useful for finding which mailboxes to trim when the account nears its quota. Data is refreshed hourly.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
accountsYes
usernameYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, and non-destructive, so the safety profile is covered. The description adds genuinely new behavioral context beyond them: the data is refreshed hourly (staleness caveat) and results are sorted largest-first. It doesn't discuss truncation or limits for accounts with very many mailboxes.

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?

Three short sentences, front-loaded with what is returned and in what order, followed by the use case and the freshness caveat. Every sentence carries information an agent would otherwise lack.

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?

For a zero-parameter read tool with an output schema, this covers nearly everything: scope, ordering, field set, use case, and refresh cadence. The only gap is whether results are ever truncated or capped for accounts with many mailboxes, which matters given there is no pagination parameter.

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

Parameters4/5

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

The tool takes no parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The description correctly signals that the response is account-wide and unfiltered.

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?

States a specific verb and resource ("Returns per-mailbox disk usage for the account") plus the ordering (largest first) and returned fields (email address, size in bytes, last update time). This is distinguishable from the sibling get_disk_quota, which covers account-level quota rather than per-mailbox consumption.

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

Usage Guidelines4/5

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

Gives a concrete use case: finding mailboxes to trim when the account nears its quota. It doesn't explicitly name alternatives or exclusions (e.g., how it differs from get_disk_quota or list_email_accounts), so it stops short of full routing guidance.

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

get_packageGet PackageA
Read-onlyIdempotent

Returns one package's settings: quota_gb (null when unlimited), domains, email_accounts, email_forwarders, and domain_pointers limits (null = unlimited; email_accounts excludes the system mailbox). Reseller-level operation: call while authenticated as the reseller (plain reseller username), not while impersonating a user. A 404 means the package does not exist.

NameRequiredDescriptionDefault
nameYesPackage name (letters, numbers, underscores, hyphens)

Output Schema

NameRequiredDescription
nameYes
settingsYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, yet the description still adds real behavioral context: null means unlimited for quota and limits, email_accounts excludes the system mailbox, and a 404 has a defined meaning. Only edge behaviors such as permissions failures beyond the reseller-auth note are left unstated.

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?

Three compact sentences ordered by importance: what is returned, then authentication constraint, then error semantics. The parenthetical null definitions are dense but each earns its place; there is no filler.

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?

Despite being a single-parameter read tool, the definition covers the two things an agent can actually get wrong — the reseller authentication mode and interpreting nulls/404. An output schema exists, so return-shape explanation is not required, and the remaining need is met.

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 coverage is 100% and the single 'name' parameter already documents its pattern (letters, numbers, underscores, hyphens). The description's detail is about returned fields rather than the name argument, so it adds nothing meaningful beyond the schema — the baseline 3 applies.

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?

States a specific verb and resource ('Returns one package's settings') and then enumerates exactly which fields come back (quota_gb, domains, email_accounts, email_forwarders, domain_pointers). The singular 'one package' combined with the sibling name list_packages makes the scope distinction obvious without opening either schema.

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

Usage Guidelines4/5

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

Gives clear preconditions for use: it is a reseller-level operation and must be called authenticated as the reseller rather than while impersonating a user, plus what a 404 implies. It stops short of explicitly naming list_packages as the alternative for enumerating packages, so it is context-rich but lacks explicit alternative routing.

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

get_reseller_userGet Reseller UserA
Read-onlyIdempotent

Returns one reseller user's details: username, email, domain, package, suspended flag, and quota (limit in MB, null when unlimited). Reseller-level operation: call while authenticated as the reseller (plain reseller username), not while impersonating a user. A 404 means the user does not exist.

NameRequiredDescriptionDefault
usernameYesReseller username (1-10 chars, lowercase letters, digits, underscores)

Output Schema

NameRequiredDescription
emailYes
quotaYes
domainYes
packageYes
usernameYes
suspendedYes

TDQS

A4.3/5.0
Behavior5/5

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

Goes well beyond the readOnly/idempotent/non-destructive annotations by disclosing the required authentication context (reseller-level, non-impersonated session), the meaning of a 404 (user does not exist), and the null-vs-numeric semantics of the quota field. These are the details an agent needs to interpret failures and results correctly.

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?

Three short sentences, front-loaded with what is returned, then the auth constraint, then the error meaning. No filler, and each sentence carries distinct information.

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

Completeness3/5

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

For a single-record read with an output schema, the definition covers return contents, auth context, and the 404 case, so it is largely sufficient. The remaining gap is that, in a family of reseller-user tools, it does not position itself against the list/update/delete siblings or clarify how the username is scoped to the authenticated reseller.

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 coverage is 100% and the schema already documents the username format (length, lowercase/digit/underscore pattern), so the description need not repeat it. However, the description's phrase 'plain reseller username' sits alongside 'one reseller user's details', leaving slight ambiguity about whether the parameter identifies the reseller or the target user; the description could have resolved this.

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?

States a specific verb and resource ('Returns one reseller user's details') and enumerates the returned fields (username, email, domain, package, suspended flag, quota), which also distinguishes it from list_reseller_users by scope (single record vs. listing).

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

Usage Guidelines4/5

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

Gives an explicit prerequisite and a when-not: it must be called while authenticated as the reseller, not while impersonating a user. It does not name the alternative (e.g. list_reseller_users for enumeration, update_reseller_user for modification), so sibling routing is only implied.

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

get_spam_blacklistGet Spam BlacklistA
Read-onlyIdempotent

Lists the spam blacklist entries for a domain. Blacklisted senders are always treated as spam. Entries support wildcards (for example *@example.com) and match case-insensitively. Sender lists are shared across all domains on the account. An empty 200 response is treated as an empty list.

NameRequiredDescriptionDefault
domainYesDomain name on this account, e.g. example.com (letters, digits, hyphens; at least one dot)

Output Schema

NameRequiredDescription
resultYesBlacklist entries; an empty 200 response is treated as an empty list

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description still earns credit for non-obvious behavior: wildcard syntax, case-insensitive matching, account-wide sharing of sender lists, and treating an empty 200 as an empty list. It does not describe ordering or pagination of the returned entries, which is the remaining behavioral gap.

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?

Four short sentences, each contributing a distinct fact, with the core purpose front-loaded before details about matching and list scope. No filler or repetition.

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?

For a single-parameter read tool with full schema coverage, complete annotations, and an output schema that documents the return value, the description covers everything an agent needs: purpose, matching semantics, list scope, and empty-result behavior.

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 coverage is 100%, so the domain format (letters, digits, hyphens, at least one dot) is already fully documented in the schema. The description's note that sender lists are shared across all domains on the account sharpens what the domain parameter does and does not scope, but that is a modest addition over a fully described single parameter.

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

Purpose4/5

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

States a specific verb and resource ("Lists the spam blacklist entries for a domain"), which is enough to separate it from add_spam_blacklist_entry and remove_spam_blacklist_entry by name alone. It never explicitly contrasts itself with the sibling get_spam_whitelist, so the differentiation is implied rather than stated.

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 read-only listing framing implies when to use it, and the sibling names make the add/remove counterparts guessable. There is no explicit "use this when..." clause, no mention of when to prefer get_spam_settings, and no stated prerequisites.

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

get_spam_settingsGet Spam SettingsA
Read-onlyIdempotent

Returns the spam settings for a domain. high_score is the SpamAssassin-style score threshold (1-50) at which incoming mail is automatically deleted.

NameRequiredDescriptionDefault
domainYesDomain name on this account, e.g. example.com (letters, digits, hyphens; at least one dot)

Output Schema

NameRequiredDescription
high_scoreYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds genuine value by explaining that `high_score` is a 1-50 SpamAssassin-style threshold at which mail is deleted, which is behavior an agent could not derive from the annotations. It does not say whether whitelist/blacklist entries are included in the response or what defaults apply to an unconfigured domain.

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?

Two short sentences, front-loaded with the core action, then one high-value clarification of a returned field. No filler or restatement of the title.

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?

An output schema exists, so return values needn't be enumerated, and the description still clarifies the one non-obvious field. For a single-parameter read tool this is close to complete; only the interaction with the whitelist/blacklist and update tools is left unstated.

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` parameter is fully documented in the schema (format hints, example, character rules), so the schema carries the parameter burden. The description adds no further meaning about the domain argument, which matches the baseline 3.

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

Purpose4/5

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

States a specific verb and resource ('Returns the spam settings') scoped to 'a domain', which is unambiguous. It does not name or distinguish itself from the sibling update_spam_settings (nor get_spam_whitelist/blacklist), so the sibling differentiation is left implicit.

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 read-only retrieval intent is implied by 'Returns', and the presence of update_spam_settings as a sibling makes the read/write split reasonably inferable. However, there is no explicit statement of when to use this versus update_spam_settings or the whitelist/blacklist getters, and no prerequisites (e.g. domain must exist on the account) are given.

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

get_spam_whitelistGet Spam WhitelistA
Read-onlyIdempotent

Lists the spam whitelist entries for a domain. Whitelisted senders bypass spam filtering. Entries support wildcards (for example *@trusted.com) and match case-insensitively. Sender lists are shared across all domains on the account.

NameRequiredDescriptionDefault
domainYesDomain name on this account, e.g. example.com (letters, digits, hyphens; at least one dot)

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, and non-destructive, so the safety profile is covered. The description adds genuinely non-obvious behavior: wildcard patterns, case-insensitive matching, and that sender lists are shared account-wide across all domains — the last of which materially affects how results should be interpreted. It says nothing about result ordering or volume, but that is minor.

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?

Four short sentences, each carrying distinct information: purpose, semantics of the resource, matching rules, and account-level scope. Purpose is front-loaded and there is no filler.

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?

With an output schema present and full parameter coverage, the description only needs to supply behavioral context, which it largely does. The one gap is the mild tension between the required `domain` argument and the statement that sender lists are shared account-wide, which an agent may need to reason about.

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% for the single `domain` parameter, so the schema already explains format and constraints. The description adds no further meaning about how `domain` affects the returned entries — notably, it does not reconcile the required domain argument with the claim that lists are shared across all domains.

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

Purpose4/5

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

The first sentence names a specific verb and resource ('Lists the spam whitelist entries for a domain'), which is unambiguous and distinct from the add/remove whitelist siblings. It does not explicitly differentiate from adjacent read tools such as get_spam_settings or get_spam_blacklist, leaving that routing to the agent.

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 explains what whitelist entries do ('Whitelisted senders bypass spam filtering'), which implies when to inspect them, but gives no explicit when-to-use versus alternatives such as get_spam_settings or get_spam_blacklist. Usage is inferable rather than stated.

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

get_verification_keyGet Verification KeyA
Read-onlyIdempotent

Returns the account's domain verification key. To add a new domain: create a TXT record at your registrar named <key>.<yourdomain> with value domain-verified, wait for DNS propagation (typically 5-15 minutes), then call create_domain. The returned record object contains the exact TXT record name, type, and value.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
keyYes
recordYes
descriptionNo

TDQS

A4/5.0
Behavior4/5

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

Annotations already say this is a read-only, idempotent, non-destructive call, so the safety profile is covered. The description adds genuinely new context: the DNS propagation window is typically 5-15 minutes, and the returned record contains the exact TXT name, type, and value. It does not say whether the key is stable or rotates, which slightly limits it.

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?

Three sentences: what it returns, followed by an actionable workflow, then a note about the return payload. The return shape is mentioned after the workflow rather than up front, and the ellipses are minor, but every sentence carries real information and there is no filler.

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?

With no parameters, a full annotation set, and an output schema, this description carries only what structured fields cannot: the DNS setup procedure and propagation timing. The one gap is whether the key is per-account or per-domain and whether it rotates, but for a simple read tool it is otherwise complete.

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

Parameters4/5

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

The tool takes no parameters, which is the baseline case for a 4. The empty schema leaves nothing to misinterpret, and the description correctly does not invent parameter-like behavior.

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

Purpose4/5

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

States a specific verb and resource: 'Returns the account's domain verification key.' That is clearly distinct from get_domain, list_domains, and create_domain, though it never explicitly contrasts itself with them, so the differentiation comes from the resource name rather than from a stated comparison.

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

Usage Guidelines4/5

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

Gives a concrete when-to-use path: get this key, publish it as a TXT record at the registrar, wait for propagation, then call create_domain. create_domain is named as the downstream tool, but there are no explicit exclusions or guidance about re-fetching the key, e.g., whether it changes over time.

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

list_domain_pointersList Domain PointersA
Read-onlyIdempotent

Lists the domain pointers (aliases and redirects) attached to a domain. Each entry has the pointer domain name, its type ("alias" or "redirect"), and the target domain it serves.

NameRequiredDescriptionDefault
domainYesDomain name on this account, e.g. example.com (letters, digits, hyphens; at least one dot)

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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

The annotations already establish a safe, idempotent read. The description adds the pointer categories and per-entry contents, but gives no further operational context such as empty-result or pagination behavior; the return summary is also less essential because an output schema exists.

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?

Two short sentences front-load the operation and scope, then succinctly explain the alias/redirect model. There is no filler or unnecessary repetition of the safety annotations.

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?

For a simple list operation with one fully documented required parameter, read-only annotations, and an output schema, this supplies the invocation-critical resource scope and result concepts. Additional operational details would be optional rather than necessary for correct selection and invocation.

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 coverage is 100%, and the domain parameter already includes an example and syntax constraints. The description clarifies that this is the domain whose pointers are listed, but adds no parameter format or validation detail beyond the schema, so the baseline applies.

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 gives a specific verb and resource: listing domain pointers attached to one domain, with pointers defined as aliases and redirects. That scope and the type/target distinction separate it from list_domains, get_domain, and the create/delete pointer tools.

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

Usage Guidelines4/5

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

It provides clear selection context: use it to inspect the aliases and redirects attached to a particular domain. It does not explicitly route agents to list_domains or get_domain for other needs, which keeps it from a 5.

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

list_domainsList DomainsA
Read-onlyIdempotent

Lists all domains on the account. Returns an array of domain names, e.g. ["example.com", "mydomain.org"]. Use get_domain for the details of a single domain.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, and an output schema exists, so the description's return-shape sentence adds limited new information. It does not add useful behavioral context such as result volume, ordering, or pagination for accounts with many domains.

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?

Three short sentences, front-loaded with the core action, with no filler. The example array partially duplicates the output schema, which is mildly redundant but harmless for a simple list tool.

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?

For a zero-parameter read-only list tool backed by full annotations and an output schema, the description covers purpose, return shape, and sibling routing. Nothing an agent needs in order to select and call it is missing.

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

Parameters4/5

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

The tool takes zero parameters, so the baseline is 4; there is nothing parameter-wise the description needs to explain and it correctly says nothing about arguments.

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 states a specific verb and resource ("Lists all domains on the account") and immediately distinguishes the tool from its detail-oriented sibling get_domain, so an agent can tell the two apart without opening either schema.

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

Usage Guidelines4/5

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

It explicitly names the alternative ("Use get_domain for the details of a single domain"), giving a clear routing rule. It does not mention other list-style siblings such as list_domain_pointers or state a when-not condition, so it falls just short of full when/when-not coverage.

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

list_email_accountsList Email AccountsA
Read-onlyIdempotent

Lists the mailboxes under a domain. Each entry includes the local part, full email address, quota in MB (0 = unlimited), current usage in MB, daily send limit, messages sent today, and suspended status.

NameRequiredDescriptionDefault
domainYesDomain name on this account, e.g. example.com (letters, digits, hyphens; at least one dot)

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered; the description then adds genuinely useful behavior by enumerating the returned fields and explaining that quota 0 means unlimited. It doesn't cover pagination, ordering, or behavior for an unknown domain, keeping it out of the top band.

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?

Two sentences, purpose first and return contents second, with no filler. The field enumeration is long but each item carries information an agent would otherwise have to discover from the output schema.

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?

For a one-parameter read tool with an output schema already present, this is nearly complete. The only missing context is what happens if the domain is unknown or empty, and the description already over-delivers on return values.

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 coverage is 100% and the single domain parameter is fully documented in the schema, so the description only echoes the scoping. It adds no format or validation detail beyond what the schema already says.

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

Purpose4/5

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

The description uses a specific verb and resource ("Lists the mailboxes") and scopes it ("under a domain"), which distinguishes it from get_email_account and list_forwarders. It stops short of naming the singular sibling it complements, so an agent must infer that get_email_account is for one mailbox.

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

Usage Guidelines2/5

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

There is no explicit when-to-use guidance, no prerequisites (e.g., the domain must already be configured on this account), and no mention of alternatives such as get_email_account for a single mailbox. Usage is only implied by the phrase "under a domain."

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

list_forwardersList ForwardersA
Read-onlyIdempotent

Lists all email forwarders on a domain. Each entry carries the alias (local part), the full forwarder email address, and the destination addresses it forwards to.

NameRequiredDescriptionDefault
domainYesDomain name on this account, e.g. example.com (letters, digits, hyphens; at least one dot)

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered structurally. The description adds the per-entry shape (alias/local part, full forwarder address, destination addresses), which is helpful context about what is returned, but it largely restates what the output schema already provides and says nothing about volume, pagination, or ordering.

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?

Two sentences, zero filler, with the scope ('all ... on a domain') front-loaded before the return-value detail. Every sentence earns its place.

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?

For a one-parameter read tool with full schema coverage, an output schema, and safety annotations, the description covers purpose and return contents sufficiently. Minor gaps (no mention of result set size or ordering) are low-risk given the output schema and the small, domain-scoped nature of the resource.

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' parameter is documented in the schema with format constraints (letters, digits, hyphens, at least one dot). The description's phrase 'on a domain' is consistent but adds no meaning beyond the schema, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource with scope: 'Lists all email forwarders on a domain.' The resource (forwarders) is clearly distinct from siblings like list_email_accounts or list_domains, so an agent can distinguish it, though no sibling is named explicitly.

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?

Usage is only implied by the verb 'Lists' and the domain scoping. There is no explicit when-to-use, when-not-to-use, or reference to an alternative such as create_forwarder or delete_forwarder. For a simple read-only list tool this is adequate, but it leaves routing to inference.

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

list_packagesList PackagesA
Read-onlyIdempotent

Lists the names of all packages defined under the reseller account. Reseller-level operation: call while authenticated as the reseller (plain reseller username), not while impersonating a user. A 403 means the credential lacks reseller privileges or is impersonating.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already cover the read-only, idempotent, non-destructive profile, so the description is not obligated to restate safety. It adds real context the annotations cannot: the required authentication mode, plus the meaning of a 403 response (missing reseller privilege or active impersonation), which lets an agent self-diagnose failure.

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?

Three short sentences with no filler: purpose first, then the authentication constraint, then error interpretation. Each sentence carries distinct information an agent needs, and the most important fact (what the tool returns) is front-loaded.

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?

With an output schema present, return-value detail is unnecessary, and with zero parameters there is nothing schema-adjacent to explain. The one thing structured fields cannot convey for this tool, the reseller-level auth requirement and its failure mode, is fully documented.

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

Parameters4/5

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

The tool takes zero parameters, so per the baseline a 4 applies. Nothing in the schema needs semantic expansion, and the description does not waste space inventing parameter guidance.

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

Purpose4/5

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

"Lists the names of all packages defined under the reseller account" gives a specific verb (lists) and resource (packages) plus a scope (reseller account, names only). The "names only" framing implicitly separates it from get_package, but no sibling is named explicitly, so an agent must infer that distinction.

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

Usage Guidelines4/5

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

It gives clear call-context guidance: invoke while authenticated as the plain reseller, not during user impersonation. It does not state when to prefer get_package or list_reseller_users instead, so routing between siblings is left to inference, but the credential condition that actually determines success is spelled out.

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

list_reseller_usersList Reseller UsersA
Read-onlyIdempotent

Lists the usernames of all users under the reseller account. Reseller-level operation: call while authenticated as the reseller (plain reseller username), not while impersonating a user. A 403 means the credential lacks reseller privileges or is impersonating.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuine behavioral context the annotations cannot express: the required credential mode and the meaning of a 403. It says nothing about result volume or ordering for large reseller accounts, which is the remaining gap.

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?

Three short sentences: what it returns, then credential requirement, then error interpretation. The resource and scope are front-loaded with no filler or restatement of the title.

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?

For a zero-parameter read tool with full annotation coverage and an output schema, the only things an agent needs beyond the schema are the auth mode and the failure meaning, both of which are stated. Nothing required for a correct first call is missing.

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

Parameters4/5

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

There are zero parameters, so the baseline is 4; the schema has nothing for the description to clarify. The description correctly adds no parameter chatter and instead spends its words on authentication scope.

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

Purpose4/5

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

The description uses a specific verb and resource ('Lists the usernames of all users under the reseller account') and scopes the result to usernames only, which separates it from mailbox-listing siblings like list_email_accounts. It stops short of naming the closest sibling (get_reseller_user) as the single-user alternative, so differentiation is implied rather than explicit.

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

Usage Guidelines4/5

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

It gives an explicit precondition (call while authenticated as the plain reseller username) and an explicit when-not (not while impersonating a user), plus a diagnostic for the 403 case. That is strong context, though it never names an alternative tool for retrieving a single user's details.

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

remove_spam_blacklist_entryRemove Spam Blacklist EntryA
DestructiveIdempotent

Removes an entry from the spam blacklist. Entries match case-insensitively, so the stored casing may differ. Sender lists are shared across all domains on the account, so this affects every domain on the account.

NameRequiredDescriptionDefault
entryYesEmail address or pattern to allow/block; wildcards supported, e.g. *@trusted.com or user@example.com
domainYesDomain name on this account, e.g. example.com (letters, digits, hyphens; at least one dot)

Output Schema

NameRequiredDescription
messageYes
successYes

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds genuinely new context: matching is case-insensitive so stored casing may differ, and the blast radius spans every domain on the account. It does not say whether removal requires prior existence or what happens on a miss, though idempotentHint covers that.

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

Conciseness4/5

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

Three short sentences, each carrying distinct information, with the core action front-loaded. No redundant restatement of the title or schema.

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

Completeness3/5

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

Output schema and annotations are rich, so the description does not need to cover safety or return shape. The remaining gap is the role of the required `domain` argument given account-wide tooling, plus any permission requirements, which an agent would want before invoking a destructive operation.

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 coverage is 100%, so the baseline is 3; the description does add one piece of meaning beyond the schema, namely that entry matching is case-insensitive. However, it never explains why a required `domain` parameter exists when the list is described as shared across all domains, which leaves the most confusing parameter unexplained.

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

Purpose4/5

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

States a specific verb and resource ("Removes an entry from the spam blacklist"), which cleanly separates it from add_spam_blacklist_entry and the whitelist siblings. It does not explicitly name a sibling alternative, but the resource is unambiguous.

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?

Usage is only implied by the operation itself; there is no when-to-use vs. add_spam_blacklist_entry / remove_spam_whitelist_entry guidance and no stated prerequisites. The account-wide scope note reads more as a warning than as routing guidance.

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

remove_spam_whitelist_entryRemove Spam Whitelist EntryA
DestructiveIdempotent

Removes an entry from the spam whitelist. Entries match case-insensitively, so the stored casing may differ. Sender lists are shared across all domains on the account, so this affects every domain on the account.

NameRequiredDescriptionDefault
entryYesEmail address or pattern to allow/block; wildcards supported, e.g. *@trusted.com or user@example.com
domainYesDomain name on this account, e.g. example.com (letters, digits, hyphens; at least one dot)

Output Schema

NameRequiredDescription
messageYes
successYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=true, and non-read-only, so the safety profile is covered. The description adds genuinely new behavior: case-insensitive matching means the stored casing may differ, and sender lists are shared across all domains on the account, so the blast radius is wider than the per-domain `domain` parameter suggests.

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?

Three short sentences, purpose front-loaded, each adding a distinct fact (action, matching semantics, scope). Nothing is redundant or padded.

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?

An output schema exists and annotations cover safety, so the description's job is mostly matching and scope semantics, which it delivers. It leaves one ambiguity unresolved: what happens when the entry is not found (relevant given idempotentHint) and how the required `domain` relates to an account-wide list.

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 coverage is 100%, so both `domain` and `entry` are already documented, including the wildcard pattern syntax. The description only adds the case-insensitivity note, which is useful but does not clarify the domain-vs-shared-list interaction (why `domain` is required when the list is account-wide). Baseline 3 applies.

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

Purpose4/5

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

The first sentence names a specific verb and resource ('Removes an entry from the spam whitelist'), which is unmistakable against siblings like add_spam_whitelist_entry or remove_spam_blacklist_entry. It doesn't explicitly route against those siblings, so it stops short of a 5.

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?

Removal intent is implied by the verb, and the account-wide scope hint nudges the agent to check before acting. There is no explicit when-to-use/when-not guidance or named alternative (e.g., 'use get_spam_whitelist first to find the exact entry').

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

set_catch_allSet Catch-AllA
Idempotent

Sets how the domain handles mail addressed to nonexistent local parts: fail rejects the mail, blackhole silently discards it, address forwards it to a chosen mailbox or forwarder. The address input is required when type is address and must be omitted otherwise.

NameRequiredDescriptionDefault
typeYes'fail' rejects mail to unknown addresses, 'blackhole' silently discards it, 'address' forwards it to a chosen mailbox
domainYesDomain name on this account, e.g. example.com (letters, digits, hyphens; at least one dot)
addressNoEmail address to forward catch-all mail to; required when type is 'address' and not allowed otherwise

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare the write/idempotent/non-destructive profile, and the description adds meaningful consequence detail beyond them: `fail` bounces mail and `blackhole` silently discards it, which is exactly the operational risk an agent needs. It does not say that the setting replaces any existing catch-all configuration, which is the main residual gap.

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?

Two sentences, zero filler, with the core behavior front-loaded and the conditional constraint placed second. Every clause carries information.

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?

With an output schema present and full parameter documentation, the description needs only to convey purpose and mode semantics, which it does. It is nearly complete; only the replace-existing-configuration behavior and permission expectations are left unstated.

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 schema already spells out both the enum meanings and the conditional requirement for `address`, so the description largely restates structured data. It adds no format or example detail beyond what the schema provides, making baseline 3 correct.

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 names a specific verb ('Sets') and resource ('how the domain handles mail addressed to nonexistent local parts') and then defines all three modes, so an agent immediately knows this is the write counterpart to get_catch_all in the sibling list.

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?

It gives the conditional rule for `address` (required for type `address`, omitted otherwise) which is real usage guidance, but it never states when to reach for this tool versus get_catch_all for reading the current configuration, and mentions no prerequisites or account permissions.

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

set_domain_mail_hostingSet Domain Mail HostingA
Idempotent

Enables or disables mail hosting for a domain. Set enabled=true to have MXroute handle mail for the domain, enabled=false to pause mail hosting. Pure state change: the domain, its mailboxes, and their settings are kept.

NameRequiredDescriptionDefault
domainYesDomain name on this account, e.g. example.com (letters, digits, hyphens; at least one dot)
enabledYesWhether MXroute hosts mail for the domain (true = enable, false = disable)

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare idempotentHint=true and destructiveHint=false, so the description does not need to argue idempotency. It does add useful context beyond them: that this is a 'pure state change' and that the domain, mailboxes, and their settings are preserved, which is exactly the reassurance an agent needs before flipping hosting off.

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?

Three short sentences, each earning its place: what it does, how to invoke each direction, and what is preserved. The most important constraint (non-destructive state change) is stated up front.

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?

With an output schema present and annotations covering safety and idempotency, the description only needs to explain the state semantics and preservation behavior, which it does. It could go further by noting whether MX/DNS records must already be in place for enabled=true to actually deliver mail.

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%, so both parameters are already documented. The description reinforces the enabled semantics with operational framing ('have MXroute handle mail', 'pause mail hosting') but adds no format or edge-case detail beyond the schema, making the baseline 3 appropriate.

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

Purpose4/5

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

The description uses a specific verb and resource ('Enables or disables mail hosting for a domain') and its framing of enabled=false as a pause rather than a deletion implicitly separates it from destructive siblings like delete_domain or delete_email_account. It never names an alternative explicitly, which keeps it just short of a 5.

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?

It clearly states the meaning of each parameter value (true = MXroute handles mail, false = pause), which tells the agent how to call it, but gives no guidance on when to choose this tool over delete_domain or create_domain, and no prerequisites such as DNS readiness.

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

set_reseller_user_packageSet Reseller User PackageA
Idempotent

Moves a reseller user to a different package and returns the updated user. Changing the package can change the quota and limits of every domain under the user. A 422 means the package does not exist (see list_packages). Reseller-level operation: call while authenticated as the reseller (plain reseller username), not while impersonating a user.

NameRequiredDescriptionDefault
packageYesName of the package to assign (see list_packages)
usernameYesReseller username (1-10 chars, lowercase letters, digits, underscores)

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the annotations, it discloses blast radius that destructiveHint=false alone would not convey: the quota and limits of every domain under the user can change. It also documents the 422 failure mode and the authentication identity requirement, both of which are operationally essential and absent from structured fields.

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?

Three tight sentences, front-loaded with the action, then impact, then error and auth notes. No filler or restatement of the title, and each sentence carries distinct information.

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?

The tool has an output schema, full annotation coverage and fully described parameters, so the description only needed to add behavior, failure modes and auth context, which it does. Nothing an agent needs to invoke this correctly appears to be missing.

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%, with both username and package documented including format and pattern constraints, so the schema already carries parameter meaning. The description adds only the cross-reference that package names come from list_packages and that a bad value surfaces as 422, which is marginal over the schema baseline.

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?

States a specific verb and resource ("Moves a reseller user to a different package") plus the return value ("returns the updated user"). It is clearly distinct from update_reseller_user and from list_packages, which it names only as a validation reference.

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

Usage Guidelines4/5

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

Gives a clear trigger (changing a user's package) and an explicit prerequisite: authenticate as the reseller with the plain reseller username, not while impersonating a user. It also routes the agent to list_packages when a 422 is returned. It stops short of contrasting with update_reseller_user, which an agent might otherwise consider for the same intent.

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

suspend_reseller_userSuspend Reseller UserA
Idempotent

Suspends a reseller user, blocking their access without deleting data. Repeating the call is harmless. Reseller-level operation: call while authenticated as the reseller (plain reseller username), not while impersonating a user. A 404 means the user does not exist.

NameRequiredDescriptionDefault
usernameYesReseller username (1-10 chars, lowercase letters, digits, underscores)

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnly=false, idempotent=true, destructive=false; the description confirms the non-destructive semantics ("without deleting data") and adds real context beyond them — the reseller-authentication requirement and the 404-means-not-found behavior. Restating "repeating the call is harmless" largely duplicates idempotentHint, which keeps this from a 5.

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?

Four short sentences, each carrying distinct information: effect and scope, idempotency, authentication context, and error semantics. The most decision-critical facts (what it does, what it does not destroy) are front-loaded with no filler.

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?

An output schema exists, so return values need not be explained, and the description covers the mutation's effect, safety profile, auth precondition, and the main error case. Minor gaps remain — nothing about whether existing sessions are terminated or how to reverse the suspension — but nothing required for a correct call is missing.

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 coverage is 100% and the single username parameter is fully documented in the schema, so the baseline is 3. The description adds auth-context meaning (the value is paired with reseller-level, non-impersonated authentication) but no format or disambiguation detail beyond what the schema already carries.

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

Purpose4/5

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

States a specific verb and resource ("Suspends a reseller user") plus the effect ("blocking their access without deleting data"), which implicitly separates it from delete_reseller_user and unsuspend_reseller_user. It never names those siblings explicitly, so an agent must infer the routing rather than being told it.

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

Usage Guidelines4/5

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

Gives a concrete invocation condition: call while authenticated as the reseller (plain reseller username), not while impersonating a user. That is exactly the kind of auth-context guidance that prevents failed calls. It stops short of naming the alternative tools (unsuspend_reseller_user for reversal, delete_reseller_user for removal), so when-not-to-use is only implied.

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

unsuspend_reseller_userUnsuspend Reseller UserA
Idempotent

Reverses the suspension of a reseller user, restoring their access. Repeating the call is harmless. Reseller-level operation: call while authenticated as the reseller (plain reseller username), not while impersonating a user. A 404 means the user does not exist.

NameRequiredDescriptionDefault
usernameYesReseller username (1-10 chars, lowercase letters, digits, underscores)

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false; the description adds the authentication-mode constraint (reseller vs impersonated user), which annotations cannot express, plus the 404 semantics. The idempotency sentence largely restates the idempotentHint annotation, so the added value is real but partly duplicative.

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?

Three short sentences, front-loaded with the effect, followed by idempotency and the auth constraint. No filler or redundant restatement of the name.

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?

For a single-parameter mutation with full annotations and an output schema, the description covers effect, idempotency, auth mode and the main error case. The only missing piece is the exact meaning of the username argument relative to the acting reseller.

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% (pattern, length bounds, and a description are all present), so the baseline is 3. The description adds only the framing that the call is made as the reseller, and does not clarify whether `username` names the target reseller user or the acting reseller — a small residual ambiguity the schema does not resolve.

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?

States a specific verb and resource: 'Reverses the suspension of a reseller user, restoring their access.' This clearly separates it from the sibling suspend_reseller_user and from the CRUD siblings (get/update/delete_reseller_user).

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

Usage Guidelines4/5

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

Gives concrete usage context: call while authenticated as the reseller (plain reseller username), not while impersonating a user. It also notes the 404 case for a non-existent user. What it lacks is an explicit pointer to the suspend counterpart or any precondition such as 'only meaningful if the user is currently suspended'.

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

update_email_accountUpdate Email AccountA
Idempotent

Updates a mailbox's password, storage quota, or daily send limit. Only provided fields change; omitted fields keep their current values. The mailbox is looked up case-insensitively by local part. Password rejections (outside 8-72 characters or failing server-side strength rules) return field-specific errors naming the password field.

NameRequiredDescriptionDefault
userYesLocal part of the email address (the part before the @), e.g. your_mailbox (1-64 chars)
limitNoDaily send limit (integer 0-9600)
quotaNoStorage quota in MB (integer; 0 = unlimited)
domainYesDomain name on this account, e.g. example.com (letters, digits, hyphens; at least one dot)
passwordNoPassword (8-72 characters; must also meet the mail server's character/strength rules — enforced server-side)

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), and the description adds genuinely new behavior: partial-update semantics ('Only provided fields change; omitted fields keep their current values') and the failure mode for passwords ('field-specific errors naming the password field'). It does not mention required permissions or what happens when the domain/local part is not found, so it stops short of full disclosure.

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?

Four compact sentences with the core purpose front-loaded and no filler. Slight redundancy is the only flaw: the 8-72 character password constraint is already in the schema and is partially repeated here, though it is attached to new error-behavior information.

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

Completeness3/5

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

An output schema exists, so return values need not be explained, and the mutation semantics are covered. However, for a partial-update mutation with five parameters there is no mention of authorization requirements, domain-existence preconditions, or side effects of lowering a quota below current usage — gaps an agent would want closed.

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 coverage is 100%, so the schema already documents every parameter including ranges and patterns; the baseline is 3. The description does add two pieces of meaning beyond the schema: that unspecified optional fields are left untouched, and that the 'user' local part is resolved case-insensitively. The password length/strength restatement duplicates the schema.

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

Purpose4/5

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

Opens with a specific verb+resource plus the exact mutable fields: 'Updates a mailbox's password, storage quota, or daily send limit.' That clearly distinguishes it from create_email_account, get_email_account and delete_email_account in the sibling list, though it never names an alternative explicitly.

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?

Usage is implied rather than stated: the agent can infer this is the tool for changing an existing mailbox's password/quota/limit. There is no explicit 'use this instead of X when Y', no stated prerequisite that the domain and mailbox must already exist, and no guidance on when not to call it.

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

update_packageUpdate PackageA
Idempotent

Updates a package's limits; only provided fields are sent, the rest keep their current values. Quota is in GB here (the reseller user quota endpoint uses MB). Changes affect every user on the package. Reseller-level operation: call while authenticated as the reseller (plain reseller username), not while impersonating a user. A 404 means the package does not exist.

NameRequiredDescriptionDefault
nameYesPackage name (letters, numbers, underscores, hyphens)
quotaNoDisk quota in GB or "unlimited"; omit to keep the current value
domainsNoDomain count or "unlimited"; omit to keep the current value
email_accountsNoCustomer mailbox count or "unlimited" (0 = no customer mailboxes — the system mailbox is excluded); omit to keep the current value
domain_pointersNoDomain pointer count or "unlimited"; omit to keep the current value
email_forwardersNoEmail forwarder count or "unlimited"; omit to keep the current value

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Annotations declare readOnly=false and idempotent=true but say nothing about scope or failure handling; the description supplies both — the change affects every user on the package (blast radius) and a 404 means the package does not exist. It also flags the unit mismatch with the reseller-user quota endpoint, which no annotation conveys.

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?

Four short, front-loaded sentences covering mutation semantics, unit caveat, blast radius, auth requirement, and error meaning — no filler. Each clause carries information an agent would otherwise have to guess.

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?

With an output schema present and full schema coverage, the description need not explain return values, and it fills the remaining gaps that matter for a mutation tool: auth mode, partial-update behavior, scope of effect, units, and 404 meaning.

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

Parameters4/5

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

Schema coverage is 100%, so the schema already documents each field and its "omit to keep current value" behavior, giving a baseline of 3. The description adds genuine meaning on top: the quota unit is GB here versus MB on the reseller-user endpoint, preventing a costly unit error.

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?

"Updates a package's limits" is a specific verb plus resource, immediately narrowed by "only provided fields are sent, the rest keep their current values," which establishes partial-update semantics. It also distinguishes itself from the reseller-user quota endpoint, so an agent can separate it from update_reseller_user or create_package without opening another schema.

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

Usage Guidelines4/5

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

The description gives a clear prerequisite and an explicit exclusion: call while authenticated as the reseller with the plain reseller username, not while impersonating a user. It does not name sibling operations (create_package, get_package, delete_package) as alternatives, but the operational context for correct invocation is unambiguous.

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

update_reseller_userUpdate Reseller UserA
Idempotent

Updates a reseller user's disk quota and/or password. Only provided fields are sent; the rest keep their current values. Reseller-level operation: call while authenticated as the reseller (plain reseller username), not while impersonating a user. A 404 means the user does not exist.

NameRequiredDescriptionDefault
quotaNoDisk quota in MB or "unlimited"; omit to keep the current quota
passwordNoNew login password for the user (minimum 8 characters, no maximum); omit to keep the current password
usernameYesReseller username (1-10 chars, lowercase letters, digits, underscores)

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare idempotency and non-destructiveness, yet the description still adds material context beyond them: partial-update semantics ('only provided fields are sent; the rest keep their current values'), a required authentication mode, and the meaning of a 404. The 404 note is exactly the kind of error-behavior disclosure that prevents blind retries.

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?

Three short sentences, zero filler, with the core action first and the auth constraint and error semantics layered after. Nothing is repeated for padding.

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?

An output schema exists, so return values need not be explained; annotations cover the safety profile. The remaining gaps an agent would care about for this mutation — which auth context to use, what happens to unmentioned fields, and how to interpret a 404 — are all covered.

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%, with patterns and the 'omit to keep current' semantics already documented per parameter. The description restates partial-update behavior but adds no syntax or format detail beyond the schema, so the baseline 3 applies.

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?

States a specific verb (Updates) and resource (a reseller user) plus the exact mutable surface (disk quota and/or password). That field enumeration distinguishes it from set_reseller_user_package and suspend/unsuspend_reseller_user without needing to name them.

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

Usage Guidelines4/5

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

Gives a real usage condition: 'call while authenticated as the reseller (plain reseller username), not while impersonating a user' — a genuine precondition an agent would otherwise get wrong. It lacks explicit routing to sibling alternatives (e.g. use set_reseller_user_package for package changes), so it stops short of 5.

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

update_spam_settingsUpdate Spam SettingsA
Idempotent

Sets the spam auto-deletion threshold (high_score, integer 1-50) for a domain. Lower values delete more aggressively; higher values keep more mail. Writes are serialized account-wide: if a save fails (for example 503), re-read the settings before retrying.

NameRequiredDescriptionDefault
domainYesDomain name on this account, e.g. example.com (letters, digits, hyphens; at least one dot)
high_scoreYesSpam score threshold for auto-deletion (integer 1-50)

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

The annotations only cover safety and idempotency, so the description carries most of the weight: it explains the practical consequence of the value (more or less mail deleted), the account-wide serialization of writes, and the recovery procedure after a 503. It stops short of stating auth or permission requirements, so it earns a 4 rather than a 5.

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?

Two dense sentences with the core action and its value semantics first, followed by the concurrency and retry caveat. There is no filler, and every clause adds information.

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?

With only two fully documented parameters, annotations covering the safety profile, and an output schema handling return values, the description covers everything an agent needs: what the write does, how the value behaves, and how to recover from a failed save. No material gap remains for a tool of this complexity.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, and the description adds real meaning beyond the schema by explaining what direction the high_score value moves deletion aggressiveness. The domain parameter gets no extra explanation in the description, so it does not reach a 5.

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 states a specific verb and resource: it sets the spam auto-deletion threshold for a domain. The direction of the setting ('Lower values delete more aggressively; higher values keep more mail') lets an agent distinguish it from the read-only sibling get_spam_settings without opening either schema.

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?

It implies usage through the setting semantics and the retry advice, which implicitly points to re-reading via get_spam_settings, but it never explicitly names that alternative or states when not to use this tool. There is no mention of prerequisites such as domain ownership or package requirements.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 43 tool updatesv0.1.0
    • First observedadd_spam_blacklist_entry
    • First observedadd_spam_whitelist_entry
    • First observedcreate_domain
    • First observedcreate_domain_pointer
    • First observedcreate_email_account
    • First observedcreate_forwarder
    • First observedcreate_package
    • First observedcreate_reseller_user
    • First observeddelete_domain
    • First observeddelete_domain_pointer
    • First observeddelete_email_account
    • First observeddelete_forwarder
    • First observeddelete_package
    • First observeddelete_reseller_user
    • First observedget_catch_all
    • First observedget_disk_quota
    • First observedget_dns_records
    • First observedget_domain
    • First observedget_email_account
    • First observedget_email_usage
    • First observedget_package
    • First observedget_reseller_user
    • First observedget_spam_blacklist
    • First observedget_spam_settings
    • First observedget_spam_whitelist
    • First observedget_verification_key
    • First observedlist_domain_pointers
    • First observedlist_domains
    • First observedlist_email_accounts
    • First observedlist_forwarders
    • First observedlist_packages
    • First observedlist_reseller_users
    • First observedremove_spam_blacklist_entry
    • First observedremove_spam_whitelist_entry
    • First observedset_catch_all
    • First observedset_domain_mail_hosting
    • First observedset_reseller_user_package
    • First observedsuspend_reseller_user
    • First observedunsuspend_reseller_user
    • First observedupdate_email_account
    • First observedupdate_package
    • First observedupdate_reseller_user
    • First observedupdate_spam_settings

TDQS

A3.7/5.0

Scored across 43 tools

Disambiguation4/5

Tools are organized into clear resource families (domains, pointors, mailboxes, forwarders, spam, DNS, reseller users, packages) with distinct verbs per resource. A few pairs need the descriptions to disambiguate (get_disk_quota vs get_email_usage, get_verification_key vs get_dns_records, domain pointers vs forwarders), but none are truly interchangeable.

Naming Consistency4/5

Nearly all tools follow a clean snake_case verb_noun pattern (list_domains, create_email_account, update_reseller_user, delete_package). Minor deviation: the spam lists use add_/remove_ while other resources use create_/delete_, and set_/update_ are used slightly inconsistently, but the convention is overwhelmingly predictable.

Tool Count3/5

43 tools is heavy and spans two distinct functional areas (domain/mailbox administration and reseller account/package management) that could reasonably be split. That said, the tools are genuinely distinct and each covers a real operation rather than being redundant, so it is feature-rich rather than bloated.

Completeness4/5

Coverage is broad and mostly full-lifecycle: domains, mailboxes, spam settings/whitelist/blacklist, catch-all, DNS, quotas, and reseller users/packages all have create/get/list/update/delete where meaningful. Minor gaps exist (no update for forwarders or domain pointers, no mailbox rename), but core workflows are fully supported.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables complete management of Mailcow email servers through 20 MCP tools including domain management, mailbox operations, email sending, queue management, sync jobs, and system monitoring. Provides AI models with full control over email server infrastructure through secure API integration.
    12
    MIT
  • A
    license
    C
    quality
    C
    maintenance
    Provides AI assistants with access to PurelyMail's email management API, enabling user, domain, routing, and billing management through natural language.
    19
    34 npm
    11
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Official Porkbun MCP server, maintained by Porkbun. Check availability and pricing, register, renew and transfer domains, and manage DNS, nameservers, URL forwarding, glue, DNSSEC, DNS restore points, static hosting, webhooks and Cloudflare-connected domains. Hosted at mcp.porkbun.com/mcp with Porkbun sign-in (no API key), or run locally with npx @porkbunllc/mcp-server. Docs: porkbun.com/mcp
    153
    3,460 npm
    36
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to register domains, manage DNS, create mailboxes, and send/receive email through typed tools.
    1,069 npm
    2
    MIT