Skip to main content
About this page · Updated 2026-11-05 16:07 UTC

What this page is: Sending domains, DNS records and authentication health: every tool on the `domains` MCP server with its scope, inputs and an example call. A slice of the full MCP tool reference.

How far to trust this page: the build checked 0 names, paths, tools, scopes and error codes against the real product (0 do not match). Not yet reviewed claim by claim.

Updated 2026-11-05 16:07 UTCRecently updated pages

MCP tools: Domains

Sending domains, DNS records and authentication health. This page is the slice of the full MCP tool reference for the domains server (the other servers are listed on the hosted servers page). The main server carries every tool, so these entries apply there too. Failures use the shape described in MCP errors.

motorical_domain_add​

Add a customer domain. Add a customer domain. Returns verification DNS instructions. For cname_managed DKIM publish the CNAME in verification.records.dkim / dnsRecords (not a TXT p= key). On 409 (domain already registered), call motorical_domain_list first to check whether it is already on this account before asking the user to resolve the conflict. A Free account may have one domain; adding another returns free_domain_limit with a nextAction. Over hosted OAuth it needs the manage:domains scope; the local server uses MOTORICAL_JWT. Requires OAuth scope: manage:domains (see motorical_whoami for what it allows).

PropertyValue
Needs scopemanage:domains
Available onHosted servers: main, domains; the local server too
Acts onThe whole account (no Motor Block needed)
Not listedWhen the connection does not hold the scope (the narrow servers hide it; the main server lists it marked "Needs permission")
REST routePOST /api/public/v1/domains
BehaviourChanges data
InputTypeRequiredMeaning
domainstringYes-
verificationMethodone of dns, emailNo-
motorBlockIdstring (uuid)NoOptional. This operation acts on the whole account, so a Motor Block is never needed; pass one only to record which block the call was made on behalf of.
idempotencyKeystringNoOptional. Pass the same value on a retry to get the exact original response back, instead of a duplicate.

Returns the JSON of the REST route above.

Example arguments (placeholders in angle brackets, required inputs only):

{"domain":"<domain>"}

motorical_domain_list​

List account domains. List domains already on this account — id, domain, verified, DNS auth flags. Call this before motorical_domain_add on a 409 conflict to self-diagnose whether the domain is already yours (proceed with the existing id) or genuinely owned by someone else (stop, do not guess). Over hosted OAuth it needs the read:domains scope; the local server uses MOTORICAL_JWT. Requires OAuth scope: read:domains (see motorical_whoami for what it allows).

PropertyValue
Needs scoperead:domains
Available onHosted servers: main, domains; the local server too
Acts onThe whole account (no Motor Block needed)
Not listedWhen the connection does not hold the scope (the narrow servers hide it; the main server lists it marked "Needs permission")
REST routeGET /api/public/v1/domains
BehaviourRead-only; safe to repeat
InputTypeRequiredMeaning
motorBlockIdstring (uuid)NoOptional. This operation acts on the whole account, so a Motor Block is never needed; pass one only to record which block the call was made on behalf of.

Returns the JSON of the REST route above.

Example arguments (placeholders in angle brackets, required inputs only):

{}

motorical_domain_get​

Get one account domain. One domain on this account by id: verified, DNS auth flags, DKIM mode, created. Read-only; no keys or tokens. Over hosted OAuth it needs the read:domains scope. Requires OAuth scope: read:domains (see motorical_whoami for what it allows).

PropertyValue
Needs scoperead:domains
Available onHosted servers: main, domains; the local server too
Acts onThe whole account (no Motor Block needed)
Not listedWhen the connection does not hold the scope (the narrow servers hide it; the main server lists it marked "Needs permission")
REST routeGET /api/public/v1/domains/{id}
BehaviourRead-only; safe to repeat
InputTypeRequiredMeaning
domainIdstring (uuid)Yes-
motorBlockIdstring (uuid)NoOptional. This operation acts on the whole account, so a Motor Block is never needed; pass one only to record which block the call was made on behalf of.

Returns the JSON of the REST route above.

Example arguments (placeholders in angle brackets, required inputs only):

{"domainId":"<domainId>"}

motorical_domain_dns_records​

Get domain DNS records. The DNS records to publish for one domain, with what each is for. Pass lookup:true to also check what DNS currently answers (slower: live lookups). Read-only. Over hosted OAuth it needs the read:domains scope. Requires OAuth scope: read:domains (see motorical_whoami for what it allows).

PropertyValue
Needs scoperead:domains
Available onHosted servers: main, domains; the local server too
Acts onThe whole account (no Motor Block needed)
Not listedWhen the connection does not hold the scope (the narrow servers hide it; the main server lists it marked "Needs permission")
REST routeGET /api/public/v1/domains/{id}/dns-records
BehaviourRead-only; safe to repeat
InputTypeRequiredMeaning
domainIdstring (uuid)Yes-
lookupbooleanNoAlso run live DNS lookups for each record (default false)
motorBlockIdstring (uuid)NoOptional. This operation acts on the whole account, so a Motor Block is never needed; pass one only to record which block the call was made on behalf of.

