Hostsmith
Server Details
Deploy static sites on Hostsmith - give it a file, get a live HTTPS URL. EU/US residency.
- Status
- Healthy
- Uptime
- 18.3% over 69 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- hostsmith/mcp-server
- GitHub Stars
- 0
- Server Listing
- Hostsmith MCP Server
TDQS
Scored across 9 tools
The site, account, and domain tools have clearly distinct purposes. The three deploy-related tools share the deployment domain, but their descriptions explicitly separate inline small-text deploys from direct-to-S3 binary/large-file uploads and finalization, so misselection risk is low though not zero.
All tool names use snake_case with a consistent verb-first pattern: create/delete/get/list/deploy. deploy_create_upload is a compound action but remains readable and follows the same convention without mixing camelCase or vague verbs.
Nine tools is well-scoped for a site-hosting server. Each tool earns its place by covering site creation, deletion, listing, inspection, deployment paths, domains, and account context without obvious redundancy.
The core lifecycle is covered: create, list, get, delete, deploy small/large files, and inspect account/domains. Minor gaps exist, such as no update_site for renaming or reconfiguring an existing site and no explicit deployment/version management beyond finalize/get_site.
Available Tools
9 toolscreate_siteADestructiveInspect
Create a new Hostsmith site and return its siteId, full URL, and configuration. Use when the user wants to publish or host new content and no suitable site already exists. After creation, deploy content with deploy_files (small inline text) or deploy_create_upload + deploy_finalize (binaries / files > ~1 MB, uploaded directly to S3). The site-resolution and confirmation flow is described in the global server instructions; the rules below are specific to this tool's parameters.
domain MUST be one of the domains returned by list_domains for this user - never invent or assume one. The selected domain must be in active status; if it isn't, surface the problem to the user instead of attempting creation. partition passed to this tool MUST match the partition of the selected domain.
Subdomain selection must respect the domain's capabilities from list_domains. To serve the bare apex, pass subdomain: "www" - only valid when the domain has enableApexDomain: true (typically custom domains the user owns). For any other subdomain, the domain must have enableSubdomains: true; shared hosting domains (e.g. *.hostsmith.link) and most custom domains have enableApexDomain: false, so a non-apex subdomain is required there. If the chosen domain doesn't support the kind of site the user asked for (apex vs subdomain), surface the conflict rather than silently picking something else.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Parent domain for the site, MUST be one returned by `list_domains` for this user. Examples: "us.hostsmith.link", "eu.hostsmith.link", or a custom domain the user owns. Do not invent domains. | |
| llm_model | Yes | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. | |
| partition | No | Data partition for the new site. Must match the partition of the selected domain. | |
| subdomain | No | Subdomain prefix; auto-generated if omitted. Lowercase alphanumeric with hyphens only - no dots, uppercase, or underscores. Pass `subdomain: "www"` only when the chosen `domain` has `enableApexDomain: true` in `list_domains` (creates the canonical site at `www.<apex>` with the bare apex redirecting to it). For any other subdomain the chosen `domain` must have `enableSubdomains: true`. | |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, so the write/create nature is covered; the description adds substantial extra context — the list_domains dependency, active-status requirement, partition-matching constraint, and the apex/subdomain capability rules. It doesn't describe rollback or quota behavior, keeping it just 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose and the deploy follow-up path before the parameter rules. Dense and mostly earned, though the apex/subdomain paragraph is lengthy and partly duplicates schema guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, it names the return values, the prerequisite lookup tool, the confirmation flow location, and the capability constraints. An agent has everything needed to call it correctly without opening the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real cross-parameter semantics beyond the schema: domain must come from list_domains, partition must match domain, and subdomain validity depends on the domain's enableApexDomain/enableSubdomains capabilities. The www/apex rule overlaps with the schema text, so not a full 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create a new Hostsmith site') and names the return payload (siteId, URL, configuration). It clearly routes the agent away from sibling deploy tools and delete_site, so selection is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it ('publish or host new content and no suitable site already exists') and names the correct follow-up alternatives, deploy_files vs deploy_create_upload + deploy_finalize, with the condition (inline text vs binaries > ~1 MB) that selects between them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_siteADestructiveInspect
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 confirm: true for the deletion to proceed; otherwise the call returns an error explaining the safeguard.
| Name | Required | Description | Default |
|---|---|---|---|
| siteId | Yes | The site ID to delete (from `list_sites` or `get_site`). | |
| confirm | No | Set to true only after the user has explicitly confirmed they want to permanently delete this site. Required safeguard - never pass true speculatively. | |
| llm_model | Yes | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. | |
| partition | No | Data partition the site lives in. Omit to use the user's home partition. | |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=true; the description adds substantial context beyond that: irreversibility, immediate URL unreachability, deletion of deployed files, and the confirm safeguard that returns an error rather than silently proceeding. This is exactly the extra behavioral detail the annotation bar asks for.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, with the destructive warning bolded and front-loaded before the mechanics of confirm. No sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description covers the error path and irreversibility well, which is the key information for a destructive tool. It does not describe the success response, but that is a minor gap against otherwise complete coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description adds meaning to confirm beyond the schema by describing the safeguard's runtime behavior (error returned when not passed). The other parameters are left entirely to the schema, which is acceptable given full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (permanently delete), resource (Hostsmith site), and scope (all deployed files), which cleanly separates it from the create/get/list siblings. An agent can identify the tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the precondition ('only call after explicit user confirmation') and the required confirm: true, plus the failure mode if omitted. It does not name an alternative, but no alternative delete operation exists among the siblings, so the routing guidance is effectively complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deploy_create_uploadADestructiveInspect
Start a direct-to-S3 upload for binary or large files. Use this instead of deploy_files for binaries (PDF, image, video, zip) or any file > ~1 MB. The MCP server has no access to the user's filesystem and deploy_files ships content inline through Lambda (capped at ~6 MB JSON-RPC payloads); this tool returns presigned S3 PUT URLs so the file bytes flow directly from your environment to S3, never through the MCP server.
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 rm -rf "$TMP" after explicit confirmation; otherwise leave it for them to inspect.
Three-step protocol:
Call this tool with
{ siteId, files: [{ fileName, fileSize }] }. Receive{ versionId, files: { [fileName]: { uploadId, key, partUploadUrls: [{ part, url }], partSize, expiresAt } } }.For each file, slice the bytes into chunks of
partSizeand PUT each chunk to itspartUploadUrls[i].url. Capture theETagresponse header from every PUT - you will need it for finalize.Single-part (small file, one URL):
curl -D - -X PUT --data-binary @file.pdf "$URL", then grep the response headers forETag.Multi-part with
dd(no temp files; reads each chunk in place): count=$(jq ".files["large.zip"].partUploadUrls | length" envelope.json) for i in $(seq 0 $((count-1))); do url=$(jq -r ".files["large.zip"].partUploadUrls[$i].url" envelope.json) etag=$(dd if=large.zip bs=5M skip=$i count=1 status=none
| curl -sS -D - -X PUT --data-binary @- "$url"
| awk -F': ' 'tolower($1)=="etag"{print $2}' | tr -d '\r') echo "{ "PartNumber": $((i+1)), "ETag": $etag }" >> parts.json doneMulti-part in Python - prefer this over dd for files > ~50 MB (parallel PUTs, no temp files, cleaner error handling): import json, requests from concurrent.futures import ThreadPoolExecutor env = json.load(open("envelope.json")) info = env["files"]["large.zip"] part_size = info["partSize"] def upload_part(p): with open("large.zip", "rb") as f: # own handle per thread f.seek((p["part"] - 1) * part_size) r = requests.put(p["url"], data=f.read(part_size)) r.raise_for_status() return {"PartNumber": p["part"], "ETag": r.headers["ETag"]} with ThreadPoolExecutor(max_workers=5) as ex: # cap concurrency at 5 parts = list(ex.map(upload_part, info["partUploadUrls"]))
Call
deploy_finalizewith{ siteId, versionId, completions: [{ uploadId, key, parts: [{ ETag, PartNumber }] }] }for every multi-part file. Single-part uploads (uploadIdis empty in the start response) need no completion entry.
The site must already exist - call create_site first if you do not have a siteId. Deploying overwrites existing content; confirm overwrite with the user first.
Anti-patterns - never do these to bypass a blocked or unavailable upload path:
Do NOT base64-embed, data-URI, or otherwise inline binary content (images, PDFs, video, fonts, zips) into HTML/CSS/JSON or any other deployed file. Inlining bloats the page, breaks browser caching, reships the bytes on every redeploy, and hides the real environment problem from the user.
Do NOT fall back to
deploy_filesfor a binary that was meant fordeploy_create_upload- the payload exceedsdeploy_files' cap and the workaround is itself an anti-pattern.Do NOT silently downscale, recompress, or otherwise mutate the user's file to fit a smaller path - ask first. When the upload path is unavailable, surface it to the user using the escalation order below.
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 requests, no fetch). Do NOT retry blindly - a sandbox denial does not resolve on its own.
Ask the user to enable egress (preferred fix). This is the cheapest option and unblocks all future uploads. Surface the exact sandbox configuration below and wait for the user to confirm before retrying. Most users can flip this setting in seconds; do not skip to step 2 without asking.
If the user declines, cannot change the sandbox, or has no HTTP-PUT capability in-environment, present the failing presigned URL(s) verbatim and ask them to upload the file themselves (curl one-liner, browser, or any HTTP client they have). Provide a copy-pasteable command. Call
deploy_finalizeonly after the user confirms each PUT returned 200 with an ETag (they will need to share the ETags back for multi-part uploads).Never route around the failure by base64-inlining the file into another deploy, recompressing, or falling back to
deploy_files. See anti-patterns above.
Egress allowlist instructions for step 1:
Read the failing URL's hostname. It will be either
us.api.hostsmith.net,eu.api.hostsmith.net, or an S3 endpoint (copy verbatim from the failing URL).Infer the sandbox and give the user the exact configuration snippet:
Cursor (signal: cwd contains
.cursor/, orCURSOR_*env vars) - edit~/.cursor/sandbox.json(user scope) or<repo>/.cursor/sandbox.json(repo scope):{ "networkPolicy": { "allow": ["us.api.hostsmith.net", "eu.api.hostsmith.net"] } }Reload Cursor.
Claude Code (signal:
CLAUDE_CODE_*env vars, or~/.claude/settings present) - edit~/.claude/settings.json:{ "sandbox": { "enabled": true, "network": { "allowedDomains": ["us.api.hostsmith.net", "eu.api.hostsmith.net"] } } }If
deniedDomainslists a matching host, remove it first - deny takes precedence.Codex CLI (signal:
~/.codex/settings,CODEX_*env vars) - edit~/.codex/config.toml:[sandbox_workspace_write] network_access = trueCodex has no per-host allowlist at this layer - this enables network for workspace-write mode globally. Risk is bounded by the upload token in the URL.
Unknown sandbox - tell the user: allow outbound HTTPS (port 443) to
us.api.hostsmith.netandeu.api.hostsmith.net(and the failing S3 host if the URL points at S3) in whatever firewall/proxy they control. If a corporate HTTP proxy is in play, ensureCONNECTto those hostnames is permitted, or setNO_PROXYfor direct routing.
After the user confirms the change, retry the failed PUT. Tokens in the URL (
ut=...for partition-host URLs,X-Amz-Signaturefor S3 URLs) remain valid for 1 hour from issuance, so re-running the same URL within that window works without re-callingdeploy_create_upload.
| Name | Required | Description | Default |
|---|---|---|---|
| files | Yes | Files to upload. Most user requests are a single file. | |
| siteId | Yes | The site ID to deploy to (from `list_sites` or `create_site`). | |
| llm_model | Yes | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. | |
| partition | No | Data partition the site lives in. Omit to use the user's home partition. | |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only destructiveHint=true in annotations, the description carries the burden and exceeds it: it documents the full three-step protocol, the ETag capture requirement, single- vs multi-part handling, the 1-hour token expiry, overwrite behavior, and explicit anti-patterns. This is far more behavioral context than the annotations supply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and alternative are well front-loaded, but the definition runs extremely long, embedding multiple bash and Python templates, escalation ladders, and per-sandbox config snippets. Much of that material is genuinely useful yet disproportionately heavy for a tool description, diluting the selection-relevant signal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex multi-step tool with no output schema, the description supplies the response envelope shape, the finalize handoff, the prerequisite chain, and failure recovery. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter (fileName, fileSize, siteId, partition, conversation_id). The description shows how to construct the `files` array and what the response envelope contains, but adds no per-parameter syntax or constraints beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
First sentence states a specific verb and resource ('Start a direct-to-S3 upload for binary or large files') and immediately names the sibling it replaces (`deploy_files`) along with the condition that selects it. An agent can distinguish it from `deploy_files`/`deploy_finalize` 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use (binaries, >1 MB), when-not (trivial single small file), the zipping rule (>3 files or >1 MB), prerequisites (site must exist, call create_site first), and a required user-confirmation step for overwrite. Alternatives and exclusions are fully spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deploy_filesADestructiveInspect
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 get_site afterwards if you need the public URL to share. The site must already exist - call create_site first if you do not have a siteId. Deploying to a site that already has content overwrites it - confirm overwrite with the user first.
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_upload. If that path is blocked by sandbox/network, escalate to the user (ask them to enable egress, or offer manual upload of the presigned URL) - never reach for this tool as a workaround. Inlining bloats pages, breaks browser caching, and reships the bytes on every deploy.
| Name | Required | Description | Default |
|---|---|---|---|
| files | Yes | Files to deploy. For an HTML site, include an `index.html` as the entry point; otherwise any single file (PDF, image, JSON, etc.) works on its own. | |
| siteId | Yes | The site ID to deploy to (from `list_sites` or `create_site`). | |
| llm_model | Yes | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. | |
| partition | No | Data partition the site lives in. Omit to use the user's home partition. | |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=true; the description adds substantive context beyond that: it overwrites existing content and requires user confirmation, returns deployment version and status, points to get_site for the public URL, and explains the binary anti-pattern with rationale (bloat, broken caching, reshipping bytes).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and usage, then the anti-pattern block. Mostly earns its place, though the anti-pattern paragraph is long and somewhat repetitive in its justification, edging toward over-explanation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description states the return (deployment version and status) and the follow-up (get_site for the URL). Prerequisites, destructive behavior, and the sibling route are all covered, so an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the description carries little param burden. It only implicitly references siteId ('if you do not have a siteId') and adds no format or constraint detail for files/partition/conversation_id beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource+scope: 'Publish in-memory file contents to a Hostsmith site without writing to disk.' The 'in-memory'/'without writing to disk' qualifier distinguishes it from siblings like deploy_create_upload, so an agent can route correctly without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('just generated content... user wants it live'), a prerequisite ('site must already exist - call create_site first'), an overwrite-confirmation rule, and a clearly-named alternative for the binary case (deploy_create_upload). Names the when-nots and the alternative, which is the top of the scale.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deploy_finalizeADestructiveInspect
Commit a deploy started with deploy_create_upload. Pass the versionId from the start response and a completions array containing the agent-collected ETags for each multi-part file (single-part uploads - those whose start response had an empty uploadId - do not need a completion entry). Returns the live site URL on success. The site must belong to the authenticated user; bearer-token auth is re-validated server-side, so holding presigned URLs alone does not let an unrelated caller finalize.
| Name | Required | Description | Default |
|---|---|---|---|
| siteId | Yes | The site ID being deployed to (must match the start call). | |
| llm_model | Yes | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. | |
| partition | No | Data partition the site lives in. Omit to use the user's home partition. | |
| versionId | Yes | The `versionId` returned by `deploy_create_upload`. | |
| completions | No | Completions for multi-part uploads. Omit or pass an empty array if every file was single-part. | |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag destructiveHint=true; the description adds real behavioral context on top: the site must belong to the authenticated user, bearer-token auth is re-validated server-side, and holding presigned URLs is insufficient to finalize. It also discloses the return value (live site URL). Does not cover idempotency or partial-failure behavior, hence a 4 rather than 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, no padding, and the prerequisite call is front-loaded before the parameter detail. Slightly dense in the completions sentence but every clause carries load-bearing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a terminal mutation step with no output schema, the description covers the prerequisite call, the conditional parameter shape, the auth/ownership constraint, and the success return value. It is nearly complete; only failure and retry semantics are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning: it explains that versionId comes from the start response and that the completions array exists only for multi-part uploads, with the empty-uploadId exemption for single-part files. This clarifies the cross-call data flow the schema cannot express on its own.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Commit a deploy') plus the resource and the exact sibling that must precede it ('deploy_create_upload'). An agent can distinguish this from deploy_files or create_site 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear triggering context: it must follow deploy_create_upload and consume that call's versionId. It also states the conditional rule that single-part uploads (empty uploadId) need no completion entry. It stops short of naming an alternative tool or describing failure/recovery paths, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_accountARead-onlyInspect
Get the user's account: organization details (orgId, orgName), the calling user's home partition under user.homePartition, current subscription plan with its limits (max sites, max domains, storage, bandwidth), and current usage counts. Use to check how much headroom the user has before creating new sites or to confirm plan-tier features. Usage is summed across all partitions.
| Name | Required | Description | Default |
|---|---|---|---|
| llm_model | Yes | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. | |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds real behavioral context beyond that: it discloses exactly what is returned and the non-obvious aggregation rule 'Usage is summed across all partitions,' which prevents an agent from misreading per-partition numbers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both load-bearing: the first front-loads the returned payload, the second front-loads the use case. No filler, no restatement of the tool name, and the aggregation caveat is placed immediately after the data inventory it qualifies.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 description carries the burden of describing return values — and it does, listing org identity, home partition, plan limits (sites, domains, storage, bandwidth), and usage counts. For a zero-argument read tool with annotations covering safety, nothing an agent needs is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and both parameters (`llm_model`, `conversation_id`) are thoroughly documented in the schema itself, including the analytics-only purpose and the conversation_id chaining rule. The description adds nothing about parameters, so the baseline 3 applies; the tool exposes no business parameters to explain.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb-plus-resource ('Get the user's account') followed by an enumeration of the returned data: org details (`orgId`, `orgName`), `user.homePartition`, subscription plan limits, and usage counts. This clearly separates it from the site/domain/deploy siblings, which operate on resources rather than account metadata.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to reach for it: 'to check how much headroom the user has before creating new sites or to confirm plan-tier features.' It gives concrete intent without naming an alternative tool or a when-not-to-use condition, so it stops just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_siteARead-onlyInspect
Get full details of a specific Hostsmith site by ID, including its public URL (https://<subdomain>.<domain>), current deployment status, and configuration. Use after list_sites to inspect a single site, or after deploy_files / deploy_finalize to confirm the site is live and grab the URL to share with the user. Defaults to the user's home partition; pass partition explicitly when the site lives in a different one (visible in list_sites output).
| Name | Required | Description | Default |
|---|---|---|---|
| siteId | Yes | The site ID returned by `list_sites` or `create_site`. | |
| llm_model | Yes | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. | |
| partition | No | Data partition the site lives in (visible in list_sites output). Omit to use the user's home partition. | |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds real behavioral context beyond that: the shape of the URL returned, that deployment status is included, and that partition defaults to the user's home partition. It stops short of describing pagination or freshness/error behavior, but for a read tool this is solid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, all front-loaded: purpose first, then the two workflow triggers, then the partition caveat. No filler and no repetition of schema-level detail that would waste the reader's attention.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 description must convey return content, and it does (public URL, deployment status, configuration). Combined with the fully documented 4-parameter schema and readOnlyHint, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description's note about partition defaulting to the home partition and being visible in list_sites largely restates the schema's own wording, and it says nothing about siteId, llm_model, or conversation_id, which the schema already documents thoroughly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get full details of a specific Hostsmith site by ID') and enumerates what is returned: public URL, deployment status, and configuration. It explicitly names the sibling it follows (list_sites) and can be told apart from create_site/delete_site without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use conditions tied to concrete workflows: after list_sites to inspect one site, or after deploy_files/deploy_finalize to confirm the site is live and obtain the URL. It also states when to override the partition parameter and where that value comes from.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_domainsARead-onlyInspect
List domains the user can host sites under. Returns shared hosting domains (e.g. hostsmith.link, available to everyone) and custom domains owned by the user's organization. Use this to pick a domain value before calling create_site. By default queries all partitions and merges; pass partition or shared to narrow.
| Name | Required | Description | Default |
|---|---|---|---|
| shared | No | Filter by domain type: true for shared only, false for custom only. Omit for both. | |
| llm_model | Yes | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. | |
| partition | No | Filter by data partition. Omit to query all partitions. | |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint already declares a safe read. The description adds meaningful behavior beyond that: it discloses the default (queries all partitions and merges results) and how the narrowing parameters change that, which is not derivable from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with purpose, then the return contents, then usage and narrowing. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so by naming both domain categories and giving a concrete example. Enough context to call it correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description clears that bar by explaining the default merge-across-partitions behavior and the effect of `partition`/`shared`, adding default-value semantics the schema doesn't state.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List domains the user can host sites under') and immediately specifies the contents: shared hosting domains plus organization-owned custom domains. It also distinguishes its role from siblings by naming create_site as the downstream consumer of the returned domain value.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames the use case: 'Use this to pick a `domain` value before calling `create_site`.' It also gives narrowing guidance for `partition`/`shared`, but stops short of stating when NOT to use this tool or any explicit alternative for other domain-related needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sitesARead-onlyInspect
List Hostsmith sites in the user's account. Returns each site's siteId, subdomain, domain, and current status - feed siteId into get_site, deploy_files, deploy_create_upload, or delete_site. This is the source of truth for "does the user already have a site at FQDN X" - call it before any create/deploy/delete to resolve the user's site reference. By default queries all data partitions and merges the results; pass partition: "us" or "eu" to limit the query.
| Name | Required | Description | Default |
|---|---|---|---|
| llm_model | Yes | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. | |
| partition | No | Filter by data partition. Omit to query all partitions. | |
| conversation_id | No | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read, so the bar is lower. The description adds behavior beyond the annotations: it discloses the returned field set and the default cross-partition query-and-merge semantics. It stops short of describing pagination or result-size limits, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the verb+resource, then returns, then routing guidance, then the partition nuance. No sentence is redundant with another, and the most decision-relevant information (what it returns and when to call it) comes early.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the returned fields, and with readOnlyHint covering safety and 100% schema coverage on parameters, there is little left unstated. An agent has what it needs to resolve a site reference and route the siteId into a sibling tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the llm_model and conversation_id parameters are fully documented in the schema and the baseline is 3. The description adds meaning beyond the schema for `partition`: it clarifies that the default is to query all partitions and merge the results, whereas the schema only says 'omit to query all partitions'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (Hostsmith sites) scoped to the user's account, and enumerates the exact fields returned (siteId, subdomain, domain, status). It also names the downstream siblings that consume siteId (get_site, deploy_files, deploy_create_upload, delete_site), so an agent can distinguish it from any other listing tool without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly prescribes when to call it: 'call it before any create/deploy/delete to resolve the user's site reference', and frames it as 'the source of truth for does the user already have a site at FQDN X'. That is a clear precondition tying it to the create_site/deploy_*/delete_site siblings rather than leaving usage to inference.
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.
9 tool updates
- First observed
create_site - First observed
delete_site - First observed
deploy_create_upload - First observed
deploy_files - First observed
deploy_finalize - First observed
get_account - First observed
get_site - First observed
list_domains - First observed
list_sites
Publisher details
- Operator
- ops42 OU
- Operator website
- https://hostsmith.net
- Vendor relationship
- First-party
- Documentation
- https://hostsmith.net/docs/mcp/
- Trust center
- Not available
- Restrictions
- Free limits apply. Some features behind paid plans: https://hostsmith.net/#pricing
Related MCP Connectors
Publish a single HTML file as a live HTTPS site in seconds. Versioned deploys, no delete tool.
Deploy static websites, landing pages, and prototypes instantly. Free, no account needed.
EU web hosting for sites built in chat: publish, own domains, mail, a Postgres database, Node apps.
Host a static website from a zip: $1 USDC/month via x402 on Base, or card/PromptPay link.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceOne-call static page/site deploys for AI agents — POST HTML, a files map, or a zip and get back a live unguessable URL. Remote endpoint at https://ship.page/mcp, free tier needs no account or API key.MIT
- AlicenseAqualityFmaintenanceAgent-native hosting: your agent deploys any folder to a live URL in one command — no account, no dashboard, no CAPTCHA — and hands the human a link plus a plain-language summary. Full deploy lifecycle as MCP tools (deploy, verify, logs, inspect, rollback), production approval human-only; static sites and full Node.js apps, open source (Apache-2.0).13Apache 2.0
- AlicenseAqualityCmaintenanceInstant web hosting for AI agents. Publish a live site in one call, no account needed.5MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to self-host static websites by creating projects, editing files, previewing drafts, and publishing versioned releases with custom domains and a web dashboard.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.