Skip to main content
Glama
thinhost

thinhost-mcp

Official
by thinhost

thinhost-mcp

The thin.host MCP server: publish static sites (Docusaurus, Astro, Vite, Next export, hand-written HTML), provision custom domains, and send transactional email — from Claude Code, Claude Desktop, or any MCP client.

Prefer nothing to install? The same tools are hosted at https://thin.host/mcp (OAuth or a bearer API key): claude mcp add --transport http thin-host https://thin.host/mcp.

Install (local server, reads your build folder directly)

Create an API key in the thin.host dashboard (Settings → Create API key), then:

claude mcp add thin-host \
  -e THINHOST_API_URL=https://thin.host/v1 \
  -e THIN_HOST_API_KEY=th_live_your_key \
  -- uvx thinhost-mcp

Claude Desktop (claude_desktop_config.json):

{{ "mcpServers": {{ "thin-host": {{ "command": "uvx", "args": ["thinhost-mcp"],
  "env": {{ "THINHOST_API_URL": "https://thin.host/v1", "THIN_HOST_API_KEY": "th_live_your_key" }} }} }} }}

Related MCP server: seite

Tools

Tool

What it does

publish_website

Publish an HTML file, folder, ZIP or static build folder as a live site (big builds batched automatically)

update_website

Push changes; sync=true prunes files the new build no longer ships

publish_website_from_url / update_website_from_url

Same, from a public .zip/.html URL

list_websites

List the account's hosted sites

provision_domain / check_domain_status / update_origin / release_domain / list_domains

Custom domains with a hosted claim + DNS flow

send_email

Transactional email (allowlist + verified sending domain required)

Docusaurus users: see the recipe and the drop-in Claude skill in skills/thin-host-docusaurus.

Development

This repo is exported from the thin.host application repo (scripts/export_mcp_package.py there) so the package can never drift from the deployed server; edit it there, re-export, and push. Releases are built by GitHub Actions and published to PyPI with trusted publishing when a v* tag is pushed.

Available Tools

11 tools
check_domain_statusA

Check the current provisioning status of a domain.

Call this to poll whether a domain is ready. Typical flow:

  1. provision_domain → returns pending_payment

  2. User visits claim_url and pays → status becomes pending_dns

  3. User configures DNS → status becomes pending_ssl

  4. SSL auto-provisions → status becomes active, ready=true

Args: provision_id: The provision_id returned by provision_domain

Returns: status: Current status enum (pending_payment, pending_dns, pending_ssl, active, failed, released) dns_status: Whether DNS is resolving (resolved, unresolved) ssl_status: SSL certificate state (pending, active, failed) payment_status: Whether the user has paid (paid, unpaid, unknown) ready: Boolean — true only when domain is fully active with SSL failure_reason: Present only if status is "failed", explains what went wrong

ParametersJSON Schema
NameRequiredDescriptionDefault
provision_idYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden and does well: it enumerates every status transition, clarifies that ready is true only when fully active with SSL, and notes failure_reason appears only on failure. It does not mention auth requirements or polling rate limits, which keeps it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence, then a numbered lifecycle, then Args and Returns. Every line carries information the agent needs, and the return enumeration substitutes for the absent output schema rather than padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description must document returns — and it lists status, dns_status, ssl_status, payment_status, ready, and failure_reason with their value domains. Combined with the lifecycle flow, nothing needed to call and interpret this tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must explain the single parameter, and it does — provision_id is the value returned by provision_domain, which is exactly the provenance an agent needs. It stops short of format details but the one param is fully disambiguated.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Check the current provisioning status of a domain') that is clearly distinct from siblings like provision_domain, list_domains, or release_domain. An agent can pick this tool without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Call this to poll whether a domain is ready' and lays out the full four-step lifecycle from pending_payment to active, so the agent knows exactly when this tool is the right one and what to expect between calls.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_domainsA

List all domains provisioned through your platform account.

Use this to build dashboards or check the state of all domains.

