Hostsmith MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
Hostsmith MCP server: publish, share, and host files or static sites.
Context bootstrap:
On first use in a session, call get_account and list_domains once to learn the user's account (orgId, orgName), the user's home partition under user.homePartition, plan limits, and available domains. Cache and reuse these for the rest of the session; only re-call if the user asks for a refresh or you have reason to suspect the data changed (e.g. a domain was just claimed).
list_sites changes frequently (any create/delete mutates it). Always re-call before acting on a site reference rather than relying on a cached result.
Partition selection:
Pass partition: "eu" when the user signals EU residency or GDPR; otherwise omit partition and let it default to the user's home partition. Ask if unsure.
Plans and limits:
Every plan, Free included, can create sites in both the "us" and the "eu" partition. Pass partition: "eu" when the user asks for the EU or GDPR; otherwise omit it, and the site goes to the user's home partition.
When a plan's site limit is reached, creating a site returns the API error "Site limit reached for current plan". Surface it verbatim so the user knows they need to delete a site or upgrade.
Redirect hosts:
To forward a hostname with no content of its own, such as a retired domain or a campaign link, create a redirect host (create_site with kind: "redirect") and set its rules with set_redirects or add_redirect, rather than deploying a placeholder page.
Deploying content:
Two paths, pick by file size and type:
Use deploy_files for inline text/JSON/HTML you generated yourself, when total payload < ~1 MB. Bytes ship through the MCP server's JSON-RPC channel; subject to a ~6 MB hard ceiling.
Use deploy_create_upload + deploy_finalize for binaries (PDF, image, video, zip), files larger than ~1 MB, or any file you have available in your environment but not as inline text. The tools return per-part PUT URLs; bytes flow directly from your environment to the upload endpoint, never through the MCP server. The URL host is either a Hostsmith partition API host (
us.api.hostsmith.netoreu.api.hostsmith.net) or a direct S3 endpoint - treat both identically (one HTTP PUT per URL, capture theETagfrom each response).
If a deploy_create_upload PUT fails with a network/DNS/sandbox/proxy error, follow this escalation order. Do NOT improvise around it:
Ask the user to enable egress for the URL's host (preferred). The sandbox blocking is an environment setting the user can change; surface deploy_create_upload's allowlist-recovery instructions and wait for confirmation.
If the user declines or cannot change the sandbox, present the presigned URL(s) verbatim and ask them to upload the file themselves (curl, browser, etc.), then call deploy_finalize after they confirm.
Never base64-embed, data-URI, or otherwise inline binary content into HTML/CSS/JSON/other deployed files to bypass the upload path. It bloats the page, breaks browser caching, reships on every deploy, and hides the real problem from the user. Do NOT fall back to deploy_files for the same reason (payload exceeds its cap and the workaround is itself the anti-pattern).
When you notice yourself reasoning "the sandbox blocks X, so I'll route around it," stop and escalate to the user instead. Sandbox constraints are signals to ask, not puzzles to solve silently.
Read or generate the content client-side (in your own environment) - the MCP server has no access to the user's local filesystem.
The site must exist first; call create_site if no siteId is available.
Naming:
Site subdomains are lowercase alphanumeric with hyphens; no dots, no uppercase, no underscores.
Resolving the user's site reference:
Infer the intended FQDN from how the user described the site:
A name that looks like an FQDN (e.g.
blog.example.com) → split into subdomain + domain and validate against list_domains.A bare string that doesn't look like an FQDN (e.g. "my-blog") → assume it's a subdomain on a shared domain in the user's home partition.
Phrases like "my company homepage" on a domain the user owns with
enableApexDomain: true→ apex/wwwsite.When genuinely ambiguous, ask the user.
After resolving, look up the FQDN in the latest list_sites result to determine whether this is a new or existing site, and validate the domain/subdomain against list_domains.
Before performing any create/deploy/delete action, show the user the resolved info - full FQDN, partition, and whether the site is new or existing - and ask for confirmation.
Destructive actions (require explicit user confirmation; never call speculatively):
delete_site is irreversible - the URL goes dark immediately and content cannot be recovered.
deploy_files (and deploy_create_upload + deploy_finalize) against an existing site overwrite its current content. If the resolved FQDN matches an existing site, confirm with the user that they want to overwrite it before deploying.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_sitesA | List Hostsmith sites in the user's account. Returns each site's |
| list_domainsA | List domains the user can host sites under. Returns shared hosting domains (e.g. |
| get_accountA | Get the user's account: organization details ( |
| get_siteA | Get full details of a specific Hostsmith site by ID, including its public URL ( |
| create_siteA | Create a new Hostsmith site and return its
Subdomain selection must respect the domain's capabilities from Pass |
| delete_siteA | Permanently delete a Hostsmith site and all of its deployed files. Destructive - only call after explicit user confirmation. The site URL becomes unreachable immediately and the content cannot be recovered. The user must pass |
| deploy_filesA | Publish in-memory file contents to a Hostsmith site without writing to disk. Use when you have just generated content (an HTML page, a report, JSON data) and the user wants it live. Returns the deployment version and status; call Anti-pattern: do not use this tool to ship binaries (images, PDFs, video, fonts, zips) by base64-embedding or data-URI inlining them into HTML/CSS/JSON. Binaries belong on |
| deploy_create_uploadA | Start a direct-to-S3 upload for binary or large files. Use this instead of Bundle into a zip first when: the upload contains more than 3 files OR any file is larger than ~1 MB. The fileWorker auto-extracts a single-zip upload after promotion, so subdirectories are preserved end-to-end and you avoid one PUT round-trip per file. Skip zipping only for the trivial single-small-file case (e.g. one HTML). Bash bundle-and-deploy template (the agent should adapt fileNames and the cleanup prompt):
TMP=$(mktemp -d)
zip -r "$TMP/site.zip" index.html styles.css img/ # add every file/dir to deploy
SIZE=$(stat -c%s "$TMP/site.zip" 2>/dev/null || stat -f%z "$TMP/site.zip")
# 1. call deploy_create_upload with { siteId, files: [{ fileName: "site.zip", fileSize: $SIZE }] }
# 2. PUT $TMP/site.zip to the returned URL(s) per the protocol below, capturing ETag
# 3. call deploy_finalize with { siteId, versionId, completions: [...] }
# 4. ASK THE USER: "Deploy succeeded. Remove temp folder $TMP? [y/N]"
# Only run Three-step protocol:
The site must already exist - call Anti-patterns - never do these to bypass a blocked or unavailable upload path:
Recovery escalation order when a PUT fails with a network/DNS error (connection refused, name resolution failure, timeout, sandbox-denied, proxy 403/407) OR your host environment has no HTTP-PUT capability at all (no bash/curl, no Python
Egress allowlist instructions for step 1:
|
| deploy_finalizeA | Commit a deploy started with |
| list_redirectsA | List a site's redirect rules in the order they are checked; the first match answers. User rules come first: |
| set_redirectsA | Replace all of a site's user redirect rules in one call, all or nothing: pass either |
| edit_redirectsA | Apply a batch of adds, updates and deletes to a site's user redirect rules, in order, as one change: all of them or none. Use this, or |
| add_redirectA | Add one user redirect rule to a site, such as forwarding a moved page to its new path. User rules are checked before the live deploy's |
| delete_redirectA | Delete one user redirect rule by its |
| switch_file_redirectsA | Switch the live deploy's |
| test_redirectA | Test a path against a site's redirect rules, as the site would answer it: the rule that matches, with its |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 16 tools
Most tools target a distinct resource+action: sites (list/get/create/delete), deploys (files/upload/finalize), and redirects are clearly separated. The only real overlap is among set_redirects, edit_redirects, and add_redirect, which all mutate the same rule list, but the descriptions explicitly differentiate bulk replace, batch edit, and single add.
Every tool is snake_case with a leading verb (list_sites, get_site, create_site, delete_site, add_redirect, test_redirect, etc.), grouped by resource noun. The only slight irregularity is the compound deploy_create_upload, which is still readable and fits the pattern.
16 tools is at the upper edge of the comfortable range but each earns its place across three coherent sub-areas: site lifecycle, deploy pipeline, and redirect management. Slightly heavy on redirect tooling (six tools) relative to the rest.
Site lifecycle (create/list/get/delete), a full two-path deploy pipeline, and complete redirect CRUD plus testing are covered. Gaps exist around site configuration updates (no update_site) and deploy history/rollback, so recovery from a bad deploy means overwriting rather than reverting.