Skip to main content
Glama

Server Details

Send a live, private link to a client from Claude. Updates in place, viewers by email.

Ownership verified
Status
Healthy
Uptime
98.0% over 48 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
snaphost-ai/snaphost
GitHub Stars
0
Server Listing
SnapHost
ChatGPT
–
Claude
–

TDQS

A3.6/5.0

Scored across 60 tools

Disambiguation3/5

Most tools target distinct resources, but several adjacent clusters overlap: visibility vs allowlist vs access requests, link status vs expiry vs share-link recreation, and publish/update/upload flows. The very detailed descriptions cross-reference each other and usually resolve the choice, but with 60 tools an agent is still likely to hesitate or misselect.

Naming Consistency4/5

Names are overwhelmingly snake_case with predictable verb_noun patterns such as list_sites, create_folder, delete_site, and set_link_expiry. Minor deviations like add_to_allowlist/remove_from_allowlist and a few less regular compounds keep it from perfect consistency.

Tool Count1/5

60 tools is far beyond a well-scoped surface and falls into the rubric's extreme-mismatch range. While the platform is broad, many tools are niche configuration operations that could be consolidated or grouped.

Completeness4/5

The set covers a wide lifecycle: publishing, updating, deleting, folders, workspaces, custom domains, sharing controls, versions, data collections, records, webhooks, brand kits, and recipes. Some gaps remain, such as reading or deleting KV data and direct collection creation/update, but core workflows are broadly supported.

Available Tools

60 tools
add_custom_domainAdd custom domainA
Idempotent
Inspect

Use when the user wants the site on their own domain. Points a custom domain (e.g. "deck.acme.com") at SnapHost. With site_id the host serves exactly that one site (Pro). With target: "workspace" (a Pro workspace) the host becomes a full alias of the workspace’s own subdomain: one DNS record, and every site and folder path resolves on it, share.acme.com/, share.acme.com//, share.acme.com/~/. Returns the DNS records the owner must add at their registrar; the domain serves once those records resolve and it is verified.

NameRequiredDescriptionDefault
hostYesThe domain or subdomain, e.g. deck.acme.com
targetNo"site" (default) binds one site; "workspace" aliases the whole Pro workspace
site_idNoThe site to bind the domain to. On target "workspace" it is optional and names the ROOT site served at the bare / of the domain.
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.5/5.0
Behavior4/5

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

With annotations already covering read-only, destructive, and idempotent traits, the description adds useful behavioral context: it returns the DNS records the owner must add, and the domain only serves after records resolve and verification completes. It also details workspace alias resolution behavior. There is no contradiction with 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.

Conciseness5/5

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

The description is front-loaded with the user-facing trigger and is dense with relevant behavioral detail. The workspace alias examples are useful rather than filler, and the closing statement about DNS records and verification earns its place.

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 multi-mode tool with no output schema, the description covers return value (DNS records to add), activation condition (records resolve and are verified), and the workspace alias details. It does not specify the exact shape of the DNS records or failure/error cases, but the schema plus description is largely sufficient.

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?

Though schema coverage is 100%, the description adds meaning beyond the schema. It explains that site_id binds one specific Pro site, that target: 'workspace' makes the host a full alias of the workspace subdomain, and that site_id on target workspace names the root site at the bare path. This significantly clarifies the target and site_id parameters.

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 opens with an explicit use case ('Use when the user wants the site on their own domain') and clearly identifies the resource and action: pointing a custom domain at SnapHost. It also distinguishes the site-binding and workspace-alias modes, which separates it from sibling tools like remove_custom_domain, verify_custom_domain, and list_custom_domains.

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?

It states a clear triggering condition and explains the two target modes (site vs workspace), giving the agent enough context to select the tool. However, it never explicitly says when not to use it or points to alternatives like verify_custom_domain for checking status or remove_custom_domain for teardown, so exclusions are missing.

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

add_external_originsAdd external originsA
Idempotent
Inspect

Trust one or more external https origins for a site, adding to (never replacing) its CSP allowlist. This is the follow-up when publish_site / update_site reports origins the security policy will block and the owner confirms trusting them. Only pass origins the owner has explicitly approved. Each entry must be a bare https://host[:port] with no path. This is a paid capability. To remove or replace origins, use set_render_options instead. Returns the full updated render options.

NameRequiredDescriptionDefault
originsYesThe https origins to add to the trusted list (e.g. ["https://cdnjs.cloudflare.com"])
site_idYesThe id of the site to configure
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already mark this as non-read-only, idempotent, and non-destructive. The description adds valuable context: the operation is additive ('never replacing'), returns the full updated render options, is a paid capability, and imposes the bare https format. This goes beyond the annotations without contradicting them.

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?

Dense but efficient: every sentence contributes distinct value—additive behavior, trigger scenario, approval requirement, format constraint, cost, alternative tool, and return value. Front-loaded with the core purpose.

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 3-parameter tool with no output schema, the description covers invocation context, constraints, side effects, the alternative tool, and the return value. Nothing essential is missing for an agent to select and call it correctly.

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 100% and schema descriptions are already decent. The description adds meaningful semantics not in the schema: each origin must be a bare https://host[:port] with no path, and origins are added rather than replacing the existing allowlist. This enhances the agent's ability to construct valid parameters.

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: 'Trust one or more external https origins for a site' while clarifying that it adds to, never replaces, the CSP allowlist. Clearly differentiates the tool's additive scope from replacement via set_render_options.

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 when to use it: as the follow-up when publish_site or update_site reports blocked origins and the owner confirms approval. Also names set_render_options as the alternative for removing or replacing origins, and warns to only pass owner-approved origins.

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

add_to_allowlistAdd to allowlistA
Idempotent
Inspect

Use when the user wants to let one more person in, invite a client, or share it with the team. Adds email and/or domain entries to a private site's allowlist WITHOUT removing anyone already on it; use this to share with more people. Entries already present are left untouched (the call is idempotent), and everyone previously allowed keeps their access. To replace the entire list instead, use set_allowlist; to take someone off, use remove_from_allowlist. Pro only; on a plan without it the refusal names the plan, and where one lapsed, how to get it back. The site must be allowlist (private); make it private first with set_visibility if it is public. Each newly-added email receives an invite email; the optional message is included in it as a personal note from the owner.

NameRequiredDescriptionDefault
messageNoOptional personal note included in the invite email sent to each newly-added email entry (max 1000 characters). Not persisted; domain entries get no email.
site_idYesThe id of the site to update
allowlistYesEntries to add; appended to the existing allowlist, duplicates ignored
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare idempotentHint=true, destructiveHint=false, and readOnlyHint=false. The description reinforces idempotency and adds critical side effects: invite emails sent to new entries, the optional message inclusion, and the Pro-plan refusal behavior. It also clarifies that domain entries receive no email. This goes beyond annotations and does not contradict them.

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?

The description is long but every sentence carries information: use cases, behavior, alternatives, prerequisites, plan requirements, and side effects. It front-loads the core purpose before diving into details. No filler or repetition; it is dense but well-structured.

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?

The tool is a write operation with multiple nuances: idempotency, invite emails, plan gating, and a private-site prerequisite. The description covers all of them, plus alternatives. No output schema exists, but for a mutation tool this is acceptable; the description provides everything an agent needs to decide whether and how to call it correctly.

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 100%, so baseline is 3. The description adds meaning beyond the schema: it explains that `message` is a personal note in the invite email (schema only says optional), that `allowlist` entries are appended and duplicates ignored, and that domain entries don't get emails. It also clarifies the `site_id` must point to a private site. This is useful semantic enrichment.

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: 'Adds email and/or domain entries to a private site's allowlist.' It distinguishes itself from set_allowlist (replace) and remove_from_allowlist (take off), so an agent can tell them apart. The phrase 'WITHOUT removing anyone already on it' makes the scoped behavior unambiguous.

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?

Gives explicit triggers ('when the user wants to let one more person in, invite a client, or share it with the team') and names the exact alternatives: 'use `set_allowlist`' for replacement and 'use `remove_from_allowlist`' to remove. It also states the prerequisite (site must be private) and the Pro-plan restriction, leaving no ambiguity about when to invoke.

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

apply_data_templateApply data templateA
Idempotent
Inspect

Use when the user wants a contact form, waitlist, RSVP, guestbook, counter, or leaderboard on the page. Adds a ready-made data feature to a site: provisions the recipe's collection (access mode + schema) and returns the HTML block to insert into the page (then publish with update_site). Needs Pro; scoped to a site you own. See list_data_recipes for ids.

NameRequiredDescriptionDefault
site_idYesThe site to add the feature to
recipe_idYesA recipe id from list_data_recipes (e.g. "contact-form")
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already cover read-only/destructive/idempotent traits, and the description adds valuable context beyond them: it provisions a collection and returns an HTML block for insertion. Stating the 'Needs Pro' and ownership constraints also clarifies authorization conditions beyond annotation data.

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?

Three dense sentences, with the trigger front-loaded and no filler. Each sentence adds distinct information: when to use, what it does, and constraints/dependencies. There is no redundancy with the schema.

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?

The description covers when to use, what action occurs, what is returned, the prerequisite (Pro), ownership scope, where to get recipe ids, and the follow-up publish step. Since there is no output schema, the explicit note about returning the HTML block is especially important for an agent knowing the result.

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?

The input schema has 100% description coverage, so the schema already documents all three parameters. The description adds minimal parameter-level meaning beyond pointing to list_data_recipes for recipe_id and the site-ownership constraint for site_id, but it doesn't carry significant extra semantic weight beyond the 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?

The description opens with an explicit trigger ('Use when the user wants a contact form, waitlist, RSVP, guestbook, counter, or leaderboard') and then states the outcome: provisions a recipe's collection and returns an HTML block. This clearly identifies the verb (apply data template), the resource (data recipe), and how it differs from generic site-editing tools.

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?

It gives an explicit when-to-use trigger and useful constraints ('Needs Pro; scoped to a site you own'). It also points to list_data_recipes for recipe ids and mentions a follow-up step (publish with update_site), providing enough context. However, it doesn't explicitly describe when not to use it or contrast it with alternatives like set_site_data or define_collection_schema.

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

approve_access_requestApprove access requestA
Idempotent
Inspect

Approve a pending access request: the requester is added to the site's allowlist and can then view it. Use list_access_requests to find the request_id. Admin or owner only; rejected requests (forbidden, plan_limit, not_found) make no change.

NameRequiredDescriptionDefault
site_idYesThe id of the site the request belongs to
request_idYesThe id of the access request to approve
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=false, idempotentHint=true, and destructiveHint=false. The description adds meaningful behavioral context: the requester is added to the allowlist, the effect is view access, and rejected requests (forbidden, plan_limit, not_found) make no change. This goes beyond the annotations and clarifies the tool's side effects and no-op cases. It doesn't fully describe all possible failure modes or permission errors, but it is strong 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.

Conciseness5/5

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