Args: status_filter: Optional filter by status (pending_payment, pending_dns, pending_ssl, active, failed, released) limit: Maximum number of domains to return (default 50, max 100)

Returns: domains: Array of domain objects with id, hostname, status, ready fields total: Total number of matching domains has_more: Whether more results exist beyond this page

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
status_filterNo

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so the description carries the burden. It does add useful behavioral context through the Returns block (paginated results with total/has_more, default and max limits) and enumerates status values. However, it does not disclose auth requirements, rate limits, or anything about the side-effect profile beyond implying it is a read.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence, then usage, then Args and Returns sections. Every line earns its place, though the 'Args:'/'Returns:' convention is slightly verbose. No wasted filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with no output schema, the description covers status values, pagination behavior, and return fields (id, hostname, status, ready) plus total/has_more. It is nearly complete; missing only auth/rate-limit context, which is minor for a listing tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It does: enumerates all six valid status_filter values (pending_payment, pending_dns, pending_ssl, active, failed, released) and documents limit's default (50) and max (100), which the bare schema does not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('List all domains provisioned through your platform account') with scope (account-level). It is clearly distinguishable from check_domain_status and list_websites.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use it ('build dashboards or check the state of all domains'), which is clear context, but does not name alternatives like check_domain_status for single-domain checks or state when-not to use this.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_websitesB

List the account's hosted websites with their live URLs, newest first.

