Quickstart: MCP Server
Let any MCP-compatible agent (Claude Desktop, Claude Code, etc.) publish the sites it generates straight to live hosting, provision custom domains for them, and send transactional email — in under 5 minutes.
1. Get a Platform API Key
Sign up at thin.host, then open Email & API → Settings in your dashboard to generate your API key. For testing, you can use the free tier (3 domains, 100 API calls/day).
Sending email (the send_email tool) needs a separate, founder-approved access step beyond the API key. See Get access to email.
2. Configure Claude Desktop
Add the thin.host MCP server to your Claude Desktop config (claude_desktop_config.json):
{
"mcpServers": {
"thin-host": {
"command": "python",
"args": ["-m", "app.mcp_server"],
"cwd": "/path/to/thin-host",
"env": {
"THINHOST_API_URL": "https://thin.host/v1",
"THIN_HOST_API_KEY": "th_live_your_key_here"
}
}
}
}
3. Use It
In a Claude conversation, ask Claude to build something and put it live:
"Build me a landing page for my bakery and publish it."
Claude writes the site, calls publish_website, and hands you a live URL like https://thin.host/s/sunrise-bakery/. Iterate in the same conversation — "make the header green" — and Claude pushes the change with update_website.
Custom domains work the same way:
"I just deployed my site to https://myapp.vercel.app. Can you set up myportfolio.com as a custom domain?"
Claude will call provision_domain, get back a claim URL, and share it with you. You visit the claim page, pay, configure DNS, and the domain goes live.
Available Tools
| Tool | Description |
|---|---|
publish_website | Publish a local HTML file, directory, or ZIP as a live hosted site |
update_website | Push updated pages/assets to an existing hosted site |
list_websites | List your hosted sites with their live URLs |
provision_domain | Create a new custom domain with payment/claim flow |
check_domain_status | Poll domain provisioning progress |
update_origin | Change the target URL for a domain |
release_domain | Tear down a provisioned domain |
list_domains | List all domains with optional filtering |
send_email | Send a transactional notification email (requires email access approval) |
Example Flow
# Agent provisions a domain
result = await mcp.call("provision_domain", {
"domain": "mysite.com",
"origin_url": "https://myapp.vercel.app",
"user_email": "user@example.com"
})
# → { provision_id, status: "pending_payment", claim_url, dns_instructions }
# Agent shares the claim_url with the user
# User pays and configures DNS
# Agent checks status
status = await mcp.call("check_domain_status", {
"provision_id": result["provision_id"]
})
# → { status: "active", ready: true }
See the MCP Tool Reference for full parameter and response documentation.