The description is two sentences, front-loaded with the core action and effect, then the discovery workflow and permission/edge-case notes. Every sentence earns its place; there is no fluff or repetition of schema content.

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 mutation tool with no output schema, the description covers the action, effect, prerequisite discovery step, permission restriction, and no-op cases. It doesn't describe the response format or what happens on success beyond the allowlist addition, but the annotations cover idempotency and non-destructiveness. The main gap is the lack of explicit error/response details, but the description is otherwise complete enough for an agent to invoke it correctly.

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 100%, so the schema already documents all three parameters. The description adds value by explaining the purpose of request_id (find it via list_access_requests) and the workspace_id semantics are already well-covered in the schema. The description doesn't repeat parameter details, but it does connect request_id to a concrete discovery workflow, which is useful.

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 ('approve'), a specific resource ('pending access request'), and the concrete effect ('requester is added to the site's allowlist and can then view it'). It also distinguishes itself from the sibling deny_access_request by focusing on approval. This is a clear, non-tautological definition.

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?

The description explicitly tells the agent when to use this tool: to approve a pending access request, and how to find the required request_id via list_access_requests. It also states the admin/owner-only restriction and notes that rejected requests make no change, which helps the agent decide whether to call this tool or handle the request differently.

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

clear_view_passwordClear view passwordA
DestructiveIdempotent
Inspect

Remove a site's view password so viewers with the link can open it without a password. Needs edit access to the site (its creator or an editor grant, in a role that can edit); rejected requests (forbidden, not_found) leave the stored password unchanged.

NameRequiredDescriptionDefault
site_idYesThe id of the site whose view password to clear
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already mark the tool as destructive and idempotent. The description adds useful unannotated behavior: edit access is requiredaine, and rejected requests ('forbidden', 'not_found') leave the stored password unchanged. This clarifies failure semantics beyond 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.

Conciseness5/5

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

The description is two sentences with the action and outcome front-loaded, followed by access requirements and error behavior. Every clause earns its place and there is no redundancy or 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?

For a two-parameter mutation with no output schema and good annotation coverage, the description supplies the operation's intent, preconditions, and failure mode. 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.

Parameters3/5

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

The input schema already documents both parameters at 100% coverage, including detailed workspace_id behavior. The description adds no parameter-specific meaning beyond what the schema provides, so the baseline 3 is appropriate.

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 opens with a specific verb ('Remove') and resource ('a site's view password') and states the result ('viewers with the link can open it without a password'). This clearly differentiates it from set_view_password and other site mutation tools.

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?

The description gives clear context for when to use the tool—removing a view password—and a necessary precondition (edit access). It doesn't name an alternative or state 'when not to use', so it misses the most explicit guidance level but is still unambiguous.

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

create_bundle_uploadCreate bundle uploadAInspect

Start a bundle upload for bytes that html or files cannot carry: a site with images, fonts or other binaries (a built React site), or a single binary file (a PDF, a .docx, .pptx or .xlsx, an image, a video, an audio), sent as it is under its filename, given here once. Text (a page and its CSS or JS, a Markdown, CSV, Mermaid, notebook or code file) goes as html or files instead and needs no upload. Returns an upload_id to send the bytes against, then publish_site or update_site with that upload_id instead of html/files/zipBase64. Sending the bytes needs a shell that makes the SnapHost tool calls itself. A shell here is a coding agent in a terminal (Claude Code, Cursor, Codex CLI); a chat app's code sandbox does not count, since its output would have to be retyped into the call. Without a shell, do not open an upload and do not build base64. Ask the person to drop the file (downloaded from the chat if it lives there; a .zip of the built folder with index.html at its root for an app) on the dashboard, after switching the dashboard to the workspace you name: the drive (https://app.snaphost.ai/) for a new site, or the site's own page (https://app.snaphost.ai/sites/<site_id>, "Upload a new version") to keep an existing link; the site_id comes from list_sites or the publish result. Then list_sites shows it (a new site is the newest, named after the file) and every sharing tool applies. With a shell, two ways to send it. Send it with upload_bundle_part, one numbered part per call: a tool call on this connection, so it works even with no network of its own. Or PUT the .zip to upload_url (HTTP PUT, Content-Type application/zip; above max_part_bytes, to upload_url/parts/0, /parts/1, ... in order), which is fewer, larger requests when your shell can reach that host; storage_url is the same PUT straight to the storage host, one request with no body limit, up to the bundle cap. Your tool calls and your shell do not share a network: a PUT that is refused (a 403 naming the host, or a connection that never leaves) says nothing about upload_bundle_part, so switch to it rather than asking the owner to change any network settings. The upload is single-use and expires; request a new one if it lapses. It belongs to the workspace this call acts in: pass the same workspace_id to every upload_bundle_part and to the publish.

NameRequiredDescriptionDefault
filenameNoThe single file's own name with its extension (`report.pdf`, `talk.mp4`), when the upload is one non-zip file rather than a .zip. The upload then remembers it: the parts and the publish need not repeat it. Omit for a .zip.
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only declare it is a non-readonly, non-destructive, non-idempotent write; the description adds the operational facts an agent actually needs: the upload is single-use and expires, it is workspace-scoped and the same `workspace_id` must be reused across parts and the publish, the return value is an `upload_id` consumed by publish_site/update_site, and that tool calls and the shell do not share a network. No statement conflicts with the annotations (single-use/expiring is consistent with idempotentHint=false).

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

Conciseness3/5

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

Purpose is front-loaded and most sentences carry load-bearing operational detail, but the body is a dense wall of run-on sentences mixing selection criteria, HTTP mechanics, dashboard URLs, and human-fallback instructions. The no-shell dashboard procedure (with full URLs and "Upload a new version" quoting) is long for a section that mostly tells the agent to stop and ask a person, and it dilutes the core call-and-then-publish path.

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 two-parameter tool with no output schema, this covers everything an agent needs: what content qualifies, what gets returned, which tools consume the result, both byte-transfer mechanisms with their limits (`max_part_bytes`, bundle cap), the expiry/single-use lifecycle, and the workspace-consistency requirement. Nothing material is left to inference for a correct invocation.

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 100%, so the baseline is 3, but the description adds real meaning: `filename` is "given here once" because the upload remembers it, so parts and publish need not repeat it, and `workspace_id` must be echoed on every upload_bundle_part and the publish call. That cross-tool propagation rule is not derivable from the schema alone.

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 concrete verb+resource ("Start a bundle upload") and immediately bounds scope to bytes that `html` or `files` cannot carry, enumerating the qualifying cases (built site with binaries, single PDF/docx/pptx/xlsx/image/video/audio) and the disqualifying ones (text, CSS/JS, Markdown, CSV, code). It also names the sibling handoffs (upload_bundle_part, publish_site, update_site) so an agent can place it in the workflow 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.

Usage Guidelines5/5

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

Explicit when-to-use (binary content), when-not-to-use (anything textual belongs in `html`/`files`; without a shell, do not open an upload and do not build base64), and concrete alternatives with selection criteria: upload_bundle_part for no-network shells, PUT to `upload_url` for fewer larger requests, `storage_url` when a single unbounded request is needed. It even tells the agent what failure signals (403 naming the host, a request that never leaves) do NOT mean, and to fall back rather than renegotiate network settings.

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

create_folderCreate folderAInspect

Create a folder to organize sites. space is the drive: personal (default) or shared (Pro workspaces only). Pass parent_id (from list_folders) to nest it; omit for a top-level folder. A nested folder must share its parent’s drive. A shared folder is open to the whole workspace by default; pass open_to_team: false to start it restricted, addressable at its slug but visible only to the creator and members they invite (refused for the marketing folder and any folder inside it, which are open to the workspace). Returns the new folder, with the slug derived from its name; in the website workspace the landing-page folder must end up slugged marketing, so check the returned slug.

NameRequiredDescriptionDefault
nameYesThe folder name
spaceNo`personal` (default) or `shared` for the workspace’s shared drive
parent_idNoParent folder id from list_folders to nest under; omit for top level
open_to_teamNoShared drive only: false starts the folder restricted (invite-only) instead of open to everyone in the workspace
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.3/5.0
Behavior4/5

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

Annotations are all false, so the description carries the burden of behavioral disclosure. It discloses default behavior for shared folders (open to team), the effect of open_to_team: false (restricted), the constraint that a nested folder must share its parent's drive, and the slug derivation from name, including the marketing folder requirement. No contradictions with annotations. Strong behavioral context.

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?

The description is several sentences long but each sentence carries information: purpose, space semantics, nesting, open_to_team behavior, and return slug. It is front-loaded with the main purpose and flows logically through parameters and constraints. No filler; though slightly long, it's efficient and well-organized.

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?

There is no output schema, so the description must explain the return value; it does: 'Returns the new folder, with the slug derived from its name; in the website workspace the landing-page folder must end up slugged `marketing`, so check the returned slug.' It also covers key creation constraints (nested folder drive match, open_to_team default and restriction). It doesn't mention error cases or permission requirements, but for a creation tool with these details, it is largely complete.

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 100%, so baseline is 3. The description adds meaning beyond the schema: it explains the 'space' values (personal/shared, Pro workspaces only), indicates parent_id should come from list_folders, and details the behavior of open_to_team (including the marketing folder exception). It also hints at workspace_id behavior indirectly through 'the website workspace' example. This adds genuine value.

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 clearly states the tool's purpose: 'Create a folder to organize sites.' This is a specific verb plus resource, and given the sibling set (delete_folder, rename_folder, move_folder, set_folder_slug), it distinguishes itself as the creation operation. No ambiguity about what it does.

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?

The description provides concrete usage context: it explains how to create top-level versus nested folders via parent_id (from list_folders), notes that shared drive is 'Pro workspaces only', and clarifies the open_to_team behavior. It also mentions a specific use case in the website workspace (slug must be 'marketing'). However, it does not explicitly state when not to use this tool or name alternatives, though the sibling listing implies them. Adequate guidance.

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

define_collection_schemaDefine collection schemaA
Idempotent
Inspect

Define (or clear, with schema=null) a JSON Schema on a collection in a site's data store. A schema validates every appended record server-side, turning the collection into a typed backend. Defining a schema requires Pro. Scoped to a site you own.

NameRequiredDescriptionDefault
schemaYesA JSON Schema object to enforce, or null to make the collection schemaless
site_idYesThe site that owns the collection
collectionYesThe collection name
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare idempotentHint=true, destructiveHint=false, readOnlyHint=false. The description adds value by explaining the mutation semantics ('Define or clear'), the server-side validation effect, and the Pro requirement. It does not contradict annotations and provides behavioral details beyond them.

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?

Three sentences with no redundancy. The core action and the null option are front-loaded, followed by the Pro requirement and scope. Every sentence carries information, and the structure is clear.

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?

Given the simple parameter set and no output schema, the description covers the essential behavior, scope, and prerequisite. It does not detail error handling or return values, but these are less critical here. The description is complete enough for an agent to call the tool correctly.

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 coverage is 100%, so parameters are fully documented. The description adds minor context by explaining that schema=null clears the schema (already in schema description) and that a schema validates records. It does not significantly enhance parameter understanding beyond the 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?

The description states a clear verb-resource pair ('Define (or clear) a JSON Schema on a collection') and scopes it to 'a site's data store'. It also clarifies the effect (server-side validation, typed backend) and distinguishes itself from sibling tools like delete_collection or set_collection_access by focusing on schema definition.

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?

The description gives actionable context: it mentions the Pro requirement and that it is scoped to a site you own. It implies when to use (when enforcing a schema on a collection) but does not explicitly name alternatives or when-not-to-use. The Pro caveat and ownership scope are helpful guardrails.

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

delete_collectionDelete collectionA
DestructiveIdempotent
Inspect

Delete an entire collection: every record in it plus its access-mode and schema settings. Irreversible. Scoped to a site you own.

NameRequiredDescriptionDefault
site_idYesThe site that owns the collection
collectionYesThe collection to delete
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false. The description adds useful behavioral context beyond that: irreversibility, site-ownership requirement, and the full set of things destroyed (records plus access-mode and schema settings).

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?

Three short sentences, front-loaded with the core action, and every sentence earns its place. No fluff, no repetition of schema details.

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 destructive, irreversible operation with no output schema, the description covers the essential facts: what is deleted, that it cannot be undone, and the ownership scope. It does not mention idempotent behavior or error cases, but those are not critical for a caller deciding whether to invoke it.

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 100%, so the schema already documents site_id, collection, and workspace_id. The description adds some meaning around collection-level scope and ownership, but not per-parameter detail beyond the 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 and resource: 'Delete an entire collection,' and spells out exactly what that includes: records, access-mode settings, and schema settings. This clearly differentiates it from sibling tools like delete_site_record and delete_site.

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?

Clear contextual guidance: it is the tool for deleting a whole collection rather than a single record, and it is scoped to a site you own. It does not explicitly name alternatives or exclusions, but the scope is evident from the description.

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

delete_folderDelete folderA
DestructiveIdempotent
Inspect

Delete a folder. Its sites and any sub-folders are kept and moved up to the deleted folder’s parent (the drive root if it was top-level), a sub-folder taking the next free slug there, so no content is lost; each page's old workspace-host address forwards to its new one until another page takes it. Only someone who can manage the folder may delete it. In the website workspace the Marketing folder is never deleted; a folder inside it may be, and its pages keep serving one level up at shorter /lp addresses, so the result names every address that ended and every one that started.

NameRequiredDescriptionDefault
folder_idYesThe folder id to delete
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.1/5.0
Behavior5/5

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

Annotations only declare destructive/idempotent/readOnly hints; the description goes well beyond them. It discloses that no content is lost, that sub-folders move up and take the next free slug, that old addresses forward until reassigned, and that the response names every ended and started address — genuinely rare, decision-relevant detail for a destructive tool.

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

Conciseness3/5

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

The core consequence is front-loaded well, but the paragraph is dense and somewhat sprawling, and the address-tracking idea is stated twice ('old workspace-host address forwards to its new one' and 'names every address that ended and every one that started'). It is information-rich but not tight.

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 destructive, no-output-schema tool, the description covers preservation semantics, slug reassignment, address forwarding, permission requirements, and the workspace scoping needed to call it correctly. Nothing essential to correct invocation is missing.

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 coverage is 100%, with folder_id and workspace_id fully documented in the schema, including the multi-workspace requirement. The description adds no syntax or format detail about the parameters, so the baseline 3 applies where the schema does the heavy lifting.

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 up front ('Delete a folder') and immediately scopes it by explaining that contents survive and move to the parent. An agent can distinguish this from move_folder, rename_folder, set_folder_slug, and delete_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.

Usage Guidelines3/5

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

It provides a permission prerequisite ('Only someone who can manage the folder may delete it') and notes the Marketing-folder special case, which is useful usage context. However, it never says when to choose this over alternatives like move_folder or move_site_to_folder when the goal is reorganization rather than removal, so routing guidance is only implied.

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

delete_siteDelete siteA
DestructiveIdempotent
Inspect

Delete a site by id: marks it deleted, purges its content and version history, deletes the records and collections it holds (a waitlist or contact form included), makes the share link non-viewable and stops its old addresses forwarding. This cannot be undone and nothing can read any of it back afterwards, so read what matters first: list_site_collections for what it holds, then get_site_content and export_site_data. Not a way to fix a broken address: create_share_link puts a page back on its address without destroying any of this.

NameRequiredDescriptionDefault
site_idYesThe id of the site to delete
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, but the description goes well beyond them by naming what is destroyed (content, version history, records, collections, share-link viewability, address forwarding) and stressing irreversibility ('nothing can read any of it back afterwards'). That is precisely the extra context annotations cannot convey.

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?

Effects are front-loaded in the first sentence, guidance and the alternative follow in order of need, and no sentence is filler. The length is justified by an irreversible 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?

With no output schema and only two parameters, the description carries what matters: full blast radius, irreversibility, pre-deletion reads, and the correct tool for a superficially similar problem. Nothing an agent needs before calling a destructive delete is missing.

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?

With 2 parameters at 100% schema description coverage, the schema already fully documents site_id and the workspace_id scoping rules. The description adds only the phrase 'by id' and no additional syntax or format detail, so the baseline of 3 is appropriate.

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 opens with a specific verb+resource ('Delete a site by id') and immediately enumerates the concrete consequences (marks deleted, purges content and version history, removes records/collections, breaks share links and forwarding). An agent can distinguish this from sibling mutations like delete_collection, delete_folder, or rollback_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.

Usage Guidelines5/5

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

It gives explicit prerequisites ('read what matters first: list_site_collections ... then get_site_content and export_site_data') and an explicit when-NOT clause with a named alternative ('Not a way to fix a broken address: create_share_link ...'). This is exactly the when/when-not/alternative guidance the dimension asks for.

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

delete_site_recordDelete site recordA
DestructiveIdempotent
Inspect

Delete one record from a collection (moderation). Records are otherwise append-only and immutable. Scoped to a site you own.

NameRequiredDescriptionDefault
site_idYesThe site that owns the record
record_idYesThe id of the record to delete
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the description does not need to repeat that this is destructive. It adds valuable context beyond the annotations: records are normally append-only/immutable, this is a moderation exception, and deletion is scoped to a site the user owns.

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?

Two tightly written sentences with no filler. The core action comes first, followed by the moderation context and the ownership constraint, all in the most efficient order.

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 straightforward single-record deletion with a complete schema and rich annotations covering idempotence and destructiveness, the description provides the necessary behavioral framing. Nothing critical is missing for an agent to correctly invoke this tool.

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 100%, so the input schema fully documents site_id, record_id, and workspace_id. The description reinforces the ownership scoping tied to site_id, but it does not add materially new parameter meaning beyond what the schema already provides.

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: 'Delete one record from a collection (moderation).' The description clearly distinguishes this from deleting an entire collection or site, and the ownership qualifier further pins down the scope.

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?

The '(moderation)' framing and the statement that 'Records are otherwise append-only and immutable' give clear context for when this tool is appropriate as an exception. It does not explicitly name alternatives or say when not to use it, but the distinction from the sibling delete_collection and delete_site tools is strong enough.

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

delete_webhookDelete webhookA
DestructiveIdempotent
Inspect

Removes a webhook and everything queued for it; nothing is posted to it again. To stop a disabled webhook for good, or to replace an endpoint (register the new one first). Workspace owners and admins only.

NameRequiredDescriptionDefault
webhook_idYesThe id from list_webhooks
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so safety is covered. The description still adds value annotations cannot: it specifies what is destroyed (everything queued, no further posts) and the authorization requirement ('Workspace owners and admins only'). It does not cover reversibility or error/partial-failure behavior.

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?

Very short and front-loaded: destruction behavior first, then usage, then permissions. The middle sentence is an elliptical fragment, which slightly hurts readability but wastes no words.

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 destructive, no-output-schema tool, the description covers the essentials an agent needs: scope of deletion, irreversible effect on queued items, alternative ordering with register_webhook, and the permission gate. Only minor gaps (reversibility, failure modes) remain.

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 100%, so webhook_id and workspace_id are already fully documented, including the multi-workspace requirement. The description adds no parameter-level detail, so the baseline 3 applies.

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 ('Removes a webhook') and adds scope ('everything queued for it; nothing is posted to it again'), making it distinguishable from register_webhook/list_webhooks in the sibling set. No ambiguity about what the tool does.

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 concrete situations ('To stop a disabled webhook for good, or to replace an endpoint') and routes the agent to the correct sibling order ('register the new one first'). No explicit when-not-to-use, and the second sentence is a fragment rather than framed as guidance, but context is clear.

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

deny_access_requestDeny access requestA
DestructiveIdempotent
Inspect

Deny a pending access request: the requester is not added to the allowlist and stays unable to view the site. Use list_access_requests to find the request_id. Admin or owner only; rejected requests (forbidden, plan_limit, not_found) make no change.

NameRequiredDescriptionDefault
site_idYesThe id of the site the request belongs to
request_idYesThe id of the access request to deny
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already indicate destructiveHint=true and idempotentHint=true. The description adds the concrete consequence (not added to allowlist, remains unable to view site) and reiterates idempotency with 'rejected requests make no change'. It also adds the permission requirement (admin or owner). This adds value beyond annotations without contradiction.

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?

Two sentences, front-loaded with the core purpose and immediate consequence, then the necessary context (how to get the ID, permission, idempotency). Every sentence serves a distinct function with no redundancy.

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?

Given no output schema, the description covers the outcome (requester not added, stays unable to view), the idempotent behavior for rejected requests, and the required permissions. It also tells how to find the required request_id. For a simple denial action, this is fully sufficient.

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 covers 100% of parameters, so baseline is 3. The description adds a specific hint: 'Use list_access_requests to find the request_id', clarifying how to populate that parameter. It doesn't elaborate on site_id or workspace_id, but those are well-documented in the schema. This extra guidance lifts it to 4.

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 clearly states the action: 'Deny a pending access request' and its consequence ('requester is not added to the allowlist and stays unable to view the site'). It distinguishes this from sibling approve_access_request by explicitly saying what happens instead of approval. The verb-resource pair is specific and unambiguous.

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?

The description tells the agent to use list_access_requests to find the request_id, providing a direct workflow. It also states the admin/owner-only restriction and that rejected requests make no change, which guides when to call and what to expect. This is explicit and actionable.

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

export_site_dataExport site dataA
Read-onlyIdempotent
Inspect

Export the records in a collection, up to 5000 (the store holds far more; a bigger collection comes back cut off, and the result says so with truncated: true). It is also the only call that reports a total: count is how many came back, so while truncated is false it is the whole collection. query_site_records reads at most 200 records and cannot page past them, so it can never total a collection. Use for backup or analysis. Scoped to a site you own.

NameRequiredDescriptionDefault
site_idYesThe site that owns the collection
collectionYesThe collection to export
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context beyond the annotations: the 5000-record cap, the truncation behavior with `truncated: true`, the meaning of `count`, and the scoping constraint ('Scoped to a site you own'). It does not describe the exact response shape, but with no output schema and the annotations covering safety, the description carries a substantial share of the behavioral burden and does it well.

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 description is compact and front-loaded: the core action and limit come first, then the truncation/count semantics, then the sibling comparison, then the use case and scope. Every sentence earns its place, and there is no repetition of schema or annotation content.

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 read-only export tool with 3 parameters, 100% schema coverage, and annotations covering safety, the description is complete. It explains the limit, the truncation signal, the count semantics, the alternative tool, the intended use case, and the ownership scope. An agent has everything it needs to decide when to call this tool and what to expect from the result.

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 100%, so the schema already documents all three parameters. The description adds meaning by explaining the relationship between `count` and `truncated`, and by clarifying the workspace_id semantics ('Required on a write when the connection reaches more than one workspace'). It doesn't add per-parameter syntax details, but the schema already covers the basics, and the description's extra context about the result fields is genuinely useful.

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 ('Export'), a resource ('the records in a collection'), and a concrete limit (5000). It also distinguishes itself from query_site_records by naming the sibling and the key difference (200-record cap, no paging). An agent can tell exactly what this tool does and how it differs from the closest alternative.

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?

The description explicitly says when to use this tool ('Use for backup or analysis') and contrasts it with query_site_records, which 'reads at most 200 records and cannot page past them, so it can never total a collection.' This gives the agent a clear decision rule: choose export_site_data when a full collection or a total count is needed, and query_site_records when only a small read is needed.

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

get_brand_kitGet brand kitA
Read-onlyIdempotent
Inspect

The active workspace's brand kit, if it has one. Call it BEFORE building or restyling any page, report, deck or dashboard, with the workspace_id you were asked to publish in. A workspace kit (kind: "workspace") carries the palette by role, the heading and body fonts and where they come from, the logo and mark URLs, the language and locale, the tone and the phrases never to use, the rules a page follows, and tokens_css: paste it as the first rule of the page's own and set every colour and font through var(--brand-*). The website workspace kit (kind: "website") is SnapHost's own: --sh-* tokens injected on delivery, the voice, the plan prices and the landing-page steps. Either kit, and a workspace with no kit, may carry guidelines: the brand guidelines as a page or PDF URL the owner set; read it before building and follow it where the kit is silent, and let the kit win where they disagree. Fix every brand_warnings entry a publish returns before reporting done; warnings never block. A workspace with no kit returns has_brand_kit: false and how to create one.

NameRequiredDescriptionDefault
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, yet the description adds substantial context beyond them: the two kit kinds and their token namespaces, the `guidelines` fallback with precedence rules ('let the kit win where they disagree'), the non-blocking nature of `brand_warnings`, and the no-kit return shape. This is rich behavioral disclosure for a read 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?

Purpose and the 'call before building' directive are front-loaded, and the dense sentences each carry distinct information about return shape and precedence. It is long, but the length is earned by an undocumented return structure; slight trimming would still help readability.

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?

With no output schema, the description carries the full burden of explaining return values, and it does so thoroughly: both kit kinds, their fields, tokens_css usage, guidelines, warnings, and the empty case. An agent has everything needed to call it and act on the result.

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?

Only one optional parameter and schema description coverage is 100%, so the schema already fully documents workspace_id (including personal-space fallback). The description adds a mild contextual hint ('the workspace_id you were asked to publish in') but no syntax or format detail beyond the schema, which is the baseline-3 case.

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 ('the active workspace's brand kit') and immediately differentiates from the write sibling by describing the read shape, including the empty case (`has_brand_kit: false`). An agent can tell this apart from set_brand_kit/set_brand_guidelines 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 Guidelines5/5

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

Explicitly instructs when to call it ('BEFORE building or restyling any page, report, deck or dashboard') and with which argument ('the workspace_id you were asked to publish in'). It also gives downstream actions: read guidelines where the kit is silent, fix every `brand_warnings` entry before reporting done. Nothing is left to inference.

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

get_design_guideGet design guideA
Read-onlyIdempotent
Inspect

How an A+ report, presentation or dashboard is built: the brief questions to ask, the build-and-review procedure, the rules for rhythm, type, numbers, tables, charts, navigation, responsive layout, accessibility, locale and the SnapHost viewer, and the rubric to score the page against in writing before calling it done. Call it BEFORE building any of the three, with the kind and the traits the brief needs: printable (a downloadable PDF that keeps the look), live (numbers that update on their own), kiosk (an office screen). Then compose from the document recipes (list_page_recipes), publish with document_kind and printable, and fix every design_warnings entry.

NameRequiredDescriptionDefault
kindYesWhat is being built
traitsNoWhat the brief asks of it, if anything
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/idempotentHint/non-destructive/closed-world, so the safety profile is covered structurally. The description adds genuine behavioral context beyond that: this is a precondition step in a build sequence, and its output includes a rubric and design_warnings that must be resolved. It stops short of saying anything about the size or format of the returned guide.

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 tool's identity before the workflow and parameter notes, and every sentence carries actionable content. The topic enumeration in the first sentence is long and run-on, but it maps to the guide's actual scope rather than being 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?

With no output schema, the description carries the burden and mostly does: it says what the guide covers, when to call it, how to parameterize it, and how to act on the result. Only the concrete shape of the returned document (sections, ordering) is left unstated, which is minor for a reference-retrieval tool.

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 100%, so the baseline is 3, but the description goes further by defining each trait enum in the agent's terms — printable (downloadable PDF that keeps the look), live (self-updating numbers), kiosk (an office screen) — which the enum list alone does not convey. workspace_id semantics live only in the schema, keeping this from a 5.

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?

Names a specific verb and resource (get the design guide) and unpacks exactly what the artifact contains — brief questions, build-and-review procedure, rules for rhythm/type/charts/accessibility/locale, and the scoring rubric. It is clearly distinguishable from siblings like get_page_recipe (document recipes) and get_brand_kit, which it routes to instead of duplicating.

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?

Gives an explicit timing rule ('Call it BEFORE building any of the three'), states which inputs to supply, and then names the downstream siblings and actions (list_page_recipes, publish with document_kind/printable, fix design_warnings). An agent knows when to call this and what to do after, without inference.

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

get_page_recipeGet page recipeA
Read-onlyIdempotent
Inspect

The HTML of one page recipe by id (see list_page_recipes), with links already absolute for this site. Paste it into the page, keep the token references, and replace the copy with what this page is about.

NameRequiredDescriptionDefault
recipe_idYesA recipe id from list_page_recipes (e.g. "hero")
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already cover the safety profile (readOnlyHint=true, idempotentHint=true, destructiveHint=false), so the bar is lower. The description adds one genuinely useful behavioral detail — links are returned already absolute for the site and token references must be preserved — but says nothing about failure modes for an invalid id or permissions.

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?

What the tool returns and the id cross-reference are front-loaded in the first clause; the second sentence gives practical post-retrieval handling. It is short and mostly earns its space, with only mild bleed into usage guidance rather than tool specification.

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?

With no output schema, the description usefully characterizes the payload (HTML with absolute links, token placeholders to keep). Combined with the fully documented schema and clean annotations, an agent has enough to call it correctly; only error/edge behavior is unaddressed.

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 100%: recipe_id's source (list_page_recipes) and workspace_id's full semantics are documented in the schema itself. The description only restates 'by id' and adds no format or constraint detail, so the baseline 3 applies.

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 description names the resource ('one page recipe'), the lookup key ('by id'), and what is returned ('The HTML'), and it cross-references list_page_recipes so the agent knows where ids come from. It is distinguishable from the sibling list_page_recipes, though it relies on a noun phrase rather than an explicit verb.

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?

It points to list_page_recipes for obtaining a recipe_id and sketches the follow-on workflow ('paste it into the page... replace the copy'), which implies when to use it. It never states when NOT to use it or contrasts it with other retrieval siblings such as get_site_content or get_design_guide.

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

get_siteGet siteB
Read-onlyIdempotent
Inspect

Get a single site's status, visibility, current version metadata, detected content kind, its old addresses that still forward to it (old_addresses), SPA fallback, allowed external origins, whether its page offers the uploaded file for download (original_included) and whether that can be changed (original_withholdable), link expiry (link_expires_at, ISO or null) with its derived link_status, whether a view password is set (has_view_password), view count, and the allowlist it is currently shared with (who can view a private site) by id.

NameRequiredDescriptionDefault
site_idYesThe id of the site to fetch
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered without the description. The description adds no behavioral context beyond that — no permissions, error conditions, or visibility scoping rules — its content is entirely return-field enumeration.

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

Conciseness3/5

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

The purpose is front-loaded in the first clause, which is good, but everything after it is a single sprawling sentence packing a dozen returned fields with parenthetical asides. It would read far better as a short purpose line plus a structured list of returned fields.

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?

With no output schema, the description carries the full burden of telling the agent what comes back, and it does so thoroughly — field names, types (ISO or null), and derived values like link_status are all disclosed. It falls short only on error/permission behavior and on not distinguishing itself from get_site_content.

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 100%, so both site_id and workspace_id are already documented, including the multi-workspace write rule and personal-space default. The description adds no parameter-level meaning beyond the schema, making the baseline 3 correct.

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 opening verb+resource is unambiguous ("Get a single site's status, visibility, current version metadata..."), which cleanly separates it from list_sites and from content-oriented siblings like get_site_content. It never names a sibling explicitly, so an agent must infer the boundary rather than being told it, which keeps this short of a 5.

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, when-not-to-use, or alternative-naming guidance anywhere in the text. The schema hints at list_workspaces for the workspace_id value, but the description itself offers no routing help between get_site, get_site_content, and list_sites.

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

get_site_contentGet site contentA
Read-onlyIdempotent
Inspect

Fetch a site's current entry document by id so you can edit it and push the result back with update_site: the read half of the round-trip get_site and list_sites omit (they return only metadata, never the body). Returns the live document inline as UTF-8 (encoding: "utf-8") for HTML/Markdown/text/SVG/JSON, or base64 (encoding: "base64") for binary content like PDFs and images, alongside content_type, content_kind, and content_hash. A site whose content_kind is not html was rendered from a file (Markdown, a notebook, a Word, PowerPoint or Excel file, a CSV, a PDF, an image, a video, an audio, a Mermaid diagram, a text file or a React component): what comes back is its rendered page, not the file, and the result says so in note. To change such a site, send the source again to update_site: a text source (Markdown, CSV, Mermaid, notebook, code, component) as files, a binary one as an upload_id (which needs a shell that makes the SnapHost tool calls itself; without a shell, update_site says where the person drops it); sending edited HTML turns it into an HTML site. Pass original true to fetch the uploaded file itself when the page offers it for download (get_site reports original_included); refused when it does not.

NameRequiredDescriptionDefault
site_idYesThe id of the site whose content to fetch
originalNoFetch the uploaded file the page carries for download (a .pptx, an image, a CSV) instead of the rendered page
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnly, idempotent, non-destructive, but the description adds substantial context beyond them: the inline vs base64 encoding split by content type, the presence of `content_type`, `content_kind`, and `content_hash`, and the important caveat that a non-html `content_kind` returns a rendered page rather than the source file, surfaced in `note`. It also discloses the refusal behavior for `original`.

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?

The purpose and the sibling distinction are front-loaded in the first clause. The remainder is dense with long parenthetical lists (Markdown, notebook, Word, PowerPoint, Excel...) that border on exhaustive but each conveys a distinct behavioral fact. Slightly heavy, but nearly every sentence earns its place.

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 description carries the full burden of explaining return values, and it does: encoding, content_type, content_kind, content_hash, note, and the rendered-vs-source distinction. An agent has everything needed to call it and interpret the response, including the follow-up path via update_site.

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 100%, so baseline is 3, but the description meaningfully enriches `original` by explaining what it returns (the uploaded .pptx/image/CSV rather than the rendered page), its precondition, and its failure mode. The `site_id` and `workspace_id` parameters are left to their schema descriptions, which is reasonable given full coverage.

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 ('Fetch a site's current entry document by id') and immediately distinguishes itself from get_site and list_sites, which 'return only metadata, never the body'. An agent can select this tool without ambiguity among the three read siblings.

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 frames the tool as 'the read half of the round-trip' and directs the agent to update_site to push changes back, with guidance on how to send text vs binary sources. It also gates the `original` parameter on a condition (the page offering the file for download, signalled by get_site's `original_included`) and states it is refused otherwise. Lacks only explicit when-not-to-call guidance for the plain-page case, which is implicitly covered.

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

list_access_requestsList access requestsA
Read-onlyIdempotent
Inspect

List pending access requests for an allowlist site: people who asked to view it and are waiting for approval. Each entry has an id, the requester_email, an optional message, its status, and when it was created. Approve one with approve_access_request (adds them to the allowlist) or reject it with deny_access_request. Admin or owner only; requires a plan with access requests enabled (plan_limit otherwise).

NameRequiredDescriptionDefault
site_idYesThe id of the site whose access requests to list
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already cover the read-only, non-destructive, idempotent nature of the operation. The description adds valuable behavioral context beyond those annotations, including the auth requirement, the plan limitation, and the fact that entries represent pending approval rather than full allowlist membership.

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?

Three sentences with no filler: the first states the core purpose, the second summarizes the return fields, and the third covers auth, plan limitation, and the relevant sibling tools. Every sentence earns its place.

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, the description is complete: it explains what is listed, what each entry contains, who may call it, and what plan requirement applies. The absence of an output schema is partially mitigated by the explicit field list, and no pagination or sorting details are strictly necessary for a correct call.

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 100%, so the schema already fully documents both site_id and workspace_id. The description doesn't add parameter-specific detail beyond defining the resource scope ('for an allowlist site'), which is fine given the schema carries the burden.

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: 'List pending access requests for an allowlist site', and clarifies exactly what these are ('people who asked to view it and are waiting for approval'). It goes on to name the approve/reject sibling tools, which makes its purpose unambiguous against the large sibling list.

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?

The description gives clear context for when this tool applies: pending requests awaiting approval, with explicit prerequisites ('Admin or owner only; requires a plan with access requests enabled'). It names approve_access_request and deny_access_request as follow-up actions, though it does not explicitly contrast this with list_allowlist for already-approved members.

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

list_allowlistList allowlistA
Read-onlyIdempotent
Inspect

Show who a site is currently shared with: its visibility and the email and/or domain entries on its allowlist. On a public site the allowlist is not consulted (anyone with the link can view); entries from before it went public are still listed, and set_allowlist with an empty array clears them. Call this before adding or removing people so you can see the existing list rather than overwriting it.

NameRequiredDescriptionDefault
site_idYesThe id of the site to inspect
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnlyHint and idempotentHint annotations, the description reveals meaningful behavior: stale allowlist entries persist on public sites and can be cleared via set_allowlist with an empty array. This adds practical, non-obvious operational context directly relevant to using the tool correctly.

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?

Every sentence earns its place: purpose is front-loaded, the public-site caveat is explained, and the actionable call-before instruction is included. No filler or redundancy.

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 simple read-only list tool with no output schema, the description covers what is returned, how public visibility interacts with the allowlist, and when to call it. Combined with the annotations, an agent has everything needed to invoke it correctly.

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 coverage is 100%, so the schema already fully documents site_id and workspace_id. The description adds conceptual context about what is being inspected but does not need to repeat parameter-level details.

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 clear, specific action: 'Show who a site is currently shared with' including both visibility and allowlist entries. It distinguishes itself from sibling write tools like set_allowlist, add_to_allowlist, and remove_from_allowlist by framing this as the read-only inspection counterpart.

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 instructs the agent to 'Call this before adding or removing people' to avoid overwriting the existing list. It also covers an important nuance—public sites ignore the allowlist—which helps the agent decide when this tool's results are relevant.

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

list_custom_domainsList custom domainsA
Read-onlyIdempotent
Inspect

List custom domains with their verification status: pass site_id for the domains bound to one site, or omit it for the workspace-bound domains (the whole-workspace aliases).

NameRequiredDescriptionDefault
site_idNoThe site whose domains to list
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful scope context (site-bound vs workspace-bound) and confirms the returned information (verification status), but does not go further into behavior like pagination or result shape. This is a solid but not exceptional addition beyond annotations.

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?

A single sentence front-loads the action and then delivers the key conditional in a compact, readable way. There is no fluff or repetition; every clause earns its place.

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?

With no output schema, the description still conveys the general return concept ('domains with their verification status') and covers the two invocation modes. It does not detail exact response fields or pagination, but for a straightforward read-only list tool the description is sufficiently complete for an agent to call it correctly.

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 100%, so the baseline is 3. The description adds meaningful nuance beyond the schema by explaining the consequence of omitting site_id (return workspace-bound domains), which is not present in the site_id schema. This elevates it above baseline.

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 uses a specific verb ('List') and resource ('custom domains'), and adds a clarifying qualifier ('with their verification status') that differentiates this read tool from siblings like add_custom_domain, verify_custom_domain, and remove_custom_domain. It also clearly identifies the two scopes (site-bound vs workspace-bound), leaving no ambiguity about what the tool does.

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?

The description gives clear context for choosing between the two invocation modes: pass site_id for site-bound domains, omit it for workspace-bound aliases. It does not explicitly name alternatives or state when-not-to-use, but the parameter-level guidance is actionable and unambiguous for the main usage scenarios.

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

list_data_recipesList data recipesA
Read-onlyIdempotent
Inspect

List ready-made data features (contact form, waitlist, waitlist with a public signup count, RSVP, guestbook, scoreboard, clock-in, leaderboard). Use with apply_data_template to add one to a site end-to-end. accessMode is what the recipe asks for; on the marketing site every collection is created append_only whatever it says, so a recipe that reads its own collection shows nothing there until the owner asks for public_read by name. No site needed.

NameRequiredDescriptionDefault
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.3/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description goes further and reveals a non-obvious behavioral quirk: the accessMode field is largely ignored on the marketing site, where collections are created append_only, and recipes that read their own collection show nothing until public_read is explicitly requested by name. This is exactly the kind of context that prevents a mistaken agent from assuming the listed mode is honored. It also notes that no site context is required.

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?

The description is a single, information-dense paragraph. It front-loads the purpose and usage, then adds the accessMode nuance and the 'No site needed' note. Every sentence contributes meaning; there is no filler. It is slightly long, but the complexity of the behavioral quirk justifies the length. It could arguably be split into a second sentence for readability, but it remains efficient.

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 operation with no output schema, the description provides the essential behavioral context (accessMode nuance) and the usage pairing with apply_data_template. It does not specify the return format, but for a list tool the examples given are enough for an agent to infer what the list contains. The annotations cover safety, so nothing critical is missing. A brief note on the structure of the returned list would have made it a 5, but it is sufficiently complete.

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?

The schema documents the only parameter, workspace_id, with 100% coverage, including its optionality and the rules about which workspace it applies to. The description adds nothing about this parameter, which is acceptable because the schema already fully explains it. Baseline 3 applies when schema does the heavy lifting.

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 opens with a specific verb ('List') and a concrete resource ('ready-made data features'), then enumerates examples (contact form, waitlist, etc.) that make the scope unmistakable. It also names the companion tool (apply_data_template) that this one feeds into, which distinguishes it from the many other list_* siblings.

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?

The description explicitly instructs 'Use with apply_data_template to add one to a site end-to-end,' giving a clear when-to-use context. It also states 'No site needed,' which clarifies the prerequisite. It does not explicitly name alternatives or exclusions, but the pairing with apply_data_template is sufficient guidance for an agent deciding whether to call this tool.

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

list_foldersList foldersA
Read-onlyIdempotent
Inspect

List the folders in the workspace (the person's personal space, or a workspace they belong to via workspace_id) with their ids, names, parent folder, and drive (space: personal or shared). Use a folder's folder_id with move_site_to_folder or publish_site to file a site into it; a site's own folder_id (from get_site / list_sites) reports where it currently lives. In the website workspace, the Shared-drive folder slugged marketing is the one served at snaphost.ai/lp.

NameRequiredDescriptionDefault
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare the tool read-only, idempotent, and non-destructive, so the bar for additional behavioral context is lower. The description adds useful context about workspace scope and the special role of the `marketing` folder, which goes beyond the structured annotations.

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 description is three sentences with no filler. The main purpose is front-loaded, followed by practical usage guidance and a useful special-case note about the marketing folder.

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?

With only one optional parameter and robust annotations, the description covers the essential return fields, how to interpret them, and how to use them with related tools. The special note about the website workspace adds important context that is not available from the schema or annotations.

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 100%, so the optional `workspace_id` parameter is already well documented. The description echoes the workspace concept but does not add significant new meaning beyond what the schema provides.

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 clearly states the tool lists folders in the workspace, including their ids, names, parent folder, and drive space. It uses a specific verb and resource, and the mention of `space: 'personal' or 'shared'` helps distinguish it from site-listing tools.

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?

The description explains how to use the returned `folder_id` with `move_site_to_folder` or `publish_site`, and contrasts this with a site's own `folder_id` from `get_site`/`list_sites`. It gives clear context but does not explicitly name when not to use this tool versus a sibling.

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

list_page_recipesList page recipesB
Read-onlyIdempotent
Inspect

List the ready-made documents and parts to build from. For a report, presentation or dashboard (every workspace): report-shell, key-figures, data-table, chart-figure, callout, presentation-shell, dashboard-shell, tile and status-bar, styled through the --brand-* tokens of get_brand_kit with neutral fallbacks, their copy in [brackets] to replace. Read get_design_guide first. In the website workspace only, for a landing page: a page shell (start every page from it), hero with call to action, feature grid, comparison table, FAQ, testimonial band, waitlist form. Each is self-contained HTML styled through the --sh-* brand tokens with fallbacks, with absolute links, so it drops into any page. Fetch one with get_page_recipe and edit its copy; the shell and the testimonial ship with placeholder copy (title, description, sample quote) that the brand check reports until replaced. The waitlist recipe saves through the SnapHost data SDK, and publishing or updating the page provisions its waitlist collection append-only from the form itself, and keeps it so in this workspace even if the page reads it back or set_collection_access asks otherwise (a public page reading it would publish the signups; its reads are refused, the SDK call rejects). Count signups in a second collection whose rows say only that a signup happened; the "signup-count" data recipe writes exactly that, so opening it publishes a number and nothing about anyone. apply_data_template is optional and only adds the field schema. A landing page lives by the website kit’s frame rules (no viewport units, no fixed/sticky positioning, no height animation, sized images): that frame grows to fit the page, while a document recipe is served in the ordinary viewer, which fills the window. The blog-post recipe is not a section but a whole document, and follows the opposite rules: the blog renders it inline through a fixed tag allowlist, so it carries no styling (which would be stripped) and its links are root-relative.

NameRequiredDescriptionDefault
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds genuine context about the listed artifacts (brand-token styling, bracket placeholders, waitlist collection provisioning), but says nothing about this tool's own behavior: no return shape, no ordering, no note on how workspace scoping affects the result.

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

Conciseness2/5

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

The purpose is front-loaded, but the body sprawls into tangential operational detail about waitlist collections, the data SDK, apply_data_template, and blog rendering that belongs to other tools. Sentences are long, multi-clause, and repeatedly change subject, so the agent must sift the listing tool's job out of unrelated prose.

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?

With no output schema, the description should describe returns; it enumerates the recipe names, which partially compensates. But it omits structure, ordering, and whether workspace_id filters the result, and it spends most of its length on behavior that applies to downstream tools rather than to this listing call.

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 100% for the single workspace_id parameter, so the schema already carries its meaning and the baseline is 3. The description never mentions workspace_id, though it does differentiate recipe sets by workspace type, which indirectly signals why the parameter matters.

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 opening sentence states a specific verb and resource: 'List the ready-made documents and parts to build from,' and the body names the sibling get_page_recipe for fetching a single recipe. It is clearly distinguishable from get_page_recipe and list_data_recipes, though the wall of downstream detail buries the core purpose and never states what the list actually contains (names, ids, categories).

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?

It gives explicit ordering and next steps: 'Read get_design_guide first' and 'Fetch one with get_page_recipe and edit its copy.' It also scopes which recipes apply to which workspace (report/presentation/dashboard vs. the website workspace). It stops short of any when-not guidance or exclusions.

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

list_site_collectionsList site collectionsA
Read-onlyIdempotent
Inspect

List a site's data collections with their schema, access mode, and paused state. Scoped to a site you own.

NameRequiredDescriptionDefault
site_idYesThe site whose collections to list
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already establish readOnly, idempotent, and non-destructive behavior. The description adds useful context beyond those by stating the returned information (schema, access mode, paused state) and the ownership constraint. It does not cover pagination or error behavior, but the description does not contradict 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.

Conciseness5/5

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

One concise sentence with no filler. The verb, resource, output details, and scope are all front-loaded, making the description immediately scannable.

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 low-complexity, read-only listing tool with rich annotations and a fully documented schema, the description covers the essential selection and invocation information. A bit more about the return shape would help since there is no output schema, but the stated returned fields are sufficient for an agent to understand what the tool produces.

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 100%, so the schema already documents site_id and workspace_id. The description adds a small nuance by saying the action is scoped to a site the user owns, but otherwise does not materially enhance parameter understanding beyond the 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?

The description states a specific verb ('List'), a specific resource ('a site's data collections'), and the key output dimensions (schema, access mode, paused state). The scope line 'Scoped to a site you own' further distinguishes it from site-level list tools like list_sites.

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?

The description gives clear context: it is for listing collections on a site the user owns. It does not explicitly name alternatives or when-not-to-use conditions, but the resource scoping makes the intended use reasonably unambiguous.

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

list_sitesList sitesA
Read-onlyIdempotent
Inspect

List the non-deleted sites in one workspace (the one named by workspace_id, the personal space when omitted; sites live in exactly one workspace) with their ids, slugs, titles, statuses, visibilities (public or allowlist, i.e. private), share URLs, detected content kind (content_kind), SPA fallback (spa_fallback), auto-refresh on update (auto_refresh), allowed external origins (external_origins), link expiry (link_expires_at, ISO or null) with its derived link_status (no_expiry, active, expiring_soon, or expired), and whether a view password is set (has_view_password). Narrow the results with the optional visibility, status, link_status, and expires_within_days filters; all combine with AND.

NameRequiredDescriptionDefault
statusNoOnly sites in this lifecycle state (`published` is live)
visibilityNoOnly sites with this visibility (`allowlist` is private/restricted)
link_statusNoOnly sites whose share link is in this expiry state
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).
expires_within_daysNoOnly sites whose link expires within this many days and has not lapsed

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare this is a safe, idempotent, read-only, closed-world operation. The description adds the non-deleted scoping constraint and the workspace-confinement rule ('sites live in exactly one workspace') which is not obvious from annotations. Doesn't cover pagination or result caps, but that's a modest gap given the safety profile is already covered.

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

Conciseness2/5

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

A single dense sentence crams the full field list, the field semantics parenthetical, and the filter semantics into one block. It is front-loaded correctly but overly packed – the enumerated return fields arguably belong in an output schema and make this hard to parse.

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 filter-list tool with full schema coverage and an existing annotations safety profile, the description covers workspace scoping, filter combination, and field inventory. No output schema exists, so enumerating return fields adds value, though pagination behavior remains unstated.

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 coverage is 100%, so all five parameters are documented including enums for status, visibility, link_status. The description adds the AND-combination rule for filters and the workspace default behavior, but doesn't add syntax beyond what the schema provides. Baseline 3 for high-coverage 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?

Specific verb+resource with explicit scope: lists sites in a single named workspace, non-deleted only. Distinguishes from get_site (singular) and list_workspaces by stating exactly which entities are returned and the workspace scoping rule.

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?

Clear context: workspace_id is optional, defaults to personal space. Filter semantics are explained ('all combine with AND'). However, no explicit routing to alternatives among the many sibling list_* tools (list_workspaces, list_site_collections), leaving some inference to the agent.

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

list_versionsList versionsA
Read-onlyIdempotent
Inspect

List a site's published versions newest-first with their content hash, content kind, entry path, size, file count, and timestamp.

NameRequiredDescriptionDefault
site_idYesThe id of the site whose versions to list
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the description doesn't need to repeat safety. It adds useful behavioral detail: the sort order (newest-first) and the list of returned fields, which helps an agent understand the output. It does not contradict annotations, and it adds value beyond them, but it doesn't disclose potential pagination or limits. Given the annotations cover safety, a 4 is appropriate.

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 description is a single, front-loaded sentence that states the action, the resource, the ordering, and the returned fields without any fluff. Every word contributes.

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 two well-documented parameters and no output schema, the description provides all necessary information: what it lists, the ordering, and the fields returned. It does not need to explain return format since there is no output schema. The only minor gap is the lack of mention of pagination, but that is not critical for a version list. Overall it is complete.

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?

Both parameters are fully described in the schema (100% coverage), including the meaning of site_id and workspace_id. The description adds no additional parameter-specific semantics beyond what the schema provides, so the baseline 3 applies.

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 clearly states the tool lists a site's published versions, specifying the sort order (newest-first) and the exact fields returned (content hash, content kind, entry path, size, file count, timestamp). This is a specific verb+resource, and while there are many list tools among siblings, 'versions' is a distinct resource, so it is unambiguous.

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?

The description implies usage when you need to inspect a site's published versions, but it does not explicitly mention when not to use it or point to alternatives. However, since no sibling tool lists versions, the context is clear enough, but the lack of explicit alternatives or exclusions keeps it at a 3.

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

list_webhooksList webhooksA
Read-onlyIdempotent
Inspect

List the webhooks registered in this workspace: address, events, whether each is active or was disabled after repeated failed deliveries, and how many deliveries in a row have failed. Secrets are never listed. Workspace owners and admins only.

NameRequiredDescriptionDefault
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.3/5.0
Behavior5/5

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

Annotations already declare the safe read-only profile, and the description adds valuable context beyond them: secrets are never returned (data-exposure behavior), the disabled-after-failed-deliveries state and consecutive-failure count are surfaced, and access is restricted to owners/admins (auth requirement). These are exactly the behavioral disclosures the annotations do not carry.

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?

A single sentence that front-loads the verb and resource, then the returned fields, then the two key constraints (no secrets, admins only). Zero filler; every clause earns its place.

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 carries the return-value burden and does so by enumerating the fields and states returned. Combined with the annotation safety profile and permission gating, an agent has everything needed to call and interpret this read tool correctly.

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?

Only one optional parameter (workspace_id) and its schema description is fully detailed at 100% coverage, so the schema already carries the semantics. The description's 'in this workspace' phrasing mildly reinforces scope but adds no new parameter detail, so the baseline 3 applies.

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 (List), resource (webhooks), scope (this workspace), and even enumerates the returned fields (address, events, active/disabled state, failure count). An agent can immediately tell this apart from register_webhook and delete_webhook 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 Guidelines3/5

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

Usage is implied by the listing verb and the 'Workspace owners and admins only' audience constraint, which does gate use. However, there is no explicit when-to-use guidance or reference to alternatives such as register_webhook/delete_webhook or when to prefer a filtered query.

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

list_workspacesList workspacesA
Read-onlyIdempotent
Inspect

List the workspaces this connection can act in. A connection belongs to the person who authorized it and reaches their personal space plus every workspace they are a member of, whichever workspace was open when they connected. Each entry has a workspace_id (pass it as workspace_id to any other tool to act there), a handle, the display name, a kind (personal or team), and the caller’s role (owner, admin, member, or viewer). Omit workspace_id on a read to act in the person's personal space; a write without it is refused when more than one workspace is listed. A missing workspace means the person is not a member of it, or the result carries a note saying the connection is an older, single-workspace one and how to widen it.

NameRequiredDescriptionDefault
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already mark it read-only, idempotent, and non-destructive; the description adds meaningful behavioral context beyond those: connection ownership, workspace scope, personal vs team kind, caller role, the older single-workspace note, and the refusal rule for writes without workspace_id. No contradictions with annotations.

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?

The description is dense and somewhat long, but every sentence earns its place: scope, entry fields, usage guidance, and edge-case note. The main verb and resource are front-loaded; the later sentences provide necessary detail rather than filler.

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 one-parameter, read-only tool with no output schema, the description is complete: it covers what the result entries contain, how to use the result, what omitting the parameter means, and the special older-connection note. An agent has enough to call this correctly and decide when to pass workspace_id onward.

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 coverage is 100% and the schema already explains workspace_id thoroughly, including when it is required and what happens when omitted. The description reinforces this read/write nuance but does not materially add new parameter semantics beyond what the schema provides.

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?

First sentence names the specific operation ('List the workspaces') and the resource ('this connection can act in'). It then defines exactly what each entry containsholistic and distinguishes workspace listing from sibling site/folder/allowlist tools without needing to open 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 Guidelines4/5

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

The description clearly says the returned workspace_id should be passed to other tools trickles and explains when to omit it on reads and why writes fail without it on multi-workspace connections. It doesn't name an alternative tool to choose instead, but none is truly needed for this foundational listing operation.

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

move_folderMove folderA
Idempotent
Inspect

Re-parent a folder. A shared-drive folder whose slug was taken where it landed gets the next free one, which the result names, and comes back under it. Every page inside gets a new workspace-host address and its old one forwards there until another page takes it. In the website workspace, a folder moved into the Marketing folder puts every public, published page in it live on snaphost.ai/lp at once (and opens the folder and its pages to the whole workspace as editors, whatever they were), and one moved out or within it ends or changes their addresses; the result names every address that ended (move it back to restore them, then set the slug back if it changed) and every one that started; the Marketing folder itself is never moved. Pass its folder_id and the destination parent_id (both from list_folders); omit parent_id to move it to the drive root. A folder cannot be moved into itself or its own descendant. Returns the updated folder.

NameRequiredDescriptionDefault
spaceNoDrive to use when moving to the root (no parent_id); defaults to the folder’s own
folder_idYesThe folder to move
parent_idNoDestination parent folder id; omit to move to the drive root
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.3/5.0
Behavior5/5

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

Annotations only say it is a non-destructive, idempotent write; the description goes far beyond, disclosing slug re-generation on collision, page address re-hosting with old-address forwarding, and the Marketing-folder side effect (pages published live, folder opened to the whole workspace as editors, addresses ending). It even explains recovery ('move it back to restore them'), which is exactly the behavioral depth an agent needs for a mutation.

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

Conciseness3/5

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

The scoping sentence is front-loaded, but the body is one very long, dense paragraph bundling slug, forwarding, and Marketing side effects, which is hard to parse and buries the actionable constraints. Much of it earns its place, but the structure costs readability.

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 mutation tool with no output schema, it covers return ('the updated folder'), required workspace context on writes, destination semantics, and irreversible-looking side effects with their remedy. 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.

Parameters3/5

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

Schema coverage is 100%, so the schema already documents space, folder_id, parent_id, and workspace_id. The description adds only the provenance hint (both ids from list_folders) and restates the parent_id-omission rule already in the schema, so baseline 3 applies.

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 opening verb+resource phrase 'Re-parent a folder' is precise and immediately distinguishes this from rename_folder, delete_folder, and move_site_to_folder. An agent can tell what it does 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.

Usage Guidelines4/5

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

It states concrete preconditions and edge cases: pass folder_id and parent_id both from list_folders, omit parent_id to move to the drive root, and it cannot be moved into itself or a descendant. It never explicitly routes to a sibling alternative, so it stops 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.

move_site_to_folderMove site to folderA
Idempotent
Inspect

File a site into a folder, keeping its share link. Pass the destination folder_id from list_folders; omit folder_id to move the site back to the drive root. Moving a site between a personal and a shared (workspace-wide) folder reconciles who can see it. Only the site’s creator can move it. The site’s old workspace-host address forwards to its new one until another page takes it. If the address it would land on is held by another site (across drives) or still forwards to one, the site gets the next free numbered slug and the result says so. Returns the updated site read model with its new folder_id. In the website workspace the Shared-drive marketing folder is served publicly at snaphost.ai/lp/ (a site filed one folder deeper at /lp//), so filing a site there makes it a landing page and moving a landing page CHANGES its /lp address; the result reports the new one.

NameRequiredDescriptionDefault
spaceNoDrive to use when moving to the root (no folder_id): `personal` (default) or `shared` (Pro workspaces only). Ignored when a folder_id is given.
site_idYesThe id of the site to file
folder_idNoThe destination folder id from list_folders. Omit to move the site to the drive root.
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.6/5.0
Behavior5/5

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

Well beyond the annotations (which only say non-destructive, idempotent, closed-world), the description discloses the creator-only permission gate, visibility reconciliation across personal/shared folders, forwarding of the old address, automatic numbered-slug fallback on address collisions, and the public landing-page consequences. These are exactly the side effects an agent could not infer from structured fields.

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?

The core action and its scope are front-loaded in the first sentence, and each subsequent sentence carries non-redundant information. The final sentence is dense and slightly convoluted in its /lp/<folder>/<slug> aside, which costs some readability.

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?

With no output schema, the description compensates by stating what is returned (the updated site read model with new folder_id) and where the tool reports a slug reassignment or new /lp address. Permissions, collisions, and side effects are all covered for a mutation tool.

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 100%, so the baseline is 3, but the description adds real meaning about what folder targeting does — visibility reconciliation between drive types and the /lp/<slug> address implications of filing into the marketing folder. It does not mention the `space` or `workspace_id` parameters directly, so it only partially exceeds the 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?

"File a site into a folder, keeping its share link" gives a specific verb, resource, and a preserved-invariant, making it trivially distinguishable from move_folder, rename_folder, and set_site_slug. An agent can identify the operation from the first clause alone.

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?

Explicit conditions are given: pass a folder_id from list_folders, or omit it to return the site to the drive root, and "Only the site's creator can move it" rules out cases an agent cannot perform. No sibling tool is named as the wrong alternative (e.g. move_folder for folders), 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.

publish_sitePublish siteAInspect

Use when the user wants to put a page online, share this with a client or teammate, or get a link they can send. Publishes a document or bundle to SnapHost and returns its stable share URL. Provide exactly one of html (one document, as text), files (text files as {path, content}: a page with its CSS/JS/JSON/SVG, or one Markdown, CSV, Mermaid, notebook, code or .tsx/.jsx component file), zipBase64 (a bundle with binaries that fits the request body, an Office file, or a one-entry zip holding a PDF, image, video or audio) or upload_id from create_bundle_upload (large or binary bundles; a lone binary file with filename). html and files need no shell and no network of your own: the routes from a chat window. Each renders to a sandboxed site; an Office file shows as its page alone (no notes, hidden slides, sheets or comments) and downloads only with include_original; render_notices says what the page could not show. The content kind is detected on publish and returned as content_kind. Pass a slug to make the publish idempotent: later calls with the same slug update the same URL. Optionally set status (draft hides it until published) and an allowlist (Pro only). The result reports link_expires_at and has_view_password; manage them with set_link_expiry / set_view_password / clear_view_password. A new site lands in the publisher's own My drive, addressed on the workspace subdomain as /~/, unless folder_id (from list_folders) or space "shared" files it on the Shared drive, where it is addressed by its slug or folder path. visibility "public" opens it to anyone with the link (a landing page must be). Publish also scans the page for window.SNAPHOST data usage: a collection the page queries is set up as public_read, one it only appends to stays owner-only, and on the marketing site nothing is opened (the owner asks by name, only for records with no personal detail); the result says what was configured; relay it and confirm with the owner. The page is also scanned for external references (CDN scripts, font stylesheets, embeds) that the site's security policy will block: the result lists each blocked origin. Ask the owner whether to trust it (add_external_origins) or vendor the asset. Missing relative references are reported too; add the files and republish. Reports, decks, dashboards: pass document_kind.

NameRequiredDescriptionDefault
htmlNoA single self-contained HTML document, as text. The first choice for one page: it needs no encoding, no shell and no network of your own. At most 3.5 MB once JSON-escaped (a control character other than backspace, tab, newline, form feed and carriage return, `<`, `>`, `&` or any non-ASCII character counts 6 bytes, an emoji 12, and `"`, `\` and `/` 2, so non-ASCII text may count three times its size and markup-heavy text up to six): in practice about 3 MB of plain HTML, about 2 MB when tag-dense; the rest of the 4 MB request body is for the call itself. A bigger page: Trim it, split it across more than one site, give the person the text to save as a file and hand it over, or send it through create_bundle_upload, which needs a shell that makes the SnapHost tool calls itself.
slugNoSlug, unique within the drive the site is filed in; reuse it with the same folder_id or space to update the same site at the same URL. For a landing page the slug IS the address under /lp: pass exactly the path you were asked for; omitted, it is derived from the title and the page lands at a different address. A slug already used by a site elsewhere on the drive is refused, and so is one that is another site’s old address (the refusal says where that site went: update it instead of publishing a second one).
filesNoPlain-text files, each `{path, content}`, zipped for you: a page with its own CSS, JS, JSON or SVG files (name the entry `index.html`), or one Markdown, CSV, Mermaid, notebook, code or .tsx/.jsx React component file on its own, rendered as its kind under its path (a component needs a default export and may import only react, react-dom, recharts, lucide-react, d3, framer-motion and @radix-ui/react-*). Paths are relative to the bundle root with forward slashes (`index.html`, `assets/app.js`). Text only: an image, a font, a PDF or any binary is referenced at a URL (add_external_origins) or sent through create_bundle_upload. At most 100 entries and 2 MB of text in total (UTF-8), and 3.5 MB once JSON-escaped (a control character other than backspace, tab, newline, form feed and carriage return, `<`, `>`, `&` or any non-ASCII character counts 6 bytes, an emoji 12, and `"`, `\` and `/` 2, so non-ASCII text may count three times its size and markup-heavy text up to six): in practice about 2 MB of plain English or 1 MB of non-Latin or tag-dense text. The rest of the 4 MB request body is for the call itself. Like `html`, this works from any client, a chat window with no shell included.
spaceNoDrive root for a folderless site: `personal` (default, the publisher’s My drive) or `shared`. Ignored when folder_id is given.
titleYesTitle shown to the owner in the dashboard
statusNo`published` (default) is live immediately; `draft` stays hidden until published
filenameNoThe uploaded file's own name with its extension (`report.pdf`, `photo.png`, `data.csv`). Give it once, at create_bundle_upload; a name given here as well must match it. Pass it here only for a single non-zip file whose upload was opened without one, so it is rendered as its kind; an upload that no name describes and that is neither a zip nor an HTML page is refused. For a .docx, .pptx or .xlsx sent as `zipBase64`, give its name here: it heads the bar and names the download. Ignored for a .zip bundle. A name SnapHost does not take is refused with the export that would work.
allowlistNoEmails or domains allowed to view a private site (Pro only)
folder_idNoFile the new site into this folder (folder_id from list_folders). A landing page goes into the website workspace’s Marketing folder: pass that workspace’s workspace_id as well; without it the publish is refused on a connection that reaches several workspaces (and lands in the personal space on one that reaches only it), and the site is not a landing page, whatever its slug.
printableNoThe page is built to print (a PDF that keeps the look): the design check asks for print styles, and a plain page gets the viewer's Print action (a report or a deck carries its own Download PDF button instead). Kept on later updates unless given again.
upload_idNoReference a bundle already uploaded via create_bundle_upload (sent with upload_bundle_part, or PUT to its `upload_url`); use this for a large or binary-carrying app (e.g. a built React site with images and fonts) that `html` or `files` cannot hold, or for a single file that is not text (a PDF, an image, a video, an audio, a .docx, .pptx or .xlsx), sent as it is together with `filename`. Sending the bytes needs a shell that makes the SnapHost tool calls itself; without a shell the person drops the file on the dashboard: the drive (https://app.snaphost.ai/) for a new site, or the site's own page (https://app.snaphost.ai/sites/<site_id>, "Upload a new version") to keep an existing link. Mutually exclusive with `html`, `files` and `zipBase64`.
zipBase64NoBase64-encoded .zip bundle (entry HTML + assets), for a multi-file bundle that holds binaries and fits the 4 MB request body once encoded; a .docx, .pptx or .xlsx (zips themselves) or a one-entry zip holding a single PDF, image, video or audio file under its real name also goes here. Text belongs in `html` or `files` instead: base64 has to be reproduced byte for byte and a long string often is not, so this input is rejected outright if the encoding or the archive checksums do not verify. Producing it needs a shell that makes the SnapHost tool calls itself; a client without one sends text as `files` and hands a binary to the person for the dashboard: the drive (https://app.snaphost.ai/) for a new site, or the site's own page (https://app.snaphost.ai/sites/<site_id>, "Upload a new version") to keep an existing link.
visibilityNo`public`: anyone with the link (the default on Free). `allowlist` (the default on Pro): only the people on the allowlist, after verifying their email; Free may name up to 3. A landing page must be public. Applies to a NEW site only; change an existing site with set_visibility.
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).
document_kindNoWhat the site is: a report, a presentation, a dashboard, or a plain page (the default). A publish or content update of such a site runs the design check (`design_warnings`); a presentation may go full screen. Kept on later updates unless given again.
include_originalNoWhether readers may download the uploaded file itself from the page. Applies to a Word, PowerPoint or Excel file only, and is off by default for them, because the file holds what the page does not show: speaker notes, hidden slides, sheets, rows and columns, formulas, comments and tracked changes. Pass true to offer it anyway; on update_site, leave it out to keep the live version's choice. A macro-enabled .docm, .pptm or .xlsm is never offered. A CSV, image, video, audio, PDF, diagram or text file is its page and always downloads; a Markdown file or notebook becomes its page and has no download. The result reports `original_included`, and `render_notices` says what the page could not show (cells shown as formulas when a workbook carries no computed values; a file left out for size). Relay a notice to the user.

TDQS

A4.7/5.0
Behavior5/5

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

The description provides extraordinary behavioral transparency, detailing operational mechanics like sandboxing, content kind detection, Drive placement logic, and security scanning for external references, none of which are covered by the schema or annotations.

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

Conciseness2/5

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

While the critical information is present, the description is overly verbose and dense, mixing high-level operational goals (e.g., sharing with a client) with highly specific, technical constraints (e.g., control character byte counts). It suffers from information overload and lacks a logical flow for quick reference.

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?

Given the high complexity and the large number of interacting parameters, the description is highly complete. It addresses persistence, accessibility, and security policies, providing all necessary context for a correct invocation.

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?

The description adds vital semantic meaning to several parameters, especially `html`, `files`, and `zipBase64`, specifying technical constraints like file size limits, encoding nuances, and required component libraries for specific formats. This is critical context that the schema alone cannot convey.

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 immediately defines the core purpose (publishing a page, creating a shareable link) and clearly sets it apart from sister tools by focusing on content submission and URL generation. It successfully establishes the primary 'why' for this complex tool.

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 provides exceptional usage guidelines by contrasting the four primary content input methods (`html`, `files`, `zipBase64`, `upload_id`) and explicitly guides the user on when to use them versus when to update an existing site via slug idempotency.

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

query_site_recordsQuery site recordsA
Read-onlyIdempotent
Inspect

Use when the user asks who signed up, what was submitted, or wants to see the responses. Queries a collection's append-only records (newest-first by default). Filter with where (field/value equality), set order (asc|desc) and limit. Each record carries its server-stamped actor. Scoped to a site you own.

NameRequiredDescriptionDefault
limitNoMax records to return (capped at 200)
orderNoSort by creation time
whereNoEquality filters on record fields
site_idYesThe site that owns the collection
collectionYesThe collection to query
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).
latest_per_keyNoFold edit events to the newest record per logical `key` field (current state), instead of the full history

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, covering safety. The description adds valuable behavioral context: records are append-only, newest-first by default, and each carries a server-stamped actor. It also notes the site scope. These go beyond the annotations without contradicting them.

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 description is four sentences, front-loaded with the most important use cases. Every sentence earns its place: purpose, mechanism, filtering/ordering, actor info, and scope. There is no redundancy or fluff.

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?

With 7 parameters and no output schema, the description covers the key behaviors (filter, order, limit, actor stamp) but does not describe the response format. The schema explains workspace_id and latest_per_key in detail, so those are covered. The lack of output shape is a minor gap, but the description gives enough context for a query tool, especially with annotations covering safety.

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 100%, so the baseline is 3. The description adds the default ordering (newest-first) and clarifies that `where` uses field/value equality, which is partially in the schema. It also mentions the `limit` parameter but adds no new semantics beyond the schema. The added default behavior is useful, raising it to a 4.

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 clearly states the tool's purpose: 'Use when the user asks who signed up, what was submitted, or wants to see the responses' and 'Queries a collection's append-only records'. It identifies the resource (site records) and differentiates from siblings like delete_site_record or set_site_data. The scope 'Scoped to a site you own' further clarifies what it operates on.

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?

The description gives explicit when-to-use context ('Use when the user asks who signed up...'), but does not mention when not to use it or explicitly name alternatives. It lacks exclusions, but the usage context is clear enough to guide an agent to select this tool over others.

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

register_webhookRegister webhookAInspect

Use when the user wants their own system told when someone opens a site in this workspace. Registers an https endpoint SnapHost posts to on each subscribed event (today: site.viewed). The result carries the signing secret ONCE: show it to the user and tell them to store it, it is not shown again. Workspace owners and admins only. Each delivery is a JSON POST with a SnapHost-Signature header of the form t=<unix seconds>,v1=<hex>, where v1 is HMAC-SHA256 over <t>.<raw body> with the webhook's secret; SnapHost-Event names the event and SnapHost-Delivery the delivery id (the same id is retried, so receivers can deduplicate). A site.viewed body carries data.site_id, data.site_title, data.share_id, data.viewer_email (empty for an anonymous open of a public site) and data.opened_at. An answer outside 2xx is retried five times over about fifteen hours; a webhook whose deliveries keep failing is disabled.

NameRequiredDescriptionDefault
urlYesThe https address to post deliveries to
eventsNoThe events to subscribe to; omitted, all of them (site.viewed)
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.4/5.0
Behavior5/5

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

Goes well beyond the annotations (write, non-idempotent, non-destructive) by disclosing the one-time signing secret, the required permission level, the HMAC-SHA256 signature scheme and headers, the retry schedule (five retries over ~15 hours), and automatic disabling of persistently failing webhooks. These are exactly the behavioral traits an agent cannot infer from structured fields.

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-loads the use case before diving into mechanics, and every sentence carries actionable content (secret handling, signature verification, retry/dedup semantics). It is dense and long, but nothing reads as filler; the length is justified by the integration details a caller needs.

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?

With no output schema, the description carries the return-value burden and does so: it explains the one-time secret in the result, the delivery payload shape, and failure/retry behavior. Nothing essential for calling or consuming this webhook registration correctly is missing.

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 100%, so the schema already documents url, events, and workspace_id, and the baseline is 3. The description mentions subscribed events and the site.viewed payload fields but adds no syntax or format detail for the parameters themselves beyond what the schema provides.

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 (registers) and resource (an https endpoint for webhook deliveries) plus the exact triggering condition (user wants their system told when someone opens a site). An agent can distinguish it from list_webhooks and delete_webhook 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 Guidelines4/5

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

'Use when the user wants their own system told when someone opens a site in this workspace' gives a clear when-to-use context, and the owners/admins-only restriction narrows applicability. It stops short of explicitly naming the sibling alternatives (list_webhooks, delete_webhook) it is mutually exclusive with.

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

remove_custom_domainRemove custom domainA
DestructiveIdempotent
Inspect

Detach a custom domain from its site and stop serving it.

NameRequiredDescriptionDefault
domain_idYesThe domain id from list_custom_domains
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already indicate destructiveHint=true and idempotentHint=true. The description adds 'stop serving it', which clarifies the effect. However, it does not mention whether the domain record is deleted or merely detached, nor any side effects or prerequisites, which would be useful context beyond 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.

Conciseness5/5

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

The description is a single, front-loaded sentence with no redundant words. It conveys the essential action and outcome without any filler, making it highly concise and effective.

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 simple two-parameter destructive operation with annotations covering safety and no output schema, the description captures the core action but omits details like whether the domain is deleted or just detached, and whether it can be re-added. This minor ambiguity prevents a higher score.

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?

The input schema already documents both parameters with full descriptions (100% coverage), so the description adds no additional parameter semantics. The baseline of 3 applies because the schema does the heavy lifting.

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 clearly states the verb 'detach' and the resource 'custom domain', along with the consequence 'stop serving it'. It distinguishes from siblings like add_custom_domain and list_custom_domains by explicitly describing the removal action.

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?

The description offers no guidance on when to use this tool versus alternatives. It does not mention any conditions, exclusions, or contrasts with related tools such as add_custom_domain or verify_custom_domain, leaving the agent to infer usage from the name alone.

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

remove_from_allowlistRemove from allowlistA
DestructiveIdempotent
Inspect

Remove specific email and/or domain entries from a private site's allowlist, leaving everyone else on it. Entries that are not present are ignored. To clear the whole list, use set_allowlist with an empty array.

NameRequiredDescriptionDefault
site_idYesThe id of the site to update
allowlistYesEntries to remove from the existing allowlist
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already indicate destructive and idempotent characteristics; the description adds specific context by stating that absent entries are ignored, which clarifies the idempotency behavior and that the operation is non-fatal. This goes beyond the hints and provides useful operational detail.

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?

Three concise sentences with no fluff. The core action is front-loaded, the behavior for absent entries is clearly stated, and the alternative for clearing the list is provided. Every sentence earns its place.

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?

The description covers purpose, key behavior, and alternative usage. It mentions the scope ('private site's allowlist') and does not rely on an output schema. It could theoretically mention error conditions or required permissions, but for a simple removal tool this is adequate and complete relative to its complexity.

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 100% and the schema already documents the allowlist parameter as 'Entries to remove'. The description reinforces this by mentioning email/domain (matching the kind enum) and adds the idempotency semantics ('entries that are not present are ignored'), which adds value beyond the 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?

The description clearly specifies the verb 'remove' and the resource 'specific email and/or domain entries from a private site's allowlist', and distinguishes it from set_allowlist by noting that it leaves everyone else on the list. This makes the purpose unambiguous and distinct from sibling tools like add_to_allowlist or set_allowlist.

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?

It explicitly directs when to use an alternative ('To clear the whole list, use set_allowlist with an empty array') and implies this tool is for targeted removals. It does not explicitly mention conditions like when not to use it or prerequisites, but the given guidance is sufficient for common use cases.

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

remove_site_forwardStop an old address forwardingA
DestructiveIdempotent
Inspect

Stop an old address forwarding to a site, leaving the address free for any site to take. The old addresses are the old_addresses of get_site, and what set_site_slug reports after a rename. Links to the address stop opening the site, and nothing restores them but putting the site back on that address, so confirm with the user first.

NameRequiredDescriptionDefault
site_idYesThe id of the site
old_addressYesThe old address to stop, as get_site lists it (for example "/atlas-migration")
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true and idempotentHint=true, and the description goes well beyond them: it states exactly what breaks ('Links to the address stop opening the site'), that the effect is irreversible except by re-assigning the address, and it instructs the agent to confirm with the user first. This is precisely the extra context annotations cannot convey.

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?

Two sentences, front-loaded with the action and effect, followed by sourcing and the irreversibility warning. Every clause earns its place with no redundancy.

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?

With annotations carrying the safety profile and no output schema needed for a void-return mutation, the description supplies everything an agent needs: what the tool does, where the input comes from, that the effect is destructive and non-reversible, and that user confirmation is expected.

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 100%, so the baseline is 3. The description adds genuine meaning by defining what qualifies as an 'old address' and pointing to get_site/set_site_slug as the sources, which the schema alone does not establish, though it adds nothing about the workspace_id parameter.

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 ('stop') and resource ('old address forwarding to a site') and immediately names the effect ('leaving the address free for any site to take'). An agent can distinguish this from siblings like rename_site, set_site_slug, and remove_custom_domain 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 Guidelines4/5

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

Tells the agent where the old addresses come from ('the `old_addresses` of get_site, and what set_site_slug reports after a rename'), which is the key precondition for calling it correctly. It does not explicitly name a competing tool or state when NOT to use it, so it falls 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.

rename_folderRename folderA
Idempotent
Inspect

Rename a folder. Pass its folder_id (from list_folders) and the new name. The slug, and with it every address under the folder (a landing page's /lp address included), stays as it is; only what the dashboard calls the folder changes. Only someone who can manage the folder may rename it. Returns the updated folder.

NameRequiredDescriptionDefault
nameYesThe new folder name
folder_idYesThe folder id from list_folders
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.5/5.0
Behavior5/5

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

Beyond annotations, the description discloses meaningful behavior: the slug and every address under the folder remain unchanged, only the dashboard-facing name changes, a manage-level permission is required, and the tool returns the updated folder. This gives the agent a precise mental model of side effects.

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?

Three compact sentences with no filler. The key scoping statement about the slug is front-loaded, and every sentence adds distinct value: what to pass, what stays unchanged, permissions, and return value.

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?

Complete for this tool. It covers required inputs, side-effect scope, authorization, and return value despite no output schema. An agent has everything needed to invoke it correctly and know what to expect.

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 100%, so the schema already explains folder_id, name, and workspace_id. The description adds little beyond restating 'pass folder_id and name', though it does reinforce that folder_id comes from list_folders. Baseline 3 is appropriate.

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 ('Rename a folder') and clarifies exactly what changes (the dashboard-facing name) and what does not (the slug and addresses). This distinguishes it from siblings like set_folder_slug and rename_site without needing to open their schemas.

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?

Clearly conveys when to use it: rename the display name while preserving the slug and all addresses, and it sets the permission prerequisite ('Only someone who can manage the folder may rename it'). It implies the alternative for slug changes but does not explicitly name a sibling tool like set_folder_slug.

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

rename_siteRename siteA
Idempotent
Inspect

Rename a site's display title by id. Cosmetic only: the slug, the nanoId permalink, and every existing link keep working; only what viewers and the dashboard call the site changes; the heading and tab of a landing page do not, unless its document declares no of its own. To change the site's link path, use set_site_slug. A landing page's visible title (tab, link preview, heading) is the in its own document: change that with update_site. Returns the updated site.

NameRequiredDescriptionDefault
titleYesThe new display title
site_idYesThe id of the site to rename
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already provide readOnlyHint=false, destructiveHint=false, and idempotentHint=true. The description goes beyond these by clarifying the specific behavioral nuance that the change is cosmetic and does not affect slugs/links, and explains the edge case about landing page titles depending on the document's <title>. However, it doesn't mention response format or error conditions, but given the annotations, the added value is substantial and no contradictions exist.

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?

The description is front-loaded with the core purpose and key scoping constraints ('Cosmetic only'), followed by alternative routing. While the landing-page edge case adds some length, it's directly relevant to avoiding incorrect assumptions. The structure is clear and mostly efficient, though the final sentence about return value is somewhat redundant with the schema's implied return.

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?

The description covers the scope, effects, alternatives, and the tricky workspace_id prerequisite. Since the tool is a write operation but non-destructive, and the output schema is absent, the description could mention the exact structure of the returned 'updated site,' but that's a minor gap. Overall, the definition is comprehensive for the tool's complexity.

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 100%, so parameters are well-documented in the schema. The description adds value by explaining the workspace_id parameter's nuanced behavior (required on write when multiple workspaces are reachable) and the semantics of the title parameter ('display title' vs. a slug or path). This goes beyond the schema's minimal descriptions, making the tool easier to use correctly.

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 clearly states the verb and resource: 'Rename a site's display title by id.' It also explicitly differentiates from siblings by stating what this tool does NOT change (slug, permalink, existing links) and naming the alternative tools (set_site_slug, update_site) for those actions. This makes the purpose unambiguous and distinct from the 40+ sibling tools.

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?

The description provides explicit when-to-use guidance: it explains that this tool is for cosmetic title changes only, and explicitly states when to use alternatives ('To change the site's link path, use set_site_slug' and 'change that with update_site'). It also clarifies the scope of the effect (what changes, what doesn't), which is critical for correct usage.

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

rollback_siteRoll back siteA
DestructiveIdempotent
Inspect

Use when the user wants to undo the last update or go back to the previous version. Restores a prior version's content as the site's current content (records a new version). Content only: the slug, folder, visibility and any /lp address stay as they are now, so a rollback after a rename does not change the address (the old one keeps forwarding to the current one; set_site_slug puts it back). The share URL is unchanged and open viewers are offered a Refresh to it (a landing page shows it on its next load). Use list_versions to find the version_id.

NameRequiredDescriptionDefault
site_idYesThe id of the site to roll back
version_idYesThe id of the version to restore (from list_versions)
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing that only content is restored while slug, folder, visibility and /lp address are untouched, that a new version is recorded, and how the share URL and open viewers behave (Refresh prompt, landing page on next load). This is exactly the extra context annotations cannot convey.

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 trigger, then the semantic constraints. Sentences are dense and long in the middle section, but each carries non-obvious behavior (address forwarding, viewer refresh) rather than filler.

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?

With annotations covering the safety profile and no output schema required, the description supplies everything an agent needs: when to call it, what state changes, what is preserved, and the prerequisite lookup for version_id.

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 coverage is 100% and both required parameters plus workspace_id are documented in the schema. The description's only parameter note ('use list_versions to find the version_id') restates the schema, so baseline 3 applies.

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 ('Restores a prior version's content as the site's current content') and clarifies the mechanism (records a new version). It is clearly distinguishable from update_site, delete_site and list_versions.

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?

Opens with an explicit trigger ('Use when the user wants to undo the last update or go back to the previous version') and routes the agent to `list_versions` for the version_id and to `set_site_slug` when the address also needs restoring. Both the when and the alternatives are named.

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

set_allowlistSet allowlistA
Idempotent
Inspect

Use when the user wants to set exactly who can view, replacing the current list. REPLACES a site's entire allowlist with the provided email and/or domain entries. This OVERWRITES the existing list, so anyone not in the entries you pass loses access. To add people without dropping the current ones, use add_to_allowlist instead; to take specific people off, use remove_from_allowlist. Pass an empty array to clear it. Each email that was not already on the list receives an invite email. Pro only, except that clearing the list works on every plan and on a public page.

NameRequiredDescriptionDefault
site_idYesThe id of the site to update
allowlistYesThe full set of entries to allow; replaces the existing allowlist
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.9/5.0
Behavior5/5

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

The description surfaces important side effects the annotations do not: overwriting drops anyone not in the supplied list, new emails receive invite emails, and a Pro-plan restriction exists except for clearing. These are exactly the behaviors an agent needs to warn the user about. The overwrite language is consistent with idempotentHint=true and readOnlyHint=false, so there is no annotation contradiction.

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 description is front-loaded with the primary use case and every subsequent sentence adds a distinct, non-redundant fact: consequence of overwrite, alternatives, clearing behavior, invite emails, and plan limits. The capitalization of REPLACES/OVERWRITES emphasizes the critical warning without extra fluff.

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 write operation with no output schema, the description covers selection, side effects, alternatives, edge cases, and plan/gating. An agent has everything it needs to decide to call set_allowlist and to explain the impact to the user.

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?

The schema already describes both key parameters at 100% coverage, so the baseline is 3. The description adds meaningful extra semantics: the allowlist parameter means the full replacement set, 'Pass an empty array to clear it,' and entries are email/domain kinds. This goes beyond the schema, though it does not need to restate site_id or workspace_id behavior.

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 precise verb and resource ('set ... allowlist') and immediately clarifies the core semantics: replacing the entire list with the provided entries. It also differentiates from siblings by naming add_to_allowlist and remove_from_allowlist as alternatives, so an agent cannot confuse them.

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?

Leads with the explicit trigger condition ('Use when the user wants to set exactly who can view, replacing the current list') and gives direct when-not instructions: prefer add_to_allowlist for additions and remove_from_allowlist for removals. Also covers the empty-array clear case and plan constraints.

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

set_brand_guidelinesSet brand guidelinesA
Idempotent
Inspect

Link the active workspace's brand guidelines: the https URL of a public web page or PDF that says what the kit cannot hold (logo clear space, imagery, how charts are drawn, how the brand speaks). SnapHost checks that it answers with a page or a PDF, and every build in the workspace reads it from then on, through get_brand_kit. Replaces guidelines the workspace has; a PDF that is not online is uploaded on the General page of the dashboard instead. The workspace owner only, on Pro, in a team workspace (the website workspace included, whose kit is otherwise fixed). Confirm the link with the person before calling this.

NameRequiredDescriptionDefault
urlYeshttps URL of the brand guidelines, a public web page or PDF
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare the mutation profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), but the description goes well beyond them: it discloses replacement semantics ('Replaces guidelines the workspace has'), a validation step ('SnapHost checks that it answers with a page or a PDF'), and persistence ('every build in the workspace reads it from then on'). Permission/plan gating is spelled out as well.

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?

It is a single dense paragraph, but it is front-loaded with the core action and every clause carries information (validation, persistence, replacement, permissions, alternative path). Minor cost: the parenthetical enumerations and stacked conditions make it harder to scan than a bulleted form.

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 write tool with full annotation coverage and no output schema, nothing an agent needs is missing: prerequisites, replacement behavior, validation, persistence via get_brand_kit, and the out-of-scope fallback are all stated. Return values need not be described since no output schema exists.

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 100%, so the baseline is 3, and the schema already defines both the url and workspace_id semantics. The description still adds real meaning about what the url must point to (a page/PDF constraining logo clear space, imagery, chart drawing, brand voice) and the constraint that offline PDFs are out of scope for this parameter.

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 precise verb and resource ('Link the active workspace's brand guidelines') and pins down exactly what the resource is ('the https URL of a public web page or PDF that says what the kit cannot hold'). It also names the read-side sibling (get_brand_kit), so an agent understands where the linked value surfaces. The only unaddressed relative is set_brand_kit, but the operation itself is unambiguous.

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 (workspace owner only, on Pro, in a team workspace, including the otherwise-fixed website workspace) and an explicit alternative path for the case it does not cover ('a PDF that is not online is uploaded on the General page of the dashboard instead'). It even adds a procedural guardrail: 'Confirm the link with the person before calling this.'

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

set_brand_kitSet brand kitA
Idempotent
Inspect

Save the active workspace's brand kit, replacing the one it has: the palette by role, the heading and body fonts, the logo and mark, the language and locale, the tone and the phrases never to use, and the look (style: radius, density, emphasis, cover and surfaces, each from a small set, read off the site the way the colours are). Build it from what the person gives you (a brand guideline PDF, their website, or answers), show it to them as a table and get a yes BEFORE calling this. Colours are #rrggbb for every role: primary, primaryStrong, secondary, accent, ink, muted, line, surface, surfaceTint, onPrimary, onSecondary, positive, negative (positive and negative, the green and red for a change for the better or the worse, may be left out and get sensible defaults). Fonts are one family name each, a system family or a Google Fonts family name (font_source: "google"; publishing then allows Google Fonts on the site). logo_url and mark_url are https URLs of a PNG, SVG or WebP under 1 MB on a public site (the customer's own website is the usual source): SnapHost fetches and hosts them, so the kit's asset URLs are SnapHost's, never the source. A first save needs a logo; a later one keeps the assets it has unless given new ones. Relay every warnings entry (low contrast is the usual one) and offer to fix it. Owner or admin only, on Pro. The brand guidelines themselves (a page or PDF) are set apart, with set_brand_guidelines.

NameRequiredDescriptionDefault
nameYesThe brand name, e.g. "Garðabær"
toneNoUp to eight sentences describing how the brand writes
styleNoThe look, read off the site: radius from its buttons and cards, density from its white space, emphasis from its display type (calm or bold headlines), cover from its hero, surfaces from whether it boxes content in tinted panels or separates it with rules. Leave `style` out on a later save to keep the look the kit has; a first save without it takes the neutral look (soft, regular, calm, dark, tinted).
localeYesLocale for numbers and dates, e.g. "is-IS"
tokensYesA #rrggbb colour for every role: primary, primaryStrong, secondary, accent, ink, muted, line, surface, surfaceTint, onPrimary, onSecondary, positive, negative
languageYesLanguage code, e.g. "is"
logo_svgNoThe logo as SVG markup (the <svg>…</svg> drawn inline in the site’s HTML), when no file URL exists; at most 200 KB
logo_urlNohttps URL of the logo (PNG, SVG or WebP)
mark_svgNoThe mark as SVG markup, when no file URL exists
mark_urlNohttps URL of the small mark or emblem; the logo when omitted
body_fontYesThe body family
font_sourceYesWhere the fonts come from
heading_fontYesThe heading family
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).
forbidden_phrasesNoUp to forty words or phrases the brand never uses

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare the safety profile (write, idempotent, non-destructive). The description adds genuinely new behavior: SnapHost fetches and re-hosts logo/mark assets so returned asset URLs are never the source, a first save requires a logo while later saves retain existing assets, warnings (low contrast) must be relayed, and the operation is owner/admin gated on Pro. This is substantive disclosure beyond structured fields.

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?

The core action and its constraints are front-loaded, and the long run-on list of roles/style keys mirrors the schema rather than adding to it. For a 15-parameter tool the length is defensible, but a few clauses (the full colour enumeration, the style read-off) restate structured data and could be trimmed.

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, and the description compensates by telling the agent what comes back (warnings to relay) and what to do with them. Combined with permission requirements, asset-hosting behavior, first-save vs later-save semantics, and defaults, an agent has everything needed to invoke this correctly.

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 100%, so the baseline is 3, but the description adds real meaning beyond the schema: a 1 MB size ceiling on logo/mark URLs, that positive/negative may be omitted and receive sensible defaults, that font names are system or Google Fonts families, and the neutral default for a missing `style`. It does repeat the colour-role and style-enum semantics already present in the schema, which caps it at 4.

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 opens with a specific verb+resource+scope: 'Save the active workspace's brand kit, replacing the one it has', then enumerates exactly what the kit contains. It explicitly distinguishes itself from the sibling set_brand_guidelines ('the brand guidelines themselves... are set apart'). An agent can separate it from get_brand_kit and set_brand_guidelines 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?

It gives explicit when-to-use ('Build it from what the person gives you... show it to them as a table and get a yes BEFORE calling this'), names the alternative for the related resource, and states prerequisites ('Owner or admin only, on Pro'). Nothing about selection or preconditions is left to inference.

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

set_collection_accessSet collection accessA
Idempotent
Inspect

Set who can read a collection from the published page and pause/resume writes. access_mode: 'public_read' (anyone reads: a scoreboard/guestbook) or 'append_only' (visitors append but only the owner reads: a contact form / waitlist; submissions are never readable by other visitors). On the marketing site public_read means anyone on the internet, so it is refused unless you pass records_carry_no_personal_detail true, which you answer with the owner, and the waitlist collection stays append_only there whatever is asked. writes_paused stops new appends. Needs Pro; scoped to a site you own.

NameRequiredDescriptionDefault
site_idYesThe site that owns the collection
collectionYesThe collection name
access_modeNo'append_only' for forms/waitlists; 'public_read' for shared lists
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).
writes_pausedNoPause (true) or resume (false) appends
records_carry_no_personal_detailNoRequired to set public_read on the marketing site: confirm with the owner, in words, that these records carry no name, email or other personal detail, because public_read there means anyone on the internet can read every one of them.

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations, it discloses ownership and plan requirements ('Needs Pro; scoped to a site you own'), the refusal behavior when records_carry_no_personal_detail is false, and the override where waitlist remains append_only. This is valuable behavioral context that annotations alone do not provide.

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 description is compact and front-loaded: the purpose in the first sentence, then mode semantics, then caveats. Every sentence earns its place and no repeated schema boilerplate appears.

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 mutating access-control tool with no output schema, it provides everything needed to call correctly: modes, use cases, constraints, requirements, and exception behavior. The optional workspace_id detail remains in the schema, so nothing essential is missing from the description.

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?

Because schema coverage is 100%, a baseline of 3 applies, but the description goes well beyond it: it explains the access_mode enum with use cases, defines the privacy implication of append_only, and clarifies the sensitive records_carry_no_personal_detail parameter and its owner-confirmation requirement.

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 opens with a specific verb and resource: 'Set who can read a collection from the published page and pause/resume writes.' It then defines the two access modes with concrete examples, making the tool's scope distinct from sibling setters like set_visibility or set_site_data.

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?

It gives clear context for when each access_mode is appropriate (scoreboard/guestbook vs contact form/waitlist) and states hard constraints: public_read is refused on the marketing site without confirmation, and waitlist stays append_only. It doesn't explicitly name alternatives among sibling tools, but the use-case guidance is sufficient for selection.

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

set_folder_slugSet folder slugA
Idempotent
Inspect

Rename a folder's link slug, its path segment in folder-path addresses like .snaphost.ai//. Shared-drive folders only: personal (My drive) folders are organisational and never appear in links. The slug stays unique among sibling folders. Pro workspaces only (slug addressing rides on the workspace subdomain). Every page inside gets a new workspace-host address and its old one forwards there until another page takes it. In the website workspace the Marketing folder keeps its slug (it is the /lp address space); a folder inside it may change, and the result names every /lp address that ended (set the slug back to restore them) and every one that started. Returns the updated folder.

NameRequiredDescriptionDefault
slugYesThe new slug, e.g. "financials"
folder_idYesThe folder id from list_folders
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.4/5.0
Behavior5/5

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

Adds substantial behavior beyond the annotations: slug uniqueness among siblings, the side effect that every contained page gets a new address while the old one forwards 'until another page takes it', and the reversibility note ('set the slug back to restore them'). Annotations cover safety/idempotency, and the description supplies the real consequential behavior.

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?

Purpose and constraints are front-loaded in the first three sentences, and most sentences earn their place. The trailing 'Marketing folder' example is quite long and niche for a general reader, slightly diluting focus.

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 rename-with-redirect-semantics tool with no output schema, the description covers scope, prerequisites, side effects, and reversibility, and notes the return ('Returns the updated folder'). 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.

Parameters3/5

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

Schema description coverage is 100%, so both required params and the optional workspace_id are already documented in the schema. The description's folder-path illustration lightly clarifies what 'slug' means but adds no syntax or format detail beyond the structured fields, so baseline 3 applies.

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 ('Rename a folder's link slug') and immediately disambiguates the concept by defining the slug as the path segment in folder-path addresses. This cleanly separates it from rename_folder (name) and set_site_slug (site), so an agent can pick the right tool without reading schemas.

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 explicit when/when-not constraints: 'Shared-drive folders only: personal (My drive) folders... never appear in links' and 'Pro workspaces only'. Strong exclusion guidance, though it never names the adjacent alternative tools (e.g. rename_folder, move_folder) as the selection cue.

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

set_render_optionsSet render optionsA
Idempotent
Inspect

Configure how a site is delivered, without touching its sandbox. spa_fallback (free on every plan) serves the entry page for unknown in-app routes so client-side navigation and shared deep links resolve, but real missing files (scripts, images, styles) still 404. document_kind and printable say what the site is as a document (see publish_site). auto_refresh (free on every plan) makes a viewer that is open when a new version is published reload on its own, instead of offering a Refresh prompt; off by default, since a reload mid-read loses a reader their place. external_origins extends the site's content-security policy to allow specific https origins it calls at runtime (fonts, images, APIs, embeds); this is a paid capability (Pro) and each entry must be a bare https://host[:port] with no path. Pass an empty array to clear the list, or use add_external_origins to add origins without replacing the list. include_original false stops a Word, PowerPoint or Excel site offering its file for download, by rendering the page again from the file it holds as a new version; true is refused, since a withheld file was never kept: update_site with the file and include_original true instead. Omit a field to leave it unchanged. Needs edit access to the site (its creator or an editor grant, in a role that can edit); rejected requests (forbidden, plan_limit, validation_failed) leave the stored options unchanged.

NameRequiredDescriptionDefault
site_idYesThe id of the site to configure
printableNoThe page is built to print (a PDF that keeps the look): the design check asks for print styles, and a plain page gets the viewer's Print action (a report or a deck carries its own Download PDF button instead). Kept on later updates unless given again.
auto_refreshNoReload open viewers on their own when a new version is published, instead of offering a Refresh prompt
spa_fallbackNoServe the entry page for unknown in-app routes (deep-link routing)
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).
document_kindNoWhat the site is: a report, a presentation, a dashboard, or a plain page (the default). A publish or content update of such a site runs the design check (`design_warnings`); a presentation may go full screen. Kept on later updates unless given again.
external_originsNoFull set of https origins to allow in the site CSP; replaces the existing list
include_originalNofalse: stop offering the Office file this site renders for download (a new version, rendered from the file already held). true is refused; upload the file again with update_site and `include_original` true.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations cover safety (idempotent, non-destructive), but the description adds substantive behavior beyond them: which options are free vs paid (external_origins is Pro), that rejected requests (forbidden/plan_limit/validation_failed) leave stored options unchanged, that omitting a field leaves it unchanged, and that include_original=true is refused.

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 before per-field detail, and nearly every sentence carries operational information. It is a dense single block, though, with some overlap against the equally detailed schema descriptions, so it is information-rich but not maximally lean.

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 an 8-parameter mutation tool with no output schema, the description covers defaults, paid-vs-free gating, access requirements, the omit-to-leave-unchanged contract, and named error codes. An agent has everything needed to invoke it correctly.

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 100%, so baseline is 3, but the description genuinely adds meaning: external_origins entries must be 'bare https://host[:port] with no path', an empty array clears the list, auto_refresh defaults off, and include_original=false re-renders rather than withholding. It exceeds the schema but partly restates existing field docs.

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 (configure how a site is delivered) and scopes it with the qualifier 'without touching its sandbox', which cleanly separates it from content/mutation siblings like update_site and publish_site. Per-field clauses make the tool's remit concrete enough to distinguish from any sibling.

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?

Names alternatives with the condition that selects them: 'use add_external_origins to add origins without replacing the list' and 'update_site with the file and include_original true instead'. Also states prerequisite access ('Needs edit access... its creator or an editor grant').

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

set_site_dataSet site dataA
Idempotent
Inspect

Use when the page should read a setting or value the owner controls (a price, a deadline, a switch). Sets a key-value item in a site's data store (SnapHost Data). KV is mutable config/state the published page reads. value is any JSON. Scoped to a site you own.

NameRequiredDescriptionDefault
keyYesThe item key within the namespace
valueYesAny JSON value to store (max 256 KB)
site_idYesThe site to write to
namespaceYesGrouping for the key, e.g. "config"
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.2/5.0
Behavior4/5

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

With annotations already indicating readOnlyHint=false, idempotentHint=true, and destructiveHint=false, the description adds useful context: the data is mutable KV read by the published page, values are arbitrary JSON, and writes are 'scoped to a site you own.' This supplements the annotations without contradicting them.

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 description is concise and front-loaded with the trigger condition. Each of its five short sentences contributes a distinct point: use case, operation, storage semantics, value type, and scope, with no filler or redundancy.

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?

Given a fully documented schema, useful annotations, and no output schema, the description provides enough context for an agent to select and invoke the tool correctly. It covers when, what, and scope, and explains the store's role. Minor omissions such as explicit error behavior or overwrite semantics keep it from being fully comprehensive.

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 100%, so the baseline is 3. The description adds only modest parameter-level context, such as 'value is any JSON' and illustrative examples like 'a price, a deadline, a switch,' which slightly enrich the schema but do not substantially change meaning.

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 clearly states a specific verb and resource: 'Sets a key-value item in a site's data store (SnapHost Data).' It also frames the tool's purpose with the use case 'when the page should read a setting or value the owner controls,' which distinguishes it from sibling setters like set_site_slug or set_visibility.

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?

The opening sentence gives explicit when-to-use guidance: 'Use when the page should read a setting or value the owner controls.' It also explains that the store is 'mutable config/state the published page reads.' However, it does not explicitly name alternatives or state when not to use this tool, so it stops 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.

set_site_slugSet site slugA
Idempotent
Inspect

Change a site's slug, the last segment of its address on the workspace host and, for a landing page, of its snaphost.ai/lp address. The share permalink (nanoId) keeps working, and the old address on the workspace host forwards to the new one until another site takes it or remove_site_forward stops it; an /lp address and any campaign link to it stop. Normalised to lowercase letters, digits and hyphens; refused when another site on the same drive holds it, and when the new address is an old one still forwarding to another site: ask the user, then retry with replace_forward to stop that forward. Needs a workspace on Pro, which publishes on its own host.

NameRequiredDescriptionDefault
slugYesThe new slug
site_idYesThe id of the site
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).
replace_forwardNoTake the address even though it forwards to another site, stopping that forward. Only after the user agreed.

TDQS

A4.6/5.0
Behavior5/5

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

Goes well past the annotations (readOnly=false, idempotent=true, destructive=false) by disclosing that the nanoId permalink survives, the old workspace-host address forwards, and that /lp addresses and campaign links to them break. It also documents normalisation rules, the conflict-refusal path, and the plan requirement. Minor tension with destructiveHint=false exists since lp/campaign links stop resolving, but that is an expected consequence of a rename rather than data destruction.

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 action and its definition, and every clause carries information (forwarding, breakage, normalisation, refusals, plan). The single dense paragraph is long and clause-heavy, which slightly hurts scanability, but nothing is filler.

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 mutation tool with no output schema, the definition covers the side effects, conflict handling, retry path, workspace_id scoping, and plan prerequisite an agent needs to call it safely. Nothing material is left unspecified.

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 100%, so the baseline is 3, but the description adds operational meaning beyond the schema: replace_forward is framed as 'stop that forward' only after user agreement, and slug is characterised by its normalised character set and collision refusal. Useful augmentation on top of an already documented 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 and resource ('Change a site's slug') and immediately defines the slug as 'the last segment of its address on the workspace host', which implicitly separates it from rename_site and set_folder_slug. An agent can identify the operation and its scope 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.

Usage Guidelines4/5

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

Gives clear conditional guidance: ask the user then retry with replace_forward when the address is still forwarding, and notes the Pro-workspace prerequisite. It stops short of explicitly contrasting with sibling tools (rename_site, update_site, set_folder_slug) or stating when a slug change is inappropriate.

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

set_view_passwordSet view passwordA
Idempotent
Inspect

Use when the user wants to put a password on the page. Protects a site behind a view password. Anyone with the link must enter this password before they can view the content. The password is hashed at rest; it is never returned, logged, or echoed back. Re-run with a new value to change it. Pro only; on a plan without it the refusal names the plan, and where one lapsed, how to get it back. Needs edit access to the site (its creator or an editor grant, in a role that can edit); rejected requests (forbidden, plan_limit, validation_failed, not_found) leave the stored password unchanged.

NameRequiredDescriptionDefault
site_idYesThe id of the site to protect
passwordYesThe view password to set; never echoed back in any response
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.4/5.0
Behavior5/5

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

Annotations provide only basic flags (readOnlyHint=false, idempotentHint=true, destructiveHint=false). The description adds substantial behavioral context: password is hashed at rest and never returned/logged/echoed, re-running changes the value (consistent with idempotent hint), rejected requests leave the stored password unchanged, and specific error types are named. This goes beyond annotations and gives the agent a clear picture of side effects and failure behavior.

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?

The description is moderately long but every sentence carries relevant information: use case, mechanism, security properties, change behavior, plan constraints, and error handling. It is front-loaded with the primary purpose. While it could be slightly more concise, the density of useful details justifies the length. Structure is logical and clear.

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?

The tool has 3 parameters (2 required), no output schema, and moderate complexity. The description covers the purpose, when to use it, prerequisites (edit access, Pro plan), behavioral guarantees (hashing, no echo), idempotency, and error outcomes. There is no obvious missing information an agent would need to correctly invoke this tool. It is complete for the given context.

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 100%, so the schema already documents all three parameters (site_id, password, workspace_id) with their descriptions. The tool description does not add new meaning about parameters beyond what is in the schema, such as the fact that password is never echoed (already in schema) or the workspace_id semantics (also in schema). Baseline 3 is appropriate since the schema handles parameter documentation.

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 clearly states the tool sets a view password on a site/page, distinguishing it from siblings like clear_view_password and set_visibility. It uses a specific verb ('put a password'), names the resource (page/site), and explains the effect ('Anyone with the link must enter this password before they can view the content'). This leaves no ambiguity about what the tool does.

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?

The description states the primary trigger ('when the user wants to put a password on the page') and provides practical usage details: re-running with a new value changes the password, Pro plan requirement is noted, and edit-access prerequisites are explained. It does not explicitly contrast with clear_view_password or other alternatives, but the purpose is distinct enough that an agent can infer when to use it. The 'Pro only' and permission conditions are important usage constraints that are clearly stated.

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

set_visibilitySet visibilityA
Idempotent
Inspect

Use when the user says only certain people should see it, make it private, or open it to anyone with the link. Sets a site's visibility. public lets anyone with the link view; allowlist restricts to verified people on the allowlist (Pro only).

NameRequiredDescriptionDefault
site_idYesThe id of the site to update
visibilityYes`public` or `allowlist`
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=true, so the description doesn't need to restate those. The description adds useful behavioral context by explaining the effect of each visibility value ('public' lets anyone with the link view; 'allowlist' restricts to verified people on the allowlist) and notes that 'allowlist' is Pro only. It does not mention side effects like whether existing share links are affected, but the annotations cover the safety profile and the description adds meaningful value beyond them.

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 description is compact and front-loaded: it opens with the user-intent trigger, then states the action, then explains the two enum values. Every sentence earns its place, and there is no redundant restating of the tool name or schema fields. The 'Pro only' note is a valuable constraint included without bloat.

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 two-required-parameter tool with full schema coverage and annotations covering safety and idempotency, the description is nearly complete. It explains the visibility values and the Pro restriction, which are the main non-obvious details. It does not describe the return value, but there is no output schema and the tool is a simple setter, so that is a minor gap. The workspace_id nuance is already fully documented in the schema.

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 100%, so the schema already documents all three parameters. The description adds value by explaining the semantic difference between 'public' and 'allowlist' in plain language, which goes beyond the schema's terse '`public` or `allowlist`' enum description. It also clarifies the user-intent mapping, which helps the agent select the right enum value. The workspace_id parameter is fully documented in the schema, so no additional description is needed.

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 ('Sets a site's visibility') and resource, and clearly distinguishes the two visibility values ('public' lets anyone with the link view; 'allowlist' restricts to verified people). It also opens with user-intent phrasing ('when the user says only certain people should see it, make it private, or open it to anyone with the link'), which makes the tool's purpose immediately recognizable. It is distinct from siblings like set_allowlist and set_collection_access because it focuses on the site-level visibility setting.

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?

The description explicitly states when to use the tool: 'Use when the user says only certain people should see it, make it private, or open it to anyone with the link.' It also explains the meaning of each visibility value, which helps the agent choose between 'public' and 'allowlist'. It does not explicitly name alternative tools, but the when-to-use guidance is strong enough to route the agent correctly.

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

set_workspace_domain_rootSet workspace domain rootA
Idempotent
Inspect

Choose or clear the ROOT site of a workspace-bound domain: the site served at the domain’s bare / (e.g. share.acme.com/). Omit site_id to clear it, making the root a 404 again. Every other path keeps resolving folder and site slugs.

NameRequiredDescriptionDefault
site_idNoThe site to serve at the root; omit to clear
domain_idYesThe workspace domain id from list_custom_domains
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.5/5.0
Behavior4/5

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

The description discloses the key behavioral nuance beyond the annotations: omitting site_id clears the root and makes it return 404 again, while all other paths continue resolving folder and site slugs. Annotations mark the operation idempotent and non-destructive, and the description aligns with those hints, adding concrete outcome context rather than contradicting them.

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?

Three tight sentences carry the entire behavioral model: what the tool does, how to clear, and what is unaffected. The most important action is front-loaded and every sentence earns its place.

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 simple, idempotent write with one required parameter and no output schema, the description is complete: it explains the action, the clearing behavior, and the scope of effect. The one contextual parameter (workspace_id) is already fully described in the input schema, so nothing necessary 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 coverage is 100%, so the baseline is 3, but the description adds meaningful semantics for site_id by stating that omission clears the root and resets it to 404. It also clarifies domain_id is about a workspace-bound domain; workspace_id is already well documented in the 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?

The description opens with a specific verb phrase, 'Choose or clear the ROOT site of a workspace-bound domain,' and pins down the exact resource as the site served at the domain's bare / (e.g. share.acme.com/). This makes it immediately distinguishable from sibling slug/domain operations like set_site_slug or add_custom_domain without needing to open schemas.

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?

It clearly states the operation's context: setting or clearing the root site of a workspace domain, and explains how to clear by omitting site_id. It does not explicitly name alternative tools or exclusion conditions, but the domain-root use case is distinct enough that the context is unambiguous.

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

update_siteUpdate siteA
Idempotent
Inspect

Use when the user wants to push the new version, ship the changes they just made, or update the page while keeping the same link. Replaces a site's content in place by id. Accepts the same inputs as publish_site (html, files as text, a bundle, or a single document such as Markdown, .ipynb, PDF, .docx, .pptx, .xlsx, CSV, an image, a video, an audio, a Mermaid diagram or a text file, which is re-rendered; pass filename for a lone non-zip file, and include_original as on publish_site); the detected content_kind may change, and the result warns when html has replaced a site that was rendered from a file. Preserves the URL, visibility, allowlist, link expiry, and view password, and records a new version. Without a shell, a binary the client cannot send as bytes is dropped by the person on the site's own page, https://app.snaphost.ai/sites/<site_id> ("Upload a new version"), never on the drive, which would make a second site. Open viewers are offered a Refresh to the new content (a landing page, framed in the marketing site, shows it on its next load). Like publish_site, the new content is scanned for window.SNAPHOST data usage and any new collections are set up to match how the page uses them (reported in the result), and for external references the site's security policy will block; relay those to the owner and either trust the approved origins (add_external_origins) or vendor the assets. Relative references to files missing from the upload are reported too; include those files and republish.

NameRequiredDescriptionDefault
htmlNoA single self-contained HTML document, as text. The first choice for one page: it needs no encoding, no shell and no network of your own. At most 3.5 MB once JSON-escaped (a control character other than backspace, tab, newline, form feed and carriage return, `<`, `>`, `&` or any non-ASCII character counts 6 bytes, an emoji 12, and `"`, `\` and `/` 2, so non-ASCII text may count three times its size and markup-heavy text up to six): in practice about 3 MB of plain HTML, about 2 MB when tag-dense; the rest of the 4 MB request body is for the call itself. A bigger page: Trim it, split it across more than one site, give the person the text to save as a file and hand it over, or send it through create_bundle_upload, which needs a shell that makes the SnapHost tool calls itself.
filesNoPlain-text files, each `{path, content}`, zipped for you: a page with its own CSS, JS, JSON or SVG files (name the entry `index.html`), or one Markdown, CSV, Mermaid, notebook, code or .tsx/.jsx React component file on its own, rendered as its kind under its path (a component needs a default export and may import only react, react-dom, recharts, lucide-react, d3, framer-motion and @radix-ui/react-*). Paths are relative to the bundle root with forward slashes (`index.html`, `assets/app.js`). Text only: an image, a font, a PDF or any binary is referenced at a URL (add_external_origins) or sent through create_bundle_upload. At most 100 entries and 2 MB of text in total (UTF-8), and 3.5 MB once JSON-escaped (a control character other than backspace, tab, newline, form feed and carriage return, `<`, `>`, `&` or any non-ASCII character counts 6 bytes, an emoji 12, and `"`, `\` and `/` 2, so non-ASCII text may count three times its size and markup-heavy text up to six): in practice about 2 MB of plain English or 1 MB of non-Latin or tag-dense text. The rest of the 4 MB request body is for the call itself. Like `html`, this works from any client, a chat window with no shell included.
site_idYesThe id of the site to update
filenameNoThe uploaded file's own name with its extension (`report.pdf`, `photo.png`, `data.csv`). Give it once, at create_bundle_upload; a name given here as well must match it. Pass it here only for a single non-zip file whose upload was opened without one, so it is rendered as its kind; an upload that no name describes and that is neither a zip nor an HTML page is refused. For a .docx, .pptx or .xlsx sent as `zipBase64`, give its name here: it heads the bar and names the download. Ignored for a .zip bundle. A name SnapHost does not take is refused with the export that would work.
printableNoThe page is built to print (a PDF that keeps the look): the design check asks for print styles, and a plain page gets the viewer's Print action (a report or a deck carries its own Download PDF button instead). Kept on later updates unless given again.
upload_idNoReference a bundle already uploaded via create_bundle_upload (sent with upload_bundle_part, or PUT to its `upload_url`); use this for a large or binary-carrying app (e.g. a built React site with images and fonts) that `html` or `files` cannot hold, or for a single file that is not text (a PDF, an image, a video, an audio, a .docx, .pptx or .xlsx), sent as it is together with `filename`. Sending the bytes needs a shell that makes the SnapHost tool calls itself; without a shell the person drops the file on the dashboard: the drive (https://app.snaphost.ai/) for a new site, or the site's own page (https://app.snaphost.ai/sites/<site_id>, "Upload a new version") to keep an existing link. Mutually exclusive with `html`, `files` and `zipBase64`.
zipBase64NoBase64-encoded .zip bundle (entry HTML + assets), for a multi-file bundle that holds binaries and fits the 4 MB request body once encoded; a .docx, .pptx or .xlsx (zips themselves) or a one-entry zip holding a single PDF, image, video or audio file under its real name also goes here. Text belongs in `html` or `files` instead: base64 has to be reproduced byte for byte and a long string often is not, so this input is rejected outright if the encoding or the archive checksums do not verify. Producing it needs a shell that makes the SnapHost tool calls itself; a client without one sends text as `files` and hands a binary to the person for the dashboard: the drive (https://app.snaphost.ai/) for a new site, or the site's own page (https://app.snaphost.ai/sites/<site_id>, "Upload a new version") to keep an existing link.
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).
document_kindNoWhat the site is: a report, a presentation, a dashboard, or a plain page (the default). A publish or content update of such a site runs the design check (`design_warnings`); a presentation may go full screen. Kept on later updates unless given again.
include_originalNoWhether readers may download the uploaded file itself from the page. Applies to a Word, PowerPoint or Excel file only, and is off by default for them, because the file holds what the page does not show: speaker notes, hidden slides, sheets, rows and columns, formulas, comments and tracked changes. Pass true to offer it anyway; on update_site, leave it out to keep the live version's choice. A macro-enabled .docm, .pptm or .xlsm is never offered. A CSV, image, video, audio, PDF, diagram or text file is its page and always downloads; a Markdown file or notebook becomes its page and has no download. The result reports `original_included`, and `render_notices` says what the page could not show (cells shown as formulas when a workbook carries no computed values; a file left out for size). Relay a notice to the user.

TDQS

A3.8/5.0
Behavior3/5

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

Well beyond the annotations: it names what is preserved (URL, visibility, allowlist, link expiry, view password), that a new version is recorded, that open viewers get a Refresh, and that content is scanned for `window.SNAPHOST` and external references the security policy will block. However, a great deal of this material (the no-shell fallback, binary handling, size ceilings) is repeated verbatim from the parameter descriptions rather than adding new behavioral disclosure, and the side effect of minting a new version sits in mild tension with idempotentHint=true without being reconciled.

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

Conciseness3/5

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

Front-loaded correctly with the use case, but the body is one sprawling paragraph whose sentences are hard to parse — 'Without a shell, a binary the client cannot send as bytes is dropped by the person on the site's own page, https://app.snaphost.ai/sites/<site_id> ("Upload a new version"), never on the drive, which would make a second site' requires several re-reads. Large chunks duplicate the schema's own parameter text, so length is not fully earned.

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 10-parameter mutation tool with no output schema, the description covers the necessary ground: preserved attributes, version recording, viewer refresh behaviour, security/collection side effects, and warning surfaces such as missing relative files and `html` replacing a file-rendered site. It still does not sketch the result payload (ids, URL, warnings field names) beyond saying things are 'reported in the result', which is the main remaining gap.

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 coverage is 100% and the property descriptions are already exhaustive, so the baseline is 3. The prose only adds light relational meaning — 'accepts the same inputs as publish_site', `filename` for a lone non-zip file, `include_original` as on publish_site, and that the detected `content_kind` may change — which does not materially exceed the 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?

'Replaces a site's content in place by id' states a specific verb, resource and mechanism, and the opening line ('push the new version, ship the changes they just made, update the page while keeping the same link') separates it from publish_site and rollback_site in the agent's mind. The URL-preservation clause further pins down what distinguishes this from creating a 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 Guidelines4/5

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

Trigger phrases are explicit ('ship the changes they just made', 'keeping the same link') and it points to publish_site as the input-compatible alternative plus the dashboard 'Upload a new version' path when no shell is available. It never states the negative case outright — e.g. that a fresh site must go through publish_site or that reverting belongs to rollback_site — so an agent still has to infer the boundary.

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

upload_bundle_partUpload bundle partA
Idempotent
Inspect

Send one numbered slice of a .zip, or of a single non-zip file, into an upload opened by create_bundle_upload, encoded as base64 in this call. This is the route that needs no network beyond the one carrying this tool call, so it works even where the shell's own network is blocked, for a bundle with binaries or a lone PDF, Word, PowerPoint, Excel, image, video or audio file; it needs a shell that makes the SnapHost tool calls itself, and text never comes this way (html or files carry it with no upload). Split the file into slices of at most 1 MB, base64 each slice on its own, and send them as part 0, 1, 2, ... with no gaps; part 0 must be the opening bytes of the archive unless filename names a single non-zip file. Nothing is published until publish_site or update_site is called with the upload_id, which joins the parts in index order and verifies the bytes, so a rejected or damaged part costs only that part: send that index again, the others still stand. Re-sending an index replaces it. Pass the same workspace_id as create_bundle_upload did.

NameRequiredDescriptionDefault
partYes0-based index of this slice in the .zip, sent in order and with no gaps
filenameNoThe single file's own name (`report.pdf`), when the upload is one non-zip file rather than a .zip; part 0 is then not expected to begin an archive. Pass the same name to publish_site / update_site.
upload_idYesThe `upload_id` from create_bundle_upload
partBase64YesThis slice of the file, base64-encoded. It is a slice, not a file of its own, and every slice but the first is meaningless alone. Read it from the encoded file verbatim rather than reproducing it from memory.
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations it discloses the concrete ordering contract (parts 0, 1, 2 with no gaps, part 0 must be the archive's opening bytes), the atomicity/verification behavior at publish time ('joins the parts in index order and verifies the bytes'), and the partial-failure recovery model ('a rejected or damaged part costs only that part'). 'Re-sending an index replaces it' makes idempotentHint concrete, and no statement conflicts with the annotations. Only minor gaps remain (total size limits, upload expiry).

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?

The opening clause is front-loaded with the core action and the pipeline context, and no sentence is filler. It sags slightly in the long 'PDF, Word, PowerPoint, Excel, image, video or audio file' enumeration and the dense semicolon-chained clauses, which could be trimmed into a short procedural list without losing meaning.

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 complex, stateful, multi-call upload tool with no output schema, the description covers the sequencing, chunking, retry, and finalization contract that an agent actually needs. The one material omission is what a successful call returns (an acceptance/offset confirmation), since nothing else describes the response shape.

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 100%, so the baseline is 3, and the description earns an upgrade with facts the schema does not contain: slice size ('at most 1 MB'), the per-slice base64 encoding rule, the part-0 archive-signature constraint, and the requirement to reuse the same filename and workspace_id downstream. Some of the rest (gap-free indexing, filename's meaning) duplicates the schema text, which keeps it off a 5.

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 gives a precise verb+resource+scope: 'Send one numbered slice of a .zip, or of a single non-zip file, into an upload opened by create_bundle_upload.' It also situates itself against siblings by naming create_bundle_upload as the opener and publish_site / update_site as the finalizers, so an agent can place it in the pipeline 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?

It states the selecting condition explicitly — this is the route that works 'even where the shell's own network is blocked' — and names the alternative for the other case ('text never comes this way (`html` or `files` carry it with no upload)'). It also states the pre/post conditions: must follow create_bundle_upload, and nothing is published until publish_site or update_site is called.

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

verify_custom_domainVerify custom domainA
Idempotent
Inspect

Re-check a custom domain's DNS and activate it once the records resolve. Call after adding the DNS records that add_custom_domain returned.

NameRequiredDescriptionDefault
domain_idYesThe domain id from add_custom_domain or list_custom_domains
workspace_idNoOptional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for).

TDQS

A3.9/5.0
Behavior3/5

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

The annotations already indicate readOnlyHint=false (write operation), idempotentHint=true (safe to retry), and destructiveHint=false. The description adds the activation aspect, which is useful but doesn't provide additional behavioral detail beyond what annotations state. It doesn't disclose what happens if DNS doesn't resolve or if activation fails, but that's minor given the idempotent and non-destructive hints.

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 description is concise: two sentences, with the action first and a direct usage instruction. Every word adds value, and it is front-loaded with the core purpose before the usage note. No fluff or repetition of schema details.

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?

The description is sufficient for a two-parameter tool with a clear schema and idempotent annotations. It covers the action, the trigger, and the source of parameters. It lacks details on failure handling or return values, but no output schema exists, so that's expected. It's complete for most agent use cases.

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 100%, so the schema already provides full parameter details, including the source of domain_id and workspace_id semantics. The description adds the context that domain_id is from add_custom_domain or list_custom_domains, which reinforces the schema. Since coverage is high, the baseline is 3, and the description's emphasis on the follow-up role earns a 4.

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 description clearly states the tool's purpose: to re-check DNS records and activate a custom domain once they resolve. It uses specific verbs ('Re-check', 'activate') and a specific resource ('custom domain's DNS'). It distinguishes itself from add_custom_domain by implying it is a follow-up action, though it doesn't explicitly name the sibling.

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?

The description provides clear guidance on when to call this tool: 'Call after adding the DNS records that add_custom_domain returned.' This gives a strong contextual trigger. It doesn't explicitly state when not to use it or mention alternatives like remove_custom_domain, but the primary usage condition is well-defined.

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. 2 tool updates
    • Changedpublish_site4 fields changed
      • addedInput schema / properties / files
        Added value: +{
        +  "description": "Plain-text files, each `{path, content}`, zipped for you: a page with its own CSS, JS, JSON or SVG files (name the entry `index.html`), or one Markdown, CSV, Mermaid, notebook, code or .tsx/.jsx React component file on its own, rendered as its kind under its path (a component needs a default export and may import only react, react-dom, recharts, lucide-react, d3, framer-motion and @radix-ui/react-*). Paths are relative to the bundle root with forward slashes (`index.html`, `assets/app.js`). Text only: an image, a font, a PDF or any binary is referenced at a URL (add_external_origins) or sent through create_bundle_upload. At most 100 entries and 2 MB of text in total (UTF-8), and 3.5 MB once JSON-escaped (a control character other than backspace, tab, newline, form feed and carriage return, `<`, `>`, `&` or any non-ASCII character counts 6 bytes, an emoji 12, and `\"`, `\\` and `/` 2, so non-ASCII text may count three times its size and markup-heavy text up to six): in practice about 2 MB of plain English or 1 MB of non-Latin or tag-dense text. The rest of the 4 MB request body is for the call itself. Like `html`, this works from any client, a chat window with no shell included.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "content": {
        +        "description": "The file as UTF-8 text",
        +        "type": "string"
        +      },
        +      "path": {
        +        "description": "Relative path inside the bundle, spelled exactly as the page's own references spell it (two Unicode spellings of one accented name count as one entry)",
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "path",
        +      "content"
        +    ],
        +    "type": "object"
        +  },
        +  "maxItems": 100,
        +  "minItems": 1,
        +  "type": "array"
        +}
      • changedInput schema / properties / html / description
        Previous value: -"A single self-contained HTML document"New value: +"A single self-contained HTML document, as text. The first choice for one page: it needs no encoding, no shell and no network of your own. At most 3.5 MB once JSON-escaped (a control character other than backspace, tab, newline, form feed and carriage return, `<`, `>`, `&` or any non-ASCII character counts 6 bytes, an emoji 12, and `\"`, `\\` and `/` 2, so non-ASCII text may count three times its size and markup-heavy text up to six): in practice about 3 MB of plain HTML, about 2 MB when tag-dense; the rest of the 4 MB request body is for the call itself. A bigger page: Trim it, split it across more than one site, give the person the text to save as a file and hand it over, or send it through create_bundle_upload, which needs a shell that makes the SnapHost tool calls itself."
      • changedInput schema / properties / upload_id / description
        Previous value: -"Reference a bundle already uploaded via create_bundle_upload (sent with upload_bundle_part, or PUT to its `upload_url`); use this for a large or multi-file app (e.g. a built React site) that exceeds the inline `html`/`zipBase64` limit, or for a single file that is not a zip (Markdown, a notebook, a PDF, an image, a video, an audio, a CSV, a Mermaid diagram or a text file), sent as it is together with `filename`. Mutually exclusive with `html` and `zipBase64`."New value: +"Reference a bundle already uploaded via create_bundle_upload (sent with upload_bundle_part, or PUT to its `upload_url`); use this for a large or binary-carrying app (e.g. a built React site with images and fonts) that `html` or `files` cannot hold, or for a single file that is not text (a PDF, an image, a video, an audio, a .docx, .pptx or .xlsx), sent as it is together with `filename`. Sending the bytes needs a shell that makes the SnapHost tool calls itself; without a shell the person drops the file on the dashboard: the drive (https://app.snaphost.ai/) for a new site, or the site's own page (https://app.snaphost.ai/sites/<site_id>, \"Upload a new version\") to keep an existing link. Mutually exclusive with `html`, `files` and `zipBase64`."
      • changedInput schema / properties / zipBase64 / description
        Previous value: -"Base64-encoded .zip bundle (entry HTML + assets), for a multi-file bundle small enough to inline; a .docx, .pptx or .xlsx (zips themselves) or a one-entry zip holding a single Markdown, notebook, PDF, CSV, image, video, audio, Mermaid or text file under its real name also goes here. A single HTML document belongs in `html` instead: base64 has to be reproduced byte for byte and a long string often is not, so this input is rejected outright if the encoding or the archive checksums do not verify."New value: +"Base64-encoded .zip bundle (entry HTML + assets), for a multi-file bundle that holds binaries and fits the 4 MB request body once encoded; a .docx, .pptx or .xlsx (zips themselves) or a one-entry zip holding a single PDF, image, video or audio file under its real name also goes here. Text belongs in `html` or `files` instead: base64 has to be reproduced byte for byte and a long string often is not, so this input is rejected outright if the encoding or the archive checksums do not verify. Producing it needs a shell that makes the SnapHost tool calls itself; a client without one sends text as `files` and hands a binary to the person for the dashboard: the drive (https://app.snaphost.ai/) for a new site, or the site's own page (https://app.snaphost.ai/sites/<site_id>, \"Upload a new version\") to keep an existing link."
    • Changedupdate_site4 fields changed
      • addedInput schema / properties / files
        Added value: +{
        +  "description": "Plain-text files, each `{path, content}`, zipped for you: a page with its own CSS, JS, JSON or SVG files (name the entry `index.html`), or one Markdown, CSV, Mermaid, notebook, code or .tsx/.jsx React component file on its own, rendered as its kind under its path (a component needs a default export and may import only react, react-dom, recharts, lucide-react, d3, framer-motion and @radix-ui/react-*). Paths are relative to the bundle root with forward slashes (`index.html`, `assets/app.js`). Text only: an image, a font, a PDF or any binary is referenced at a URL (add_external_origins) or sent through create_bundle_upload. At most 100 entries and 2 MB of text in total (UTF-8), and 3.5 MB once JSON-escaped (a control character other than backspace, tab, newline, form feed and carriage return, `<`, `>`, `&` or any non-ASCII character counts 6 bytes, an emoji 12, and `\"`, `\\` and `/` 2, so non-ASCII text may count three times its size and markup-heavy text up to six): in practice about 2 MB of plain English or 1 MB of non-Latin or tag-dense text. The rest of the 4 MB request body is for the call itself. Like `html`, this works from any client, a chat window with no shell included.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "content": {
        +        "description": "The file as UTF-8 text",
        +        "type": "string"
        +      },
        +      "path": {
        +        "description": "Relative path inside the bundle, spelled exactly as the page's own references spell it (two Unicode spellings of one accented name count as one entry)",
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "path",
        +      "content"
        +    ],
        +    "type": "object"
        +  },
        +  "maxItems": 100,
        +  "minItems": 1,
        +  "type": "array"
        +}
      • changedInput schema / properties / html / description
        Previous value: -"A single self-contained HTML document"New value: +"A single self-contained HTML document, as text. The first choice for one page: it needs no encoding, no shell and no network of your own. At most 3.5 MB once JSON-escaped (a control character other than backspace, tab, newline, form feed and carriage return, `<`, `>`, `&` or any non-ASCII character counts 6 bytes, an emoji 12, and `\"`, `\\` and `/` 2, so non-ASCII text may count three times its size and markup-heavy text up to six): in practice about 3 MB of plain HTML, about 2 MB when tag-dense; the rest of the 4 MB request body is for the call itself. A bigger page: Trim it, split it across more than one site, give the person the text to save as a file and hand it over, or send it through create_bundle_upload, which needs a shell that makes the SnapHost tool calls itself."
      • changedInput schema / properties / upload_id / description
        Previous value: -"Reference a bundle already uploaded via create_bundle_upload (sent with upload_bundle_part, or PUT to its `upload_url`); use this for a large or multi-file app (e.g. a built React site) that exceeds the inline `html`/`zipBase64` limit, or for a single file that is not a zip (Markdown, a notebook, a PDF, an image, a video, an audio, a CSV, a Mermaid diagram or a text file), sent as it is together with `filename`. Mutually exclusive with `html` and `zipBase64`."New value: +"Reference a bundle already uploaded via create_bundle_upload (sent with upload_bundle_part, or PUT to its `upload_url`); use this for a large or binary-carrying app (e.g. a built React site with images and fonts) that `html` or `files` cannot hold, or for a single file that is not text (a PDF, an image, a video, an audio, a .docx, .pptx or .xlsx), sent as it is together with `filename`. Sending the bytes needs a shell that makes the SnapHost tool calls itself; without a shell the person drops the file on the dashboard: the drive (https://app.snaphost.ai/) for a new site, or the site's own page (https://app.snaphost.ai/sites/<site_id>, \"Upload a new version\") to keep an existing link. Mutually exclusive with `html`, `files` and `zipBase64`."
      • changedInput schema / properties / zipBase64 / description
        Previous value: -"Base64-encoded .zip bundle (entry HTML + assets), for a multi-file bundle small enough to inline; a .docx, .pptx or .xlsx (zips themselves) or a one-entry zip holding a single Markdown, notebook, PDF, CSV, image, video, audio, Mermaid or text file under its real name also goes here. A single HTML document belongs in `html` instead: base64 has to be reproduced byte for byte and a long string often is not, so this input is rejected outright if the encoding or the archive checksums do not verify."New value: +"Base64-encoded .zip bundle (entry HTML + assets), for a multi-file bundle that holds binaries and fits the 4 MB request body once encoded; a .docx, .pptx or .xlsx (zips themselves) or a one-entry zip holding a single PDF, image, video or audio file under its real name also goes here. Text belongs in `html` or `files` instead: base64 has to be reproduced byte for byte and a long string often is not, so this input is rejected outright if the encoding or the archive checksums do not verify. Producing it needs a shell that makes the SnapHost tool calls itself; a client without one sends text as `files` and hands a binary to the person for the dashboard: the drive (https://app.snaphost.ai/) for a new site, or the site's own page (https://app.snaphost.ai/sites/<site_id>, \"Upload a new version\") to keep an existing link."
  2. 6 tool updates
    • Addeddelete_webhook
    • Addedlist_webhooks
    • Changedpublish_site1 field changed
      • changedInput schema / properties / slug / description
        Previous value: -"Slug, unique within the drive the site is filed in; reuse it with the same folder_id or space to update the same site at the same URL. For a landing page the slug IS the address under /lp: pass exactly the path you were asked for; omitted, it is derived from the title and the page lands at a different address. A slug already used by a site elsewhere on the drive is refused."New value: +"Slug, unique within the drive the site is filed in; reuse it with the same folder_id or space to update the same site at the same URL. For a landing page the slug IS the address under /lp: pass exactly the path you were asked for; omitted, it is derived from the title and the page lands at a different address. A slug already used by a site elsewhere on the drive is refused, and so is one that is another site’s old address (the refusal says where that site went: update it instead of publishing a second one)."
    • Addedregister_webhook
    • Addedremove_site_forward
    • Changedset_site_slug1 field changed
      • addedInput schema / properties / replace_forward
        Added value: +{
        +  "description": "Take the address even though it forwards to another site, stopping that forward. Only after the user agreed.",
        +  "type": "boolean"
        +}
  3. 2 tool updates
    • Addedset_brand_guidelines
    • Changedset_brand_kit1 field changed
      • removedInput schema / properties / guidelines_url
        Removed value: -{
        -  "description": "https URL of the brand guidelines, a public web page or PDF; \"\" clears it, omitted keeps it. Owner only.",
        -  "type": "string"
        -}
  4. 1 tool update
    • Changedset_brand_kit1 field changed
      • addedInput schema / properties / guidelines_url
        Added value: +{
        +  "description": "https URL of the brand guidelines, a public web page or PDF; \"\" clears it, omitted keeps it. Owner only.",
        +  "type": "string"
        +}
  5. 4 tool updates
    • Changedpublish_site1 field changed
      • changedInput schema / properties / printable / description
        Previous value: -"The page is built to print (a PDF that keeps the look): the viewer then offers Print, and the design check asks for print styles. Kept on later updates unless given again."New value: +"The page is built to print (a PDF that keeps the look): the design check asks for print styles, and a plain page gets the viewer's Print action (a report or a deck carries its own Download PDF button instead). Kept on later updates unless given again."
    • Changedset_brand_kit1 field changed
      • addedInput schema / properties / style
        Added value: +{
        +  "description": "The look, read off the site: radius from its buttons and cards, density from its white space, emphasis from its display type (calm or bold headlines), cover from its hero, surfaces from whether it boxes content in tinted panels or separates it with rules. Leave `style` out on a later save to keep the look the kit has; a first save without it takes the neutral look (soft, regular, calm, dark, tinted).",
        +  "properties": {
        +    "cover": {
        +      "enum": [
        +        "dark",
        +        "light",
        +        "split"
        +      ],
        +      "type": "string"
        +    },
        +    "density": {
        +      "enum": [
        +        "airy",
        +        "regular",
        +        "dense"
        +      ],
        +      "type": "string"
        +    },
        +    "emphasis": {
        +      "enum": [
        +        "calm",
        +        "bold"
        +      ],
        +      "type": "string"
        +    },
        +    "radius": {
        +      "enum": [
        +        "sharp",
        +        "soft",
        +        "round"
        +      ],
        +      "type": "string"
        +    },
        +    "surfaces": {
        +      "enum": [
        +        "tinted",
        +        "ruled"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedset_render_options1 field changed
      • changedInput schema / properties / printable / description
        Previous value: -"The page is built to print (a PDF that keeps the look): the viewer then offers Print, and the design check asks for print styles. Kept on later updates unless given again."New value: +"The page is built to print (a PDF that keeps the look): the design check asks for print styles, and a plain page gets the viewer's Print action (a report or a deck carries its own Download PDF button instead). Kept on later updates unless given again."
    • Changedupdate_site1 field changed
      • changedInput schema / properties / printable / description
        Previous value: -"The page is built to print (a PDF that keeps the look): the viewer then offers Print, and the design check asks for print styles. Kept on later updates unless given again."New value: +"The page is built to print (a PDF that keeps the look): the design check asks for print styles, and a plain page gets the viewer's Print action (a report or a deck carries its own Download PDF button instead). Kept on later updates unless given again."
  6. 7 tool updates
    • Addedget_design_guide
    • Addedget_page_recipe
    • Addedlist_page_recipes
    • Changedpublish_site2 fields changed
      • addedInput schema / properties / document_kind
        Added value: +{
        +  "description": "What the site is: a report, a presentation, a dashboard, or a plain page (the default). A publish or content update of such a site runs the design check (`design_warnings`); a presentation may go full screen. Kept on later updates unless given again.",
        +  "enum": [
        +    "page",
        +    "report",
        +    "presentation",
        +    "dashboard"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / printable
        Added value: +{
        +  "description": "The page is built to print (a PDF that keeps the look): the viewer then offers Print, and the design check asks for print styles. Kept on later updates unless given again.",
        +  "type": "boolean"
        +}
    • Addedset_brand_kit
    • Changedset_render_options2 fields changed
      • addedInput schema / properties / document_kind
        Added value: +{
        +  "description": "What the site is: a report, a presentation, a dashboard, or a plain page (the default). A publish or content update of such a site runs the design check (`design_warnings`); a presentation may go full screen. Kept on later updates unless given again.",
        +  "enum": [
        +    "page",
        +    "report",
        +    "presentation",
        +    "dashboard"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / printable
        Added value: +{
        +  "description": "The page is built to print (a PDF that keeps the look): the viewer then offers Print, and the design check asks for print styles. Kept on later updates unless given again.",
        +  "type": "boolean"
        +}
    • Changedupdate_site2 fields changed
      • addedInput schema / properties / document_kind
        Added value: +{
        +  "description": "What the site is: a report, a presentation, a dashboard, or a plain page (the default). A publish or content update of such a site runs the design check (`design_warnings`); a presentation may go full screen. Kept on later updates unless given again.",
        +  "enum": [
        +    "page",
        +    "report",
        +    "presentation",
        +    "dashboard"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / printable
        Added value: +{
        +  "description": "The page is built to print (a PDF that keeps the look): the viewer then offers Print, and the design check asks for print styles. Kept on later updates unless given again.",
        +  "type": "boolean"
        +}
  7. 1 tool update
    • Changedset_render_options1 field changed
      • addedInput schema / properties / auto_refresh
        Added value: +{
        +  "description": "Reload open viewers on their own when a new version is published, instead of offering a Refresh prompt",
        +  "type": "boolean"
        +}
  8. 6 tool updates
    • Changedcreate_bundle_upload1 field changed
      • addedInput schema / properties / filename
        Added value: +{
        +  "description": "The single file's own name with its extension (`report.pdf`, `talk.mp4`), when the upload is one non-zip file rather than a .zip. The upload then remembers it: the parts and the publish need not repeat it. Omit for a .zip.",
        +  "type": "string"
        +}
    • Changedget_site_content1 field changed
      • addedInput schema / properties / original
        Added value: +{
        +  "description": "Fetch the uploaded file the page carries for download (a .pptx, an image, a CSV) instead of the rendered page",
        +  "type": "boolean"
        +}
    • Changedpublish_site4 fields changed
      • addedInput schema / properties / filename
        Added value: +{
        +  "description": "The uploaded file's own name with its extension (`report.pdf`, `photo.png`, `data.csv`). Give it once, at create_bundle_upload; a name given here as well must match it. Pass it here only for a single non-zip file whose upload was opened without one, so it is rendered as its kind; an upload that no name describes and that is neither a zip nor an HTML page is refused. For a .docx, .pptx or .xlsx sent as `zipBase64`, give its name here: it heads the bar and names the download. Ignored for a .zip bundle. A name SnapHost does not take is refused with the export that would work.",
        +  "type": "string"
        +}
      • addedInput schema / properties / include_original
        Added value: +{
        +  "description": "Whether readers may download the uploaded file itself from the page. Applies to a Word, PowerPoint or Excel file only, and is off by default for them, because the file holds what the page does not show: speaker notes, hidden slides, sheets, rows and columns, formulas, comments and tracked changes. Pass true to offer it anyway; on update_site, leave it out to keep the live version's choice. A macro-enabled .docm, .pptm or .xlsm is never offered. A CSV, image, video, audio, PDF, diagram or text file is its page and always downloads; a Markdown file or notebook becomes its page and has no download. The result reports `original_included`, and `render_notices` says what the page could not show (cells shown as formulas when a workbook carries no computed values; a file left out for size). Relay a notice to the user.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / upload_id / description
        Previous value: -"Reference a bundle already uploaded via create_bundle_upload (sent with upload_bundle_part, or PUT to its `upload_url`); use this for a large or multi-file app (e.g. a built React site) that exceeds the inline `html`/`zipBase64` limit. Mutually exclusive with `html` and `zipBase64`."New value: +"Reference a bundle already uploaded via create_bundle_upload (sent with upload_bundle_part, or PUT to its `upload_url`); use this for a large or multi-file app (e.g. a built React site) that exceeds the inline `html`/`zipBase64` limit, or for a single file that is not a zip (Markdown, a notebook, a PDF, an image, a video, an audio, a CSV, a Mermaid diagram or a text file), sent as it is together with `filename`. Mutually exclusive with `html` and `zipBase64`."
      • changedInput schema / properties / zipBase64 / description
        Previous value: -"Base64-encoded .zip bundle (entry HTML + assets), for a multi-file bundle small enough to inline. A single HTML document belongs in `html` instead: base64 has to be reproduced byte for byte and a long string often is not, so this input is rejected outright if the encoding or the archive checksums do not verify."New value: +"Base64-encoded .zip bundle (entry HTML + assets), for a multi-file bundle small enough to inline; a .docx, .pptx or .xlsx (zips themselves) or a one-entry zip holding a single Markdown, notebook, PDF, CSV, image, video, audio, Mermaid or text file under its real name also goes here. A single HTML document belongs in `html` instead: base64 has to be reproduced byte for byte and a long string often is not, so this input is rejected outright if the encoding or the archive checksums do not verify."
    • Changedset_render_options1 field changed
      • addedInput schema / properties / include_original
        Added value: +{
        +  "description": "false: stop offering the Office file this site renders for download (a new version, rendered from the file already held). true is refused; upload the file again with update_site and `include_original` true.",
        +  "type": "boolean"
        +}
    • Changedupdate_site4 fields changed
      • addedInput schema / properties / filename
        Added value: +{
        +  "description": "The uploaded file's own name with its extension (`report.pdf`, `photo.png`, `data.csv`). Give it once, at create_bundle_upload; a name given here as well must match it. Pass it here only for a single non-zip file whose upload was opened without one, so it is rendered as its kind; an upload that no name describes and that is neither a zip nor an HTML page is refused. For a .docx, .pptx or .xlsx sent as `zipBase64`, give its name here: it heads the bar and names the download. Ignored for a .zip bundle. A name SnapHost does not take is refused with the export that would work.",
        +  "type": "string"
        +}
      • addedInput schema / properties / include_original
        Added value: +{
        +  "description": "Whether readers may download the uploaded file itself from the page. Applies to a Word, PowerPoint or Excel file only, and is off by default for them, because the file holds what the page does not show: speaker notes, hidden slides, sheets, rows and columns, formulas, comments and tracked changes. Pass true to offer it anyway; on update_site, leave it out to keep the live version's choice. A macro-enabled .docm, .pptm or .xlsm is never offered. A CSV, image, video, audio, PDF, diagram or text file is its page and always downloads; a Markdown file or notebook becomes its page and has no download. The result reports `original_included`, and `render_notices` says what the page could not show (cells shown as formulas when a workbook carries no computed values; a file left out for size). Relay a notice to the user.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / upload_id / description
        Previous value: -"Reference a bundle already uploaded via create_bundle_upload (sent with upload_bundle_part, or PUT to its `upload_url`); use this for a large or multi-file app (e.g. a built React site) that exceeds the inline `html`/`zipBase64` limit. Mutually exclusive with `html` and `zipBase64`."New value: +"Reference a bundle already uploaded via create_bundle_upload (sent with upload_bundle_part, or PUT to its `upload_url`); use this for a large or multi-file app (e.g. a built React site) that exceeds the inline `html`/`zipBase64` limit, or for a single file that is not a zip (Markdown, a notebook, a PDF, an image, a video, an audio, a CSV, a Mermaid diagram or a text file), sent as it is together with `filename`. Mutually exclusive with `html` and `zipBase64`."
      • changedInput schema / properties / zipBase64 / description
        Previous value: -"Base64-encoded .zip bundle (entry HTML + assets), for a multi-file bundle small enough to inline. A single HTML document belongs in `html` instead: base64 has to be reproduced byte for byte and a long string often is not, so this input is rejected outright if the encoding or the archive checksums do not verify."New value: +"Base64-encoded .zip bundle (entry HTML + assets), for a multi-file bundle small enough to inline; a .docx, .pptx or .xlsx (zips themselves) or a one-entry zip holding a single Markdown, notebook, PDF, CSV, image, video, audio, Mermaid or text file under its real name also goes here. A single HTML document belongs in `html` instead: base64 has to be reproduced byte for byte and a long string often is not, so this input is rejected outright if the encoding or the archive checksums do not verify."
    • Changedupload_bundle_part2 fields changed
      • addedInput schema / properties / filename
        Added value: +{
        +  "description": "The single file's own name (`report.pdf`), when the upload is one non-zip file rather than a .zip; part 0 is then not expected to begin an archive. Pass the same name to publish_site / update_site.",
        +  "type": "string"
        +}
      • changedInput schema / properties / partBase64 / description
        Previous value: -"This slice of the .zip, base64-encoded. It is a slice of the archive, not an archive of its own, and every slice but the first is meaningless alone. Read it from the encoded file verbatim rather than reproducing it from memory."New value: +"This slice of the file, base64-encoded. It is a slice, not a file of its own, and every slice but the first is meaningless alone. Read it from the encoded file verbatim rather than reproducing it from memory."
  9. 51 tool updates
    • Changedadd_custom_domain1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedadd_external_origins1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedadd_to_allowlist1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedapply_data_template1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedapprove_access_request1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedclear_view_password1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedcreate_bundle_upload1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedcreate_folder1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedcreate_share_link1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changeddefine_collection_schema1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changeddelete_collection1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changeddelete_folder1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changeddelete_site1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changeddelete_site_record1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changeddeny_access_request1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedexport_site_data1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedget_brand_kit1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedget_site1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedget_site_content1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedlist_access_requests1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedlist_allowlist1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedlist_custom_domains1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedlist_data_recipes1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedlist_folders1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedlist_site_collections1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedlist_sites1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedlist_versions1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedlist_workspaces1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedmove_folder1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedmove_site_to_folder1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedpublish_site2 fields changed
      • changedInput schema / properties / folder_id / description
        Previous value: -"File the new site into this folder (folder_id from list_folders). A landing page goes into the website workspace’s Marketing folder: pass that workspace’s workspace_id as well; without it the site lands in your own account and is not a landing page, whatever its slug."New value: +"File the new site into this folder (folder_id from list_folders). A landing page goes into the website workspace’s Marketing folder: pass that workspace’s workspace_id as well; without it the publish is refused on a connection that reaches several workspaces (and lands in the personal space on one that reaches only it), and the site is not a landing page, whatever its slug."
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedquery_site_records1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedremove_custom_domain1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedremove_from_allowlist1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedrename_folder1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedrename_site1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedrollback_site1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedset_allowlist1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedset_collection_access1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedset_folder_slug1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedset_link_expiry1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedset_link_status1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedset_render_options1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedset_site_data1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedset_site_slug1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedset_view_password1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedset_visibility1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedset_workspace_domain_root1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedupdate_site1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedupload_bundle_part1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
    • Changedverify_custom_domain1 field changed
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Optional: the workspace (the personal space or a Pro workspace) to act in, from list_workspaces. Omit to act in the token owner's own account."New value: +"Optional: the workspace to act in, from list_workspaces (the connection reaches the person's personal space and every workspace they are a member of). Required on a write when the connection reaches more than one workspace. Omit to act in the personal space (for an older single-workspace connection, the one workspace it was authorized for)."
  10. 51 tool updates
    • First observedadd_custom_domain
    • First observedadd_external_origins
    • First observedadd_to_allowlist
    • First observedapply_data_template
    • First observedapprove_access_request
    • First observedclear_view_password
    • First observedcreate_bundle_upload
    • First observedcreate_folder
    • First observedcreate_share_link
    • First observeddefine_collection_schema
    • First observeddelete_collection
    • First observeddelete_folder
    • First observeddelete_site
    • First observeddelete_site_record
    • First observeddeny_access_request
    • First observedexport_site_data
    • First observedget_brand_kit
    • First observedget_site
    • First observedget_site_content
    • First observedlist_access_requests
    • First observedlist_allowlist
    • First observedlist_custom_domains
    • First observedlist_data_recipes
    • First observedlist_folders
    • First observedlist_site_collections
    • First observedlist_sites
    • First observedlist_versions
    • First observedlist_workspaces
    • First observedmove_folder
    • First observedmove_site_to_folder
    • First observedpublish_site
    • First observedquery_site_records
    • First observedremove_custom_domain
    • First observedremove_from_allowlist
    • First observedrename_folder
    • First observedrename_site
    • First observedrollback_site
    • First observedset_allowlist
    • First observedset_collection_access
    • First observedset_folder_slug
    • First observedset_link_expiry
    • First observedset_link_status
    • First observedset_render_options
    • First observedset_site_data
    • First observedset_site_slug
    • First observedset_view_password
    • First observedset_visibility
    • First observedset_workspace_domain_root
    • First observedupdate_site
    • First observedupload_bundle_part
    • First observedverify_custom_domain

Publisher details

Operator
SnapHost · Publisher source
Vendor relationship
First-party · Publisher source
Restrictions
Free plan included. Private sharing, custom domains and the data layer require a Pro plan. OAuth 2.1 with dynamic client registration, no custom OAuth app needed.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    F
    maintenance
    Enables publishing and updating Claude artifacts or HTML to private, access-controlled links directly from Claude.
    1
    AGPL 3.0
  • A
    license
    A
    quality
    A
    maintenance
    Lets AI assistants share HTML they generate as a private, end-to-end encrypted link, and update the page later at the same link. The page is encrypted locally before upload, the key stays in the link, and no account is needed.
    2
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Turns Claude and Codex JSONL transcripts into sanitized, unlisted links with explicit approval, exposing share management via OAuth-protected MCP endpoints.
    1
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.