mx-route-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mx-route-mcpWhich mailboxes are using the most disk space?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mx-route-mcp
A Model Context Protocol (MCP) server for the MXroute email hosting API. Connect it to an MCP client such as Claude Desktop, Claude Code or Cursor and manage your MXroute account in plain language: add domains, create mailboxes, set up forwarders, tune spam filtering, look up the DNS records a domain needs, check disk usage, and administer reseller users and packages.
Unofficial. This project is not affiliated with or endorsed by MXroute. It wraps their public REST API.
Complete. One tool for each of the 43 operations in the MXroute API, kept honest by a test that compares the tool list with the API's operation list.
Guard rails built in. Every tool carries MCP behaviour hints (read-only / destructive / idempotent) so clients can ask before deleting anything, and destructive tools say so in their description. A read-only mode and per-area toolsets let you hand an assistant only what it needs.
Private. Your API key lives in the server's environment. By default it is sent only to
api.mxroute.comover HTTPS, never logged, and never shown to the model.
Contents
Related MCP server: whm-mcp-server
What you can ask it
"Which domains are on my MXroute account, and how many mailboxes does each have?"
"I want to add
example.org. What DNS record do I need to create first?""Create a mailbox
support@example.comwith a 5 GB quota and forwardsales@example.comtome@example.net.""Which mailboxes are using the most disk space?"
"Show me the MX, SPF and DKIM records for example.com."
"Add
*@spam-domain.exampleto my spam blacklist (account-wide) and raise the spam auto-delete score on example.com to 15."
Quick start
Requirements: Node.js 20 or newer, an MXroute account, and an MCP client.
1. Get your credentials
Create an API key on the MXroute API keys page. The page shows three values; the key is displayed once, so copy it when it is created.
Variable | What it is | Example |
| Your mail server hostname (the "X-Server" value) |
|
| Your DirectAdmin username (the "X-Username" value), or |
|
| The complete API key, unchanged, colons included |
|
2. Add the server to your client
The server is started with npx, which downloads and builds it from this repository on first use (this takes a few seconds, once):
npx -y github:MauiGrowth/mx-route-mcpClaude Desktop — add this to claude_desktop_config.json (Settings → Developer → Edit Config), then restart the app:
{
"mcpServers": {
"mxroute": {
"command": "npx",
"args": ["-y", "github:MauiGrowth/mx-route-mcp"],
"env": {
"MXROUTE_SERVER": "eagle.mxlogin.com",
"MXROUTE_USERNAME": "your_directadmin_username",
"MXROUTE_API_KEY": "your_complete_api_key"
}
}
}
}Claude Code
claude mcp add mxroute \
--env MXROUTE_SERVER=eagle.mxlogin.com \
--env MXROUTE_USERNAME=your_directadmin_username \
--env MXROUTE_API_KEY=your_complete_api_key \
-- npx -y github:MauiGrowth/mx-route-mcpCursor and other clients — Cursor uses the same mcpServers JSON as Claude Desktop (in .cursor/mcp.json). Any client that can launch a stdio MCP server works: run the npx command above with the three environment variables set.
Prefer to build it yourself? Clone the repo, run
npm install(this also builds it), and point your client atnode /absolute/path/to/mx-route-mcp/dist/index.jsinstead ofnpx. That also avoids the first-run build delay.
3. Check it works
MXROUTE_SERVER=eagle.mxlogin.com MXROUTE_USERNAME=you MXROUTE_API_KEY=... \
npx -y github:MauiGrowth/mx-route-mcp --checkThis lists your domains once and prints OK: authenticated to … ; N domains found. Nothing is modified. Then restart your client and ask: "Which domains are on my MXroute account?"
For a fuller read-only check of every list/get tool against your own account, from a clone of this repo:
npm install
MXROUTE_SERVER=eagle.mxlogin.com MXROUTE_USERNAME=you MXROUTE_API_KEY=... npm run smoke:liveIt starts the server in read-only mode (write tools are not registered, so nothing can change), calls each read tool, and prints only pass/fail with counts, never domain names or addresses. Reseller tools are reported as skipped on non-reseller accounts.
Using it
Just describe what you want. The assistant picks the tools, fills in the arguments, and tells you what happened. For example:
You: Add a mailbox
orders@example.comwith a 2 GB quota and forwardsales@example.comto it.Assistant: (calls
create_email_accountwithdomain: "example.com",username: "orders",quota: 2048, thencreate_forwarderwithalias: "sales",destinations: ["orders@example.com"]) Done:orders@example.comexists with a 2 GB quota, and mail tosales@example.comnow forwards to it.
A few things worth knowing:
Destructive actions ask first. Deleting a mailbox, domain, forwarder or user, changing a password, or switching a catch-all to
blackholeare marked destructive. Most clients show a confirmation prompt for those, and the assistant is told to confirm with you.Passwords go through the conversation. If you ask the assistant to create a mailbox, the password is part of your chat. See Security.
Adding a domain needs proof of ownership. The assistant fetches the verification record (
get_domain_verification_key) and asks you to create it at your DNS provider; this server cannot change DNS. After DNS propagates (typically 5–15 minutes) it can add the domain.Names are bare. Mailbox and forwarder names are the part before the
@; domains are plain names likeexample.com. Mistakes are rejected with a message the assistant can act on, as are misspelled arguments.Spam lists are account-wide. Whitelist/blacklist entries apply to every domain on the account. The
domainargument only has to be one you own.
How it works
flowchart LR
A["MCP client<br/>(Claude Desktop, Cursor, ...)"] -- "stdio, JSON-RPC" --> B["mx-route-mcp<br/>(runs on your machine)"]
B -- "HTTPS + 3 auth headers" --> C["api.mxroute.com"]
C --> D["Your MXroute account"]The server is a small local program. Your MCP client starts it as a child process and talks to it over stdin/stdout; it holds your credentials in its environment and makes HTTPS calls to the MXroute REST API on the assistant's behalf. Nothing is hosted, and nothing is sent anywhere except MXroute.
What happens on a request:
Startup. The client launches the server with your environment variables. The server registers its tools (all 43, or fewer if you set
MXROUTE_READ_ONLYorMXROUTE_TOOLSETS) and tells the client each tool's name, description, argument schema and behaviour hints (read-only, destructive, idempotent). It starts even without credentials; they are checked on the first call.Tool call. The assistant chooses a tool and arguments. The server validates them against a strict schema: required fields, types, ranges (a send limit of 9600, a spam score of 1–50), and the shapes the API expects. Unknown or misspelled arguments, full email addresses where a name belongs, and URLs where a domain belongs are rejected before anything is sent.
Mapping to the API. Each tool is bound to exactly one API operation, for example
POST /domains/{domain}/email-accounts. Path parameters are filled from the arguments (URL-encoded, with./..rejected) and the remaining arguments become the JSON body.The HTTP call. The server adds the
X-Server,X-UsernameandX-API-Keyheaders and sends the request with a timeout. It never follows redirects (which could forward your key to another host) and never retries (a retried write could apply twice).The result. The
{success, data}envelope is unwrapped; a204 No Contentbecomes a plain confirmation message; API errors become readable tool errors with the code, message and field (for exampleVALIDATION_ERRORonpassword); any field that looks like a credential is masked; and compact JSON goes back to the assistant. If a write times out, the error says the change may or may not have been applied, so the assistant checks the current state before trying again.
Worked example. The request "create a mailbox orders@example.com with a 2 GB quota" becomes:
// tool call
{ "name": "create_email_account",
"arguments": { "domain": "example.com", "username": "orders", "password": "…", "quota": 2048 } }POST https://api.mxroute.com/domains/example.com/email-accounts
X-Server: eagle.mxlogin.com
X-Username: johndoe
X-API-Key: ********
Content-Type: application/json
{ "username": "orders", "password": "…", "quota": 2048 }Where things live:
Path | Responsibility |
| One |
| The |
| The HTTP client: auth headers, timeout, no redirects, response unwrapping, error mapping. |
| Reads and validates the environment variables. |
| Registers the tools with the MCP SDK, formats results and errors. |
| Masks credential-looking fields in responses. |
| The command-line entry point ( |
Because a tool declares the operation it calls and the request is built from that declaration, a tool cannot claim to do one thing and send another. A test calls every tool and asserts the exact method, path and body it produces, and another compares the tool list with the API's operation list.
Configuration
Variable | Default | Purpose |
| – (required) | Mail server hostname. A pasted |
| – (required) | DirectAdmin username, or |
| – (required) | API key password. |
|
|
|
|
| Comma-separated subset of toolsets ( |
|
| Per-request timeout (1000–300000). |
|
| Override the API origin. Must be HTTPS (plain HTTP only for |
If the credentials are missing the server still starts and lists its tools; each tool call then returns an error naming the missing variables. --check and --tools read the same variables, so run them with the values from your client config.
Giving an assistant less power
For an assistant that should only look:
"env": { "MXROUTE_READ_ONLY": "true", "…": "…" }For one that manages mailboxes and forwarders but cannot touch domains, spam rules or reseller accounts:
"env": { "MXROUTE_TOOLSETS": "mailboxes,forwarders", "…": "…" }Reseller tools are registered by default but only work for reseller accounts. If you are not a reseller, drop them with MXROUTE_TOOLSETS to keep the tool list short. If you restrict toolsets, keep account and dns alongside domains if you want the assistant to be able to walk you through adding a domain.
Resellers
Reseller endpoints (reseller_users, reseller_packages) work when MXROUTE_USERNAME is your plain reseller username.
To manage one of your users' domains and mailboxes, set MXROUTE_USERNAME=reseller|user and keep using the reseller's API key. All domain and mailbox tools then act on that user. Per the API documentation:
each name is 1–16 letters, digits or underscores; chained pipes and self-impersonation are rejected (use the plain username for your own account);
only ordinary user accounts can be impersonated (not admins, and not user-to-user);
the key's DirectAdmin restrictions still apply, and must permit session queries, impersonation and the action you want;
reseller-only endpoints are unavailable while impersonating, and the reseller and every impersonated user share one rate-limit bucket.
To switch users, run a second server entry with a different MXROUTE_USERNAME.
Tool reference
Tool types: read tools never change anything; write tools create or modify; destructive tools delete data, overwrite a password, interrupt service, or change a setting that can cause mail to be discarded (catch-all, mail hosting status, the spam auto-delete threshold). MCP clients that honour the destructiveHint annotation can ask for confirmation before running them, and each destructive tool's description also tells the assistant to confirm first.
Account — toolset account
Tool | Type | API call | Description |
| read |
| Returns the account's domain verification key and the DNS TXT record that proves ownership of a domain. |
Domains — toolset domains
Tool | Type | API call | Description |
| read |
| Lists the names of all domains on the MXroute account. |
| read |
| Returns details for one domain: whether mail hosting is enabled, whether SSL is enabled, and its domain pointers. |
| write |
| Adds a domain to the account. |
| destructive |
| Permanently removes a domain from the account (irreversible); mailboxes and forwarders under the domain are affected. |
| destructive |
| Enables or disables mail hosting for a domain. |
Domain pointers — toolset pointers
Tool | Type | API call | Description |
| read |
| Lists the domain pointers (aliases and redirects) that point at a domain. |
| write |
| Creates a domain pointer so that another domain points at |
| destructive |
| Removes a domain pointer from a domain. |
Email accounts — toolset mailboxes
Tool | Type | API call | Description |
| read |
| Lists the mailboxes on a domain with quota (MB, 0 = unlimited), current usage (MB), daily send limit, emails sent today and suspended state. |
| read |
| Returns quota, usage, daily send limit, emails sent today and suspended state for one mailbox. |
| write |
| Creates a mailbox such as |
| destructive |
| Changes a mailbox's password, quota or daily send limit. |
| destructive |
| Permanently deletes a mailbox and the mail stored in it (irreversible). |
Forwarders — toolset forwarders
Tool | Type | API call | Description |
| read |
| Lists the email forwarders on a domain and the destinations each one forwards to. |
| write |
| Creates a forwarder |
| destructive |
| Deletes an email forwarder. |
Spam filtering — toolset spam
Tool | Type | API call | Description |
| read |
| Returns the spam filter settings for a domain. |
| destructive |
| Sets the high_score threshold (1-50) for automatic deletion of spam. |
| read |
| Lists the account-wide whitelist: sender entries that are never treated as spam. |
| write |
| Adds a sender email or wildcard pattern to the account-wide whitelist so its mail bypasses spam filtering on every domain. |
| destructive |
| Removes an entry from the account-wide spam whitelist. |
| read |
| Lists the account-wide blacklist: sender entries that are always treated as spam. |
| write |
| Adds a sender email or wildcard pattern to the account-wide blacklist so its mail is always treated as spam on every domain. |
| destructive |
| Removes an entry from the account-wide spam blacklist. |
DNS — toolset dns
Tool | Type | API call | Description |
| read |
| Returns the DNS records to configure at the registrar for a domain: MX records, SPF, DKIM (when available) and the verification record. |
Catch-all — toolset catchall
Tool | Type | API call | Description |
| read |
| Returns how mail to non-existent addresses on a domain is handled: fail, blackhole or address. |
| destructive |
| Sets how mail to non-existent addresses on a domain is handled: type=fail rejects it, type=blackhole silently discards it (mail is lost), type=address forwards it to |
Quota — toolset quota
Tool | Type | API call | Description |
| read |
| Returns the account's overall disk usage: bytes used, quota limit in bytes (0 = unlimited), percent used, a breakdown by category (email, web, databases, backups, other) and grace-period status if over quota. |
| read |
| Returns disk usage in bytes for every mailbox on the account, largest first. |
Reseller: users — toolset reseller_users
Tool | Type | API call | Description |
| read |
| Lists the usernames of all user accounts under the reseller. |
| read |
| Returns a user's email, primary domain, package, suspended state and disk quota. |
| write |
| Creates a new user account under the reseller, assigned to an existing package. |
| destructive |
| Changes a user's disk quota and/or password. |
| destructive |
| Permanently deletes a user account and everything in it (domains, mailboxes, mail); irreversible. |
| destructive |
| Suspends a user account, which interrupts their service until unsuspended. |
| write |
| Restores a suspended user account. |
| write |
| Assigns a different package to a user. |
Reseller: packages — toolset reseller_packages
Tool | Type | API call | Description |
| read |
| Lists the names of the reseller's packages. |
| read |
| Returns a package's limits: disk quota (GB), domains, mailboxes, forwarders and domain pointers. |
| write |
| Creates a package. |
| write |
| Changes a package's limits. |
| destructive |
| Deletes a package. |
Notes on behaviour:
Mailbox names and forwarder aliases are the part before the
@; domain arguments are bare names such asexample.com(no URL, no@). Mistakes are rejected locally with a message the assistant can act on.Misspelled or unknown arguments are rejected, not silently ignored.
Spam whitelist and blacklist entries are account-wide: they apply to every domain on the account. The
domainargument only has to be one you own.create_forwarderwith the special destination:blackhole:silently discards all mail to that address, andset_catch_allwithblackholedoes the same for unknown addresses.update_spam_settingscontrols how aggressively spam is auto-deleted. Those, and every delete, are flagged destructive.If a write times out or the connection drops, the change may or may not have been applied; the error says so, and the assistant should read the current state before retrying.
The documented API responses contain no passwords, and the server masks string fields whose names contain
password,passwd,passphrase,api_key/apiKey,secretortokenas a precaution. (A barekeyfield is left alone: the domain verification key is public.)Package limits and reseller user quotas accept a number or the string
unlimited. (The API wants strings; the tools convert for you.)Deleting a domain pointer, forwarder, mailbox, domain, user or package is immediate and cannot be undone.
Adding a domain requires proof of ownership: call
get_domain_verification_key, create the TXT record it describes, wait for DNS to propagate, thencreate_domain.
Not covered
The MXroute API does not expose reading or sending mail, webmail, autoresponders, DKIM key management or DNS record creation, so this server cannot do those things. get_dns_records tells you what to configure at your registrar; it does not change DNS.
Security
This is an administration tool. Read these before pointing an assistant at a production account.
Passwords pass through the conversation.
create_email_account,update_email_account,create_reseller_userandupdate_reseller_usertake a password as an argument, so the password you give the assistant is part of the chat transcript and is sent to your model provider. Use throwaway passwords that the mailbox owner changes on first login, or generate them yourself and keep them out of the chat.Use a dedicated API key created for this purpose, restricted in the MXroute/DirectAdmin panel to what you need (if you use reseller impersonation, the key must still permit it), and revoke it when you stop using it. The server never writes the key anywhere, but your MCP client's config file holds it in plain text: keep that file private and out of version control.
Prefer
MXROUTE_READ_ONLY=trueunless you actually want changes made, and keep a human confirmation step on the destructive tools in your client.Network behaviour. Requests go only to
MXROUTE_API_URL(defaulthttps://api.mxroute.com). Redirects are never followed, so credentials cannot be forwarded to another host. There are no automatic retries: every call is made exactly once.Logging. While serving, nothing is logged except a one-line startup banner on stderr. The
--check,--toolsand--helpcommands print to the terminal. Error messages returned to the assistant never include your credentials or the request body; text the MXroute API itself puts in an error is passed through, flattened to one line and capped at 500 characters.Rate limits enforced by MXroute: 200 reads/min, 60 writes/min and 10 bulk/import requests/min per server. A
429is reported to the assistant with the retry delay.
See SECURITY.md for how to report a vulnerability.
Troubleshooting
Symptom | Likely cause |
| Wrong server, username or key. Send the key unchanged: do not prepend a key ID, and make sure you copied the whole key (it is about 32 characters and starts with |
401/403 when | The key must be the reseller's own, the target must be an ordinary user you own, names are 1–16 letters/digits/underscores, and the key's DirectAdmin restrictions must permit impersonation. |
HTTP 403 on | The account is not a reseller, or |
| The |
Mailbox password rejected | Mailbox passwords are 8–72 characters and must satisfy the mail server's strength rules; the error names the field. |
| MXroute's limits (200 reads, 60 writes per minute). Wait and retry. |
| Network or DNS problem, or a wrong |
|
|
Server exits at startup with | A bad |
| A stray non-ASCII character (smart dash, zero-width space) came along when the value was copied. |
Tools missing |
|
The server is slow to appear the first time |
|
Project status
Verified against a live MXroute account: authentication, and every list/get tool (domains, pointers, DNS records, catch-all, mailboxes, forwarders, spam settings and lists, quotas, verification key). The real responses match the API's OpenAPI description, including the
/quotaendpoints that are returned without the usual{success, data}wrapper.Verified only against the API specification and a mock server: every write tool (create, update, delete), the reseller tools' success paths, and reseller impersonation. If you try them, make your first writes on a throwaway object, and please open an issue if anything behaves differently from the docs.
Automated tests: 100+ tests run on every push against a local mock API on Node 20, 22 and 24 (Linux). The suite calls every tool and asserts the HTTP method, path and body it produces. macOS was used for development; Windows is untested.
API drift: a weekly CI job compares the live OpenAPI document with the tool list and fails if MXroute adds or removes an operation. It does not detect changed fields or limits.
Development
git clone https://github.com/MauiGrowth/mx-route-mcp.git
cd mx-route-mcp
npm install # installs dependencies and builds dist/
npm test # builds, then runs all tests against a local mock API
npm run typecheck
node dist/index.js --toolsThe automated tests never contact MXroute: they spawn the built server over stdio and talk to a local mock API. npm run smoke:live is the opt-in counterpart that checks the read tools against a real account.
Other scripts:
npm run check:specbuilds, fetches the live OpenAPI document and fails if the API has an operation no tool covers or a tool targets an operation that no longer exists.npm run check:spec -- --writerefreshesspec/operations.json.npm run docs:toolsregenerates the tool table above from the code; CI fails if it is stale.
Adding or changing a tool
Tools live in src/tools/. Each is one tool({...}) call that names the API operation ("POST /domains/{domain}/forwarders"), its zod arguments and a description written for the model. Path parameters are filled from the arguments and the remaining arguments become the JSON body, so the declared operation and the actual request cannot disagree. Behaviour hints default from the HTTP method (GET is read-only, DELETE is destructive).
To cover a new API operation: add the tool, add a row to the table in test/tools.test.mjs, refresh the recorded operations with npm run check:spec -- --write, regenerate the README table with npm run docs:tools, and open a pull request. The tests pin which tools are destructive and non-idempotent, so changing a hint is a deliberate edit to that list. Design rationale is in DECISIONS.md.
About Maui Growth
mx-route-mcp is built and maintained by Maui Growth, a top website design and marketing agency on the island of Maui.
License
Available Tools
43 toolsadd_spam_blacklist_entryAdd spam blacklist entryA
Adds a sender email or wildcard pattern to the account-wide blacklist so its mail is always treated as spam on every domain. Returns 409 if the entry already exists (case-insensitive). The domain argument must be one you own, but the lists themselves are account-wide.
Inputs: entry (required), domain (required).
add_spam_whitelist_entryAdd spam whitelist entryA
Adds a sender email or wildcard pattern to the account-wide whitelist so its mail bypasses spam filtering on every domain. Returns 409 if the entry already exists (case-insensitive). The domain argument must be one you own, but the lists themselves are account-wide.
Inputs: entry (required), domain (required).
change_reseller_user_packageChange reseller user's packageAIdempotent
Assigns a different package to a user. Returns 422 if the package does not exist. Returns the updated user. Reseller accounts only (regular accounts are refused, typically with 403) and not available while MXROUTE_USERNAME is in reseller|user form.
Inputs: package (required), username (required).
create_domainAdd domainA
Adds a domain to the account. The domain's verification TXT record must already exist in DNS (see get_domain_verification_key) or the call will be rejected. Returns 409 if the domain already exists.
Inputs: domain (required).
create_domain_pointerCreate domain pointerA
Creates a domain pointer so that another domain points at domain (the target). alias=true (default) creates an alias pointer, alias=false creates a redirect pointer.
Inputs: domain (required), pointer (required), alias.
create_email_accountCreate email accountA
Creates a mailbox such as username@domain. The password is sent to MXroute and never shown in the result. Defaults when omitted: 1024 MB quota, 9600 emails/day send limit.
Inputs: domain (required), password (required), username (required), limit, +1 more.
create_forwarderCreate email forwarderA
Creates a forwarder alias@domain that sends mail to one or more destinations; the special destination :blackhole: silently discards all mail to it (confirm with the user first) and :fail: rejects it. Forwarding to Yahoo, AOL, Gmail and similar providers automatically enables Expert Spam Filtering for the domain.
Inputs: alias (required), domain (required), destinations (required).
create_packageCreate packageA
Creates a package. Omitted limits use the API defaults: quota 1 GB, 1 domain, 100 mailboxes, 100 forwarders, 10 domain pointers. Reseller accounts only (regular accounts are refused, typically with 403) and not available while MXROUTE_USERNAME is in reseller|user form.
Inputs: name (required), quota, domains, email_accounts, +2 more.
create_reseller_userCreate reseller userA
Creates a new user account under the reseller, assigned to an existing package. The password is sent to MXroute and never shown in the result. Reseller accounts only (regular accounts are refused, typically with 403) and not available while MXROUTE_USERNAME is in reseller|user form.
Inputs: email (required), package (required), password (required), username (required).
delete_domainDelete domainADestructiveIdempotent
Permanently removes a domain from the account (irreversible); mailboxes and forwarders under the domain are affected. Destructive: confirm with the user before calling.
Inputs: domain (required).
delete_domain_pointerDelete domain pointerBDestructiveIdempotent
Removes a domain pointer from a domain. Destructive: confirm with the user before calling.
Inputs: domain (required), pointer (required).
delete_email_accountDelete email accountADestructiveIdempotent
Permanently deletes a mailbox and the mail stored in it (irreversible). Destructive: confirm with the user before calling.
Inputs: domain (required), username (required).
delete_forwarderDelete email forwarderADestructiveIdempotent
Deletes an email forwarder. Mail sent to that address will no longer be forwarded. Destructive: confirm with the user before calling.
Inputs: alias (required), domain (required).
delete_packageDelete packageADestructiveIdempotent
Deletes a package. Fails with 422 if any user is still assigned to it. Reseller accounts only (regular accounts are refused, typically with 403) and not available while MXROUTE_USERNAME is in reseller|user form. Destructive: confirm with the user before calling.
Inputs: name (required).
delete_reseller_userDelete reseller userADestructiveIdempotent
Permanently deletes a user account and everything in it (domains, mailboxes, mail); irreversible. Reseller accounts only (regular accounts are refused, typically with 403) and not available while MXROUTE_USERNAME is in reseller|user form. Destructive: confirm with the user before calling.
Inputs: username (required).
get_catch_allGet catch-all settingBRead-onlyIdempotent
Returns how mail to non-existent addresses on a domain is handled: fail, blackhole or address.
Inputs: domain (required).
get_dns_recordsGet DNS records for a domainARead-onlyIdempotent
Returns the DNS records to configure at the registrar for a domain: MX records, SPF, DKIM (when available) and the verification record. Read-only; it does not change DNS.
Inputs: domain (required).
get_domainGet domain detailsARead-onlyIdempotent
Returns details for one domain: whether mail hosting is enabled, whether SSL is enabled, and its domain pointers.
Inputs: domain (required).
get_domain_verification_keyGet domain verification keyARead-onlyIdempotent
Returns the account's domain verification key and the DNS TXT record that proves ownership of a domain. Before create_domain will work, the user must add a TXT record named <key>.<yourdomain> with value domain-verified (the response shows the exact record; this server cannot change DNS) and wait for DNS to propagate, typically 5-15 minutes.
Inputs: no named parameters.
get_email_accountGet email accountARead-onlyIdempotent
Returns quota, usage, daily send limit, emails sent today and suspended state for one mailbox.
Inputs: domain (required), username (required).
get_email_usageGet per-mailbox disk usageARead-onlyIdempotent
Returns disk usage in bytes for every mailbox on the account, largest first. Refreshed hourly by MXroute.
Inputs: no named parameters.
get_packageGet packageARead-onlyIdempotent
Returns a package's limits: disk quota (GB), domains, mailboxes, forwarders and domain pointers. A null limit means unlimited; quota_unlimited flags an unlimited disk quota. Reseller accounts only (regular accounts are refused, typically with 403) and not available while MXROUTE_USERNAME is in reseller|user form.
Inputs: name (required).
get_quotaGet disk usage and quotaARead-onlyIdempotent
Returns the account's overall disk usage: bytes used, quota limit in bytes (0 = unlimited), percent used, a breakdown by category (email, web, databases, backups, other) and grace-period status if over quota. Figures are refreshed hourly by MXroute.
Inputs: no named parameters.
get_reseller_userGet reseller userARead-onlyIdempotent
Returns a user's email, primary domain, package, suspended state and disk quota. Reseller accounts only (regular accounts are refused, typically with 403) and not available while MXROUTE_USERNAME is in reseller|user form.
Inputs: username (required).
get_spam_settingsGet spam settingsBRead-onlyIdempotent
Returns the spam filter settings for a domain. high_score (1-50) is the score threshold for auto-deletion of spam.
Inputs: domain (required).
list_domain_pointersList domain pointersARead-onlyIdempotent
Lists the domain pointers (aliases and redirects) that point at a domain. Each entry has the pointer domain, its type (alias or redirect) and the target domain.
Inputs: domain (required).
list_domainsList domainsARead-onlyIdempotent
Lists the names of all domains on the MXroute account.
Inputs: no named parameters.
list_email_accountsList email accountsARead-onlyIdempotent
Lists the mailboxes on a domain with quota (MB, 0 = unlimited), current usage (MB), daily send limit, emails sent today and suspended state.
Inputs: domain (required).
list_forwardersList email forwardersARead-onlyIdempotent
Lists the email forwarders on a domain and the destinations each one forwards to.
Inputs: domain (required).
list_packagesList packagesARead-onlyIdempotent
Lists the names of the reseller's packages. Reseller accounts only (regular accounts are refused, typically with 403) and not available while MXROUTE_USERNAME is in reseller|user form.
Inputs: no named parameters.
list_reseller_usersList reseller usersARead-onlyIdempotent
Lists the usernames of all user accounts under the reseller. Reseller accounts only (regular accounts are refused, typically with 403) and not available while MXROUTE_USERNAME is in reseller|user form.
Inputs: no named parameters.
list_spam_blacklistList spam blacklistARead-onlyIdempotent
Lists the account-wide blacklist: sender entries that are always treated as spam. The domain argument must be one you own, but the lists themselves are account-wide.
Inputs: domain (required).
list_spam_whitelistList spam whitelistARead-onlyIdempotent
Lists the account-wide whitelist: sender entries that are never treated as spam. The domain argument must be one you own, but the lists themselves are account-wide.
Inputs: domain (required).
remove_spam_blacklist_entryRemove spam blacklist entryADestructiveIdempotent
Removes an entry from the account-wide spam blacklist. The domain argument must be one you own, but the lists themselves are account-wide. Destructive: confirm with the user before calling.
Inputs: entry (required), domain (required).
remove_spam_whitelist_entryRemove spam whitelist entryADestructiveIdempotent
Removes an entry from the account-wide spam whitelist. The domain argument must be one you own, but the lists themselves are account-wide. Destructive: confirm with the user before calling.
Inputs: entry (required), domain (required).
set_catch_allSet catch-allADestructiveIdempotent
Sets how mail to non-existent addresses on a domain is handled: type=fail rejects it, type=blackhole silently discards it (mail is lost), type=address forwards it to address. address is required when type is address and must be omitted otherwise. Destructive: confirm with the user before calling.
Inputs: type (required), domain (required), address.
set_mail_hosting_statusEnable or disable mail hostingADestructiveIdempotent
Enables or disables mail hosting for a domain. Disabling stops MXroute from handling mail for the domain. Safe to repeat with the same value. Destructive: confirm with the user before calling.
Inputs: domain (required), enabled (required).
suspend_reseller_userSuspend reseller userADestructiveIdempotent
Suspends a user account, which interrupts their service until unsuspended. Reseller accounts only (regular accounts are refused, typically with 403) and not available while MXROUTE_USERNAME is in reseller|user form. Destructive: confirm with the user before calling.
Inputs: username (required).
unsuspend_reseller_userUnsuspend reseller userAIdempotent
Restores a suspended user account. Reseller accounts only (regular accounts are refused, typically with 403) and not available while MXROUTE_USERNAME is in reseller|user form.
Inputs: username (required).
update_email_accountUpdate email accountADestructiveIdempotent
Changes a mailbox's password, quota or daily send limit. Provide at least one of password, quota, limit; omitted fields stay unchanged. Changing the password locks out anyone using the old one. Destructive: confirm with the user before calling.
Inputs: domain (required), username (required), limit, quota, +1 more.
update_packageUpdate packageAIdempotent
Changes a package's limits. Provide at least one limit; omitted limits are preserved. Reseller accounts only (regular accounts are refused, typically with 403) and not available while MXROUTE_USERNAME is in reseller|user form.
Inputs: name (required), quota, domains, email_accounts, +2 more.
update_reseller_userUpdate reseller userADestructiveIdempotent
Changes a user's disk quota and/or password. Provide at least one; omitted fields stay unchanged. Changing the password locks out anyone using the old one. Reseller accounts only (regular accounts are refused, typically with 403) and not available while MXROUTE_USERNAME is in reseller|user form. Destructive: confirm with the user before calling.
Inputs: username (required), quota, password.
update_spam_settingsUpdate spam settingsADestructiveIdempotent
Sets the high_score threshold (1-50) for automatic deletion of spam. Lower values are stricter and risk deleting legitimate mail. If the call fails with an unconfirmed-save error, read the settings with get_spam_settings before retrying. Destructive: confirm with the user before calling.
Inputs: domain (required), high_score (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
TDQS
Scored across 43 tools
Most tools target clearly distinct resources or actions, and descriptions help separate similar ones such as quota versus per-mailbox usage. Minor overlap exists between get_domain_verification_key and get_dns_records, and whitelist/blacklist pairs are symmetric, but they are unlikely to cause misselection.
The tool names consistently use snake_case with a verb-first pattern such as list_, get_, create_, update_, delete_, set_, add_, and remove_. Multi-word names like set_mail_hosting_status and change_reseller_user_package remain predictable and readable.
At 43 tools, the surface is well above the typical 3-15 range and falls into the heavy category. Although the MXroute domain is broad, the count is excessive for an agent-facing set and could be consolidated or grouped.
Coverage is strong across domains, email accounts, forwarders, spam settings, whitelist/blacklist, reseller users, packages, quotas, and configuration. Minor gaps such as an update_forwarder operation or explicit mailbox suspend/unsuspend exist, but agents can generally work around them.
Maintenance
Related MCP Connectors
Email hosting from your AI: read and send mail, add domains, check DNS and manage mailboxes.
Email, calendar and contacts for AI agents: Gmail, Microsoft 365 and IMAP accounts behind one API.
Send email, manage domains, templates, webhooks and broadcasts from your AI agent.
Connect any IMAP/SMTP mailbox to Claude & ChatGPT: search, read, sort, draft. Sends only with OK.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI assistants to manage Migadu email hosting services through natural language, including creating mailboxes, setting up aliases, configuring autoresponders, and handling bulk operations efficiently.3537 PyPI17MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to manage WHM hosting accounts and server administration tasks including account management, server stats, updates, SSL, backups, and email through a secure API.12ISC
- AlicenseCqualityCmaintenanceProvides AI assistants with access to PurelyMail's email management API, enabling user, domain, routing, and billing management through natural language.1934 npm11MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to manage cPanel hosting accounts including DNS, email, databases, SSL, files, security, and more through natural language using cPanel's UAPI and API2.ISC