Args: limit: Max sites to return (default 50, max 100).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It discloses the ordering (newest first) and the return content shape (sites with live URLs), but says nothing about permissions, read-only nature, or whether results are paginated beyond the limit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded single-sentence summary followed by a compact Args block; no filler text. The Args formatting is slightly redundant for a one-parameter tool but not wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only list tool with one optional parameter and no output schema, the description covers what is returned (websites with live URLs) and ordering. It is nearly complete, with pagination behavior the one notable omission.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the lone limit parameter has no schema description, so the description must compensate. It does: it supplies both the default (50) and the maximum (100), which the schema does not provide, giving the agent actionable bounds.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (account's hosted websites) plus distinguishing detail (live URLs, newest-first ordering). It doesn't explicitly contrast with the sibling list_domains, but an agent can still tell the two resources apart from the wording.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no prerequisites, and no mention of alternatives such as list_domains or any filter-based lookup. The listing intent is implied by the verb, but nothing is spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

provision_domainA

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

Call this when a user wants their deployed site accessible at a custom domain. This creates the domain mapping and returns a claim_url where the user completes payment ($8/mo) and DNS setup. The domain is NOT immediately active — the user must visit the claim_url first.

Args: domain: The custom domain to provision (e.g., "mysite.com", "portfolio.dev") origin_url: The current URL where the site is hosted (e.g., "https://myapp.vercel.app") user_email: The end user's email address for billing and notifications idempotency_key: Optional key to prevent duplicate provisions on retry

Returns: provision_id: Unique ID to track this domain (use with check_domain_status) status: Current provisioning status enum (pending_payment, pending_dns, pending_ssl, active, failed, released) dns_instructions: Structured DNS record the user needs to create, plus a human_readable summary claim_url: URL to send the user to for payment and DNS setup walkthrough expected_completion_seconds: Estimated time for full provisioning after payment

ParametersJSON Schema
NameRequiredDescriptionDefault
domainYes
origin_urlYes
user_emailYes
idempotency_keyNo

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so the description carries the full burden, and it delivers a rich behavioral picture: it creates a mapping, is NOT immediately active, requires a post-step (claim_url visit), involves payment ($8/mo), and DNS setup. It also surfaces idempotency behavior. This is well beyond safe-read/write signaling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then usage trigger, then Args and Returns. Every sentence earns its place: no restatement of schema titles, and the behavioral constraint is stated once, early, and clearly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 4-param, no-annotation, no-output-schema mutation tool, this definition is complete: arguments, return fields (including status enum values and dns_instructions shape), completion-time expectation, and the mandatory claim_url step. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate fully, and it does: domain (e.g., 'mysite.com'), origin_url (e.g., a deployed URL), user_email (billing/notifications purpose), and idempotency_key (retry-safety purpose) are all explained with examples and intent.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Provision a new custom domain for an AI-generated site or app') with the scope clearly bounded. Distinguishes itself from siblings like check_domain_status and release_domain by being the creation step in the lifecycle.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit trigger stated: 'Call this when a user wants their deployed site accessible at a custom domain.' The description also clarifies the workflow boundary (must visit claim_url first) and routes the agent to the sibling check_domain_status for tracking. Nothing left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

publish_websiteA

Publish a local HTML file, directory, ZIP, or static build folder as a live site on thin.host.

Use this right after generating a site so the user gets a live, shareable URL instead of loose files they would have to upload somewhere themselves. Works for hand-written sites and for generator output — point it at a Docusaurus build/, an Astro dist/, a Vite dist/, or a Next out/ folder. HTML files become pages (index.html -> /, about.html -> /about, docs/intro/index.html -> /docs/intro, 404.html -> the site's own not-found page); css/js/images/fonts become assets served relative to the site root. Large builds are uploaded in several requests automatically.

Docusaurus: the response reports the build's base_url. A build made with baseUrl '/' only renders correctly once a custom domain is mapped to the site; to preview at the returned thin.host URL, build with baseUrl '/s//' (pass that slug here). Any mismatch comes back as a warning — surface it to the user.

The account's API key must be created from the thin.host dashboard (Settings → Create API key) so it is linked to a user account — error_code "account_not_linked" means it isn't; surface that guidance rather than retrying.

Args: source_path: Absolute path to an .html file, a site/build directory, or a .zip. title: Human-readable site title (shown in the dashboard and emails). slug: Optional URL slug (site lives at /s//). Auto-generated if omitted. "slug_taken" means it's in use — pick another or omit.

Returns: url: The live site URL — share this with the user. id, slug, title, page_count, asset_count, pages, assets: What was published. framework, base_url: Detected generator (e.g. "docusaurus") and its baseUrl. warning: Present when the build's baseUrl won't resolve at the returned url. skipped_files: Local files ignored because their type isn't supported.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugNo
titleYes
source_pathYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so well: it discloses the API-key account-linking requirement and the account_not_linked error, the slug_taken collision behavior, the baseUrl mismatch warning, ignored unsupported files, and that large builds are chunked into several requests.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose and then organized into Args/Returns sections with no filler sentences. The Docusaurus baseUrl paragraph is long and tutorial-like, but it earns its place by preventing a real misconfiguration, so the size is close to appropriate though slightly heavy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the Returns block is necessary and present, covering url, id/slug, counts, framework/base_url, warning, and skipped_files. Combined with the error-code guidance, an agent has everything needed to call this correctly and interpret results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it documents all three parameters: source_path (absolute path to file/dir/zip), title (shown in dashboard and emails), and slug (optional, auto-generated, /s/<slug>/ URL form, slug_taken error). This goes well beyond the bare schema types.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (publish) and resource (local HTML file, directory, ZIP, or static build folder) and names the target host. The word 'local' plus source_path detail cleanly separates it from the sibling publish_website_from_url, so an agent can route between them without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear triggering context ('use this right after generating a site') and concrete supported inputs (Docusaurus build/, Astro dist/, Vite dist/, Next out/). It never explicitly names publish_website_from_url as the alternative for URL-sourced publishing, so the exclusion is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

publish_website_from_urlA

Publish a site from a URL — a .zip of the site/build folder, or a single HTML page.

The hosted thin.host MCP endpoint cannot read your disk, so this is its publish path: zip the build folder (cd build && zip -r ../site.zip .), put the zip somewhere publicly reachable (a release asset, object storage, a slim.to link), and pass that URL. Everything else — page/asset mapping, batching, Docusaurus baseUrl detection and the warning it may produce — matches publish_website. Private, loopback and cloud-metadata addresses are refused.

Args: source_url: Public http(s) URL of a .zip archive or an .html file (≤150MB). title: Human-readable site title. slug: Optional URL slug (site lives at /s//).

Returns: Same shape as publish_website.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugNo
titleYes
source_urlYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses SSRF-style refusals for private, loopback, and cloud-metadata addresses, a 150MB size cap, and that Docusaurus baseUrl detection can emit a warning. It omits auth/permission requirements, whether publishing overwrites or replaces an existing site, and idempotency, which matter for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the one-line purpose, then the workflow rationale, then structured Args/Returns blocks. Every sentence carries information; the workflow sentence about zipping and hosting the archive is slightly verbose but earns its place given the unusual constraint.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-param mutation tool with no annotations and no output schema, the description covers publishing path, security limits, size cap, and parameter meanings. The remaining gap is the return value, which is delegated to 'Same shape as publish_website' — useful but requiring the agent to consult the sibling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate — and it does for all three parameters: source_url (public http(s) URL to a .zip or .html, ≤150MB), title (human-readable site title), and slug (optional, with the concrete URL pattern /s/<slug>/). This adds format and placement meaning well beyond the schema's bare titles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Publish a site from a URL') and immediately narrows the scope: a .zip of the build folder or a single HTML page. It explicitly frames itself as the URL-based counterpart to publish_website, so an agent can distinguish it from that sibling without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear triggering condition ('The hosted thin.host MCP endpoint cannot read your disk, so this is its publish path') and names the alternative path by stating that mapping/batching/warning behavior 'matches publish_website'. It stops short of an explicit when-not statement (e.g. 'use publish_website when you have local file access'), but the routing intent is unmistakable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

release_domainA

Release a provisioned domain, removing it from thin.host.

This tears down the domain mapping, SSL certificate, and cancels billing. The domain becomes available for re-provisioning. This action is not reversible.

Args: provision_id: The provision_id of the domain to release

Returns: status: "released" released_at: Timestamp of the release

ParametersJSON Schema
NameRequiredDescriptionDefault
provision_idYes

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so explicitly: it destroys the domain mapping and SSL certificate, cancels billing, frees the domain for re-provisioning, and is not reversible. That is exactly the destructive side-effect disclosure an agent needs before calling a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and impact, and the Returns block is valuable given there is no output schema. The Args section mildly restates the single schema property, a small redundancy, but overall tight.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No annotations or output schema exist, and the description covers the destructive effects, irreversibility, and return values well. It omits permission/auth requirements and how to source the provision_id, which for an irreversible operation would be useful.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for the single provision_id parameter, so the description must compensate. It only restates 'the provision_id of the domain to release' without saying where to obtain it (e.g., from list_domains), leaving a meaningful gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Release a provisioned domain') plus the concrete effect ('removing it from thin.host'), which cleanly separates it from siblings like provision_domain, check_domain_status, and list_domains.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the destructive teardown description, but the description never says when to prefer this over alternatives (e.g., check_domain_status first to confirm state) or what preconditions exist. Suitable context is present, but no explicit when/when-not routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_emailA

Send a single transactional notification email (e.g. a sign-in link, receipt, or alert).

PRECONDITION — this only works for accounts thin.host has approved for email AND when the 'from' address uses a verified sending domain. There is no self-serve:

  • Unapproved accounts get error_code "email_not_enabled".

  • A 'from' address on an unverified/unapproved domain gets "invalid_from_domain". In both cases the returned suggested_next_tool_call explains how to get approved or which sending domain to use. Do NOT retry blindly — surface that guidance to the user.

Omit 'from_address' to send from the account's default verified sender (recommended). Provide at least one of 'text' or 'html'. This is transactional only — do not use it for marketing or bulk sends.

Args: to: Recipient email address subject: Email subject line text: Plain-text body (provide this and/or html) html: HTML body (provide this and/or text) from_address: Optional sender; must be on a verified sending domain. Omit for the default. reply_to: Optional Reply-To address

Returns: id: The provider message ID for the accepted send status: "sent" when the message was accepted for delivery to: The recipient the message was sent to from_address: The sender the message was sent from

On failure returns the standard agent error shape (error_code, error_message, agent_should_retry, suggested_next_tool_call). Common 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYes
htmlNo
textNo
subjectYes
reply_toNo
from_addressNo

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does so thoroughly: approval requirements, verified sender domain constraints, specific error codes, retryability, and recipient_suppressed non-retry behavior. It also describes the success and failure return shapes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The definition is long but well structured and front-loaded: purpose, precondition, arguments, returns, and common errors. Every section adds actionable information for correct invocation, and there is little waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a six-parameter mutation tool with no annotations and no output schema, the description is complete. It covers prerequisites, parameter semantics, return values, failure modes, and retry guidance.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for all six parameters, and it does. It documents each argument, explains the text/html requirement, the verified-domain constraint on from_address, and the recommended default-sender omission.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: send a single transactional notification email, with examples. It also explicitly excludes marketing or bulk sends, making the intended use unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit preconditions, when the tool will fail, and what to do instead of retrying blindly. It also specifies the recommended way to omit from_address and requires at least one of text or html.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_originA

Change the origin/target URL for an existing domain.

Use this when the user redeploys their site to a new URL and wants the custom domain to point to the new location.

Args: provision_id: The provision_id of the domain to update new_origin_url: The new URL to route traffic to (e.g., "https://new-deploy.vercel.app")

Returns: status: Current domain status updated_at: Timestamp of the update

ParametersJSON Schema
NameRequiredDescriptionDefault
provision_idYes
new_origin_urlYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the whole burden. It discloses the mutation target and the returned fields (status, updated_at), but says nothing about required auth/ownership of the provision, whether the change is reversible, propagation delay, or impact on live traffic. Adequate but notably thin for a write operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded: purpose first, then usage context, then args and returns in a scannable layout. Every sentence earns its place; the Returns block is genuinely additive given there is no output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter mutation with no annotations and no output schema, the description covers params and return fields but omits permission requirements, error conditions, and reversibility. It is workable but leaves real gaps an agent would want before invoking a write.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: it explains provision_id identifies the domain to update and gives a concrete example format for new_origin_url. Both required parameters gain meaning beyond the bare string types, though valid-scheme/trailing-slash rules are not covered.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence gives a clear verb+resource pair ('Change the origin/target URL for an existing domain'), which an agent can map to a distinct operation. It does not explicitly name how it differs from close siblings like update_website or update_website_from_url, leaving that separation to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use this when the user redeploys their site to a new URL and wants the custom domain to point to the new location' gives a concrete triggering scenario. There is no explicit when-not guidance or named alternative (e.g. re-provisioning vs. updating), so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_websiteA

Push updated pages/assets to an existing hosted website (upsert by path).

Files present locally replace the same paths on the site. With sync=false (default) site files not in this upload are left untouched — right for editing a few pages by hand. With sync=true the upload is treated as the complete site: after it lands, every page and asset the site has that this upload does not is deleted. Always use sync=true when redeploying a generator build folder (Docusaurus, Astro, Vite, Next export) — each build renames its hashed chunks, and without sync the old ones pile up forever. Dashboard-authored redirect pages are kept regardless and listed in kept_redirects.

Use publish_website for a brand-new site.

Args: website: The site's id, slug, or live URL (e.g. "https://thin.host/s/my-site/"). source_path: Absolute path to an .html file, a site/build directory, or a .zip. title: Optional new site title. sync: Treat the upload as the whole site and remove everything else.

Returns: url plus updated counts, and with sync=true the removed_pages / removed_assets. framework, base_url, warning as in publish_website.

ParametersJSON Schema
NameRequiredDescriptionDefault
syncNo
titleNo
websiteYes
source_pathYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It clearly discloses destructive behavior with sync=true (deletes files not in upload), default behavior, and an exception (dashboard-authored redirect pages are kept). This is critical contextual information for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Information is well-organized with clear sections for Args and Returns. However, the behavioral paragraph is somewhat lengthy and could be tightened, though every sentence adds necessary context for this destructive operation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex mutation tool without annotations or output schema, the description covers purpose, usage, destructive behavior, parameter meanings, return values, and alternative tools. It is complete enough for an agent to invoke correctly and safely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must explain parameters. It does so thoroughly: defines website as id/slug/URL, source_path as .html/directory/.zip, and explains sync's effect. This compensates fully for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb ('Push updated pages/assets'), names the resource ('existing hosted website'), and clarifies the upsert-by-path semantics. It explicitly distinguishes itself from publish_website ('Use publish_website for a brand-new site').

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use guidance for sync=true vs sync=false, including concrete frameworks (Docusaurus, Astro, Vite, Next export), and explains the risk of not using sync. It also names the alternative tool for new sites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_website_from_urlA

Redeploy an existing site from a URL (.zip of the site, or a single HTML page).

The URL form of update_website, for the hosted endpoint or any agent that has the build as a downloadable archive. sync defaults to true here because a zipped build is the whole site: after upload, files the archive does not contain are deleted (dashboard-authored redirect pages are kept). Pass sync=false to upsert only.

Args: website: The site's id, slug, or live URL. source_url: Public http(s) URL of a .zip archive or an .html file (≤150MB). title: Optional new site title. sync: Treat the archive as the whole site (default true).

Returns: Same shape as update_website.

ParametersJSON Schema
NameRequiredDescriptionDefault
syncNo
titleNo
websiteYes
source_urlYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and discharges most of it: it discloses the destructive consequence of the default ('after upload, files the archive does not contain are deleted (dashboard-authored redirect pages are kept)'), the 150MB size cap, and the public-URL requirement. Auth/permission requirements and true idempotency are not stated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence, then rationale, then structured Args/Returns. Slightly redundant in restating the sync default, but every section earns its place and nothing is padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A destructive, no-annotation, no-output-schema mutation tool is mostly covered: destructive semantics, size limit, param meanings, and a pointer for the return shape ('Same shape as update_website'). Missing only auth/permission and error-behavior context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, yet the Args block documents all four parameters with meaningful semantics: website accepts id, slug, or live URL; source_url must be a public http(s) URL of a .zip or a single .html ≤150MB; sync's default and effect are explained. This fully compensates for the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Redeploy an existing site from a URL') with the accepted source formats in parentheses, and explicitly positions itself as 'the URL form of update_website', distinguishing it from that sibling and from publish_website_from_url.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context ('for the hosted endpoint or any agent that has the build as a downloadable archive') and a conditional on the key flag: sync default true, pass sync=false to upsert only. It does not spell out when to prefer the sibling update_website instead, so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 11 tool updatesv1.1.0
    • First observedcheck_domain_status
    • First observedlist_domains
    • First observedlist_websites
    • First observedprovision_domain
    • First observedpublish_website
    • First observedpublish_website_from_url
    • First observedrelease_domain
    • First observedsend_email
    • First observedupdate_origin
    • First observedupdate_website
    • First observedupdate_website_from_url

TDQS

A4.1/5.0

Scored across 11 tools

Disambiguation4/5

Tools target mostly distinct resources and actions: website publishing/listing/updating, domain provisioning/status/update/release/listing, and email. The only real overlap is between publish_website/update_website and their _from_url variants; descriptions clarify the source-path vs URL distinction, but an agent could still hesitate between them.

Naming Consistency5/5

All tool names use consistent snake_case and follow a predictable verb_noun or verb_noun_suffix pattern. The _from_url variants also use a consistent suffix convention.

Tool Count5/5

11 tools is well-scoped for a hosting, domain, and transactional email platform. Each tool covers a distinct operation without excessive surface area.

Completeness3/5

Domain lifecycle is complete: provision, check status, update origin, release, and list. Website lifecycle covers publish, update, and list, but lacks an obvious delete/unpublish or get-detail operation, which is a notable gap for a hosting service.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers