MCP Tool Reference

The thin.host MCP server exposes 6 tools — 5 for domain provisioning and send_email for transactional email. All tool descriptions are written for agent reasoning — status fields are enums, not prose.

provision_domain

Provision a new custom domain for an AI-generated site or app.

Parameters

NameTypeRequiredDescription
domainstringyesCustom domain (e.g. "mysite.com")
origin_urlstringyesCurrent URL where the site is hosted
user_emailstringyesEnd user's email for billing
idempotency_keystringnoPrevent duplicate provisions on retry

Returns

{
  "provision_id": "uuid",
  "status": "pending_payment",
  "dns_instructions": {
    "type": "CNAME",
    "name": "mysite.com",
    "value": "cname.thin.host",
    "human_readable": "Set a CNAME record for mysite.com pointing to cname.thin.host"
  },
  "claim_url": "https://thin.host/claim/abc123...",
  "expected_completion_seconds": 300
}

check_domain_status

Check current provisioning status. Call this to poll until ready: true.

Parameters

NameTypeRequired
provision_idstringyes

Returns

{
  "status": "active",
  "dns_status": "resolved",
  "ssl_status": "active",
  "payment_status": "paid",
  "ready": true
}

update_origin

Change where a domain points to. Use when the user redeploys to a new URL.

Parameters

NameTypeRequired
provision_idstringyes
new_origin_urlstringyes

Returns

{ "status": "active", "updated_at": "2026-04-25T02:00:00Z" }

release_domain

Tear down a provisioned domain. Not reversible.

Parameters

NameTypeRequired
provision_idstringyes

Returns

{ "status": "released", "released_at": "2026-04-25T03:00:00Z" }

list_domains

List all domains provisioned through your platform.

Parameters

NameTypeRequiredDefault
status_filterstringnoall
limitintno50

Returns

{
  "domains": [ { "id": "...", "hostname": "...", "status": "...", "ready": true }, ... ],
  "total": 42,
  "has_more": false
}

send_email

Send a single transactional notification email (sign-in link, receipt, alert). Precondition: the account must be allowlisted for email and the from address must use a verified sending domain — omit from to use the default verified sender. Unapproved accounts get email_not_enabled; a bad sender gets invalid_from_domain. Surface those errors to the user instead of retrying. Transactional only — not for marketing or bulk.

Parameters

NameTypeRequiredDescription
tostringyesRecipient email address
subjectstringyesSubject line
textstringone of text/htmlPlain-text body
htmlstringone of text/htmlHTML body
from_addressstringnoSender on a verified domain; omit for the default
reply_tostringnoReply-To header

Returns

{
  "id": "<provider-message-id>",
  "status": "sent",
  "to": "user@example.com",
  "from_address": "no-reply@mail.thin.host"
}

Common failure error_codes: email_not_enabled, invalid_from_domain, recipient_suppressed (prior bounce/complaint — do not retry), rate_limited (retryable after the window resets), invalid_to, missing_subject, empty_body. There is also a drop-in Claude skill wrapping this tool + the REST endpoint.

Error Format

All tools return structured errors when something goes wrong:

{
  "error_code": "domain_taken",
  "error_message": "The domain mysite.com is already provisioned",
  "agent_should_retry": false,
  "suggested_next_tool_call": "Choose a different domain"
}