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
| Name | Type | Required | Description |
|---|---|---|---|
domain | string | yes | Custom domain (e.g. "mysite.com") |
origin_url | string | yes | Current URL where the site is hosted |
user_email | string | yes | End user's email for billing |
idempotency_key | string | no | Prevent 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
| Name | Type | Required |
|---|---|---|
provision_id | string | yes |
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
| Name | Type | Required |
|---|---|---|
provision_id | string | yes |
new_origin_url | string | yes |
Returns
{ "status": "active", "updated_at": "2026-04-25T02:00:00Z" }
release_domain
Tear down a provisioned domain. Not reversible.
Parameters
| Name | Type | Required |
|---|---|---|
provision_id | string | yes |
Returns
{ "status": "released", "released_at": "2026-04-25T03:00:00Z" }
list_domains
List all domains provisioned through your platform.
Parameters
| Name | Type | Required | Default |
|---|---|---|---|
status_filter | string | no | all |
limit | int | no | 50 |
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
| Name | Type | Required | Description |
|---|---|---|---|
to | string | yes | Recipient email address |
subject | string | yes | Subject line |
text | string | one of text/html | Plain-text body |
html | string | one of text/html | HTML body |
from_address | string | no | Sender on a verified domain; omit for the default |
reply_to | string | no | Reply-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"
}