Returns the JSON of the REST route above.

Example arguments (placeholders in angle brackets, required inputs only):

{"domainId":"<domainId>"}

motorical_domain_health​

Get domain health by domain. Email-authentication health of ONE domain by id: SPF, DKIM, DMARC, status, issues, and whether the answer is cached (source). Works for a domain that has no Motor Block yet. Same shape as motorical_get_domain_health, which answers for the domain attached to one Motor Block. Pass refresh:true for a live DNS check (slower). A result with source "cache_stale" or refreshing:true is the last stored check (cacheAgeSeconds says how old; can be days): a recheck has started, so read again in about ten seconds or pass refresh:true. dmarc.policy is not reported yet (always null); dmarc.configured says whether a record exists. Read-only. Over hosted OAuth it needs the read:domains scope. Requires OAuth scope: read:domains (see motorical_whoami for what it allows).

PropertyValue
Needs scoperead:domains
Available onHosted servers: main, domains; the local server too
Acts onThe whole account (no Motor Block needed)
Not listedWhen the connection does not hold the scope (the narrow servers hide it; the main server lists it marked "Needs permission")
REST routeGET /api/public/v1/domains/{id}/health
BehaviourRead-only; safe to repeat
InputTypeRequiredMeaning
domainIdstring (uuid)Yes-
refreshbooleanNoRun a live DNS check instead of serving the cache (default false)
motorBlockIdstring (uuid)NoOptional. This operation acts on the whole account, so a Motor Block is never needed; pass one only to record which block the call was made on behalf of.

Returns the JSON of the REST route above.

Example arguments (placeholders in angle brackets, required inputs only):

{"domainId":"<domainId>"}

motorical_domain_verify​

Verify domain ownership. Verify domain ownership and refresh DKIM/SPF/DMARC send-readiness flags. Requires confirm:true — this call is destructive/consequential. Returns sendReady. Over hosted OAuth it needs the manage:domains scope; the local server uses MOTORICAL_JWT. Requires OAuth scope: manage:domains (see motorical_whoami for what it allows).

PropertyValue
Needs scopemanage:domains
Available onHosted servers: main, domains; the local server too
Acts onThe whole account (no Motor Block needed)
Not listedWhen the connection does not hold the scope (the narrow servers hide it; the main server lists it marked "Needs permission")
REST routePOST /api/public/v1/domains/{id}/verify
BehaviourDestructive: asks the person to confirm
InputTypeRequiredMeaning
domainIdstring (uuid)Yes-
methodone of dns, emailNo-
motorBlockIdstring (uuid)NoOptional. This operation acts on the whole account, so a Motor Block is never needed; pass one only to record which block the call was made on behalf of.
confirmbooleanNoRequired: true. Confirms this destructive action.

Returns the JSON of the REST route above.

Example arguments (placeholders in angle brackets, required inputs only):

{"domainId":"<domainId>"}

motorical_domain_check_dns​

Live-check domain DNS. Live-check DKIM/SPF/DMARC and persist dkim_configured/spf_configured. Required before /v1/send when ownership is verified but send returns DOMAIN_DNS_INCOMPLETE. Over hosted OAuth it needs the manage:domains scope; the local server uses MOTORICAL_JWT. Requires OAuth scope: manage:domains (see motorical_whoami for what it allows).

PropertyValue
Needs scopemanage:domains
Available onHosted servers: main, domains; the local server too
Acts onThe whole account (no Motor Block needed)
Not listedWhen the connection does not hold the scope (the narrow servers hide it; the main server lists it marked "Needs permission")
REST routePOST /api/public/v1/domains/{id}/check-dns
BehaviourChanges data; safe to repeat
InputTypeRequiredMeaning
domainIdstring (uuid)Yes-
recordTypeone of dkim, spf, dmarc, mxNo-
motorBlockIdstring (uuid)NoOptional. This operation acts on the whole account, so a Motor Block is never needed; pass one only to record which block the call was made on behalf of.

Returns the JSON of the REST route above.

Example arguments (placeholders in angle brackets, required inputs only):

{"domainId":"<domainId>"}

motorical_get_onboarding_state​

Get onboarding/account state. Where this account stands right now: stage, whether it can actually send (ready_to_send), what's blocking it, and the one next tool to call to move forward (GET /api/public/v1/account/state). Account-scoped: no Motor Block needed. Each blocker carries humanRequired (a person must act) and, where there is one, a nextAction. For an account with no plan and no domain the response also lists two onboarding options, own_domain and sandbox_domain, and a choose rule for picking between them: state the choice and the reason, and the person may override. Confirming recipients by emailed link needs the manage:recipients scope; an existing authorization must be re-approved to include it. Requires OAuth scope: read:domains (see motorical_whoami for what it allows).

PropertyValue
Needs scoperead:domains
Available onHosted servers: main, domains; the local server too
Acts onThe whole account (no Motor Block needed)
Not listedWhen the connection does not hold the scope (the narrow servers hide it; the main server lists it marked "Needs permission")
REST routeGET /api/public/v1/account/state
BehaviourRead-only; safe to repeat
InputTypeRequiredMeaning
motorBlockIdstring (uuid)NoOptional. This operation acts on the whole account, so a Motor Block is never needed; pass one only to record which block the call was made on behalf of.

Returns the JSON of the REST route above.

Example arguments (placeholders in angle brackets, required inputs only):

{}

motorical_whoami​

Who am I (account, plan, grant). Who this connection is acting for: the account (id, owner email, name), its plan (name, status, hasSubscription), account.billing (price amount in minor units + currency + interval, trial end, current period end / next renewal date, cancelAtPeriodEnd and endsAt, this month's sends against the plan cap, and paymentMethod.status ok or failing; never invoices, receipts or card details; a field it cannot resolve is null with its reason under billing.unavailable) and, for an OAuth connection, the grant: the client, the scopes it holds, the Motor Blocks it covers, when it was granted, and canAdd (permissions it could still be given, with available:false where the plan does not allow it) plus addInDashboard, the page where the person adds them. Account-scoped: no Motor Block needed. grant is null when the call is not made over an OAuth grant. Over OAuth it needs no scope, so any connection can ask what it holds, and every server lists it. Use it instead of inferring scopes from the tool list.

PropertyValue
Needs scopeNo scope: any OAuth connection can call it
Available onHosted servers: main, transactional, analytics, domains, sandbox, webhooks, motorBlocks, communications; the local server too
Acts onThe whole account (no Motor Block needed)
Not listedNever
REST routeGET /api/public/v1/account/whoami
BehaviourRead-only; safe to repeat
InputTypeRequiredMeaning
motorBlockIdstring (uuid)NoOptional. This operation acts on the whole account, so a Motor Block is never needed; pass one only to record which block the call was made on behalf of.

Returns the JSON of the REST route above.

Example arguments (placeholders in angle brackets, required inputs only):

{}

motorical_get_config​

Get Motor Block config. Configuration of one Motor Block — its sending domain, limits (as configured) and effectiveLimits (what is enforced now: dailyVolume, hourlyRate and burstLimit, the lower of configured and any reputation throttle, with defaults filled in; burstLimit is a short-window cap that applies to every block even when not configured), delivery settings, and activeAuthMethod ("Password"/"API Key"/"OAuth 2.0"/"mTLS", read-only -- changing it is dashboard-only). Requires OAuth scope: read:domains (see motorical_whoami for what it allows).

PropertyValue
Needs scoperead:domains
Available onHosted servers: main, domains; the local server too
Acts onOne Motor Block (the motorBlockId input)
Not listedWhen the connection does not hold the scope (the narrow servers hide it; the main server lists it marked "Needs permission")
REST routeGET /api/public/v1/motor-blocks/{id}/config
BehaviourRead-only; safe to repeat
InputTypeRequiredMeaning
motorBlockIdstring (uuid)NoRequired when the authorization covers more than one Motor Block

Returns the JSON of the REST route above.

Example arguments (placeholders in angle brackets, required inputs only):

{}

motorical_get_domain_health​

Get domain health. DNS and email-authentication health for the Motor Block's sending domain — SPF, DKIM, DMARC, MX. This is a set-up status, not a score, and it is separate from the delivery reputation score (motorical_get_reputation), which measures delivery outcomes. A result with source "cache_stale" or refreshing:true is the last stored check (cacheAgeSeconds says how old; can be days): a recheck has started, so read again in about ten seconds or pass refresh:true. dmarc.policy is not reported yet (always null); dmarc.configured says whether a record exists. Requires OAuth scope: read:domains (see motorical_whoami for what it allows).

PropertyValue
Needs scoperead:domains
Available onHosted servers: main, domains; the local server too
Acts onOne Motor Block (the motorBlockId input)
Not listedWhen the connection does not hold the scope (the narrow servers hide it; the main server lists it marked "Needs permission")
REST routeGET /api/public/v1/motor-blocks/{id}/domain-health
BehaviourRead-only; safe to repeat
InputTypeRequiredMeaning
motorBlockIdstring (uuid)NoRequired when the authorization covers more than one Motor Block
refreshbooleanNoRe-run the live DNS checks now instead of returning the last cached result

Returns the JSON of the REST route above.

Example arguments (placeholders in angle brackets, required inputs only):

{}