Sitelas
Server Details
Build a real website from a chat — then run it: read messages, check traffic, publish changes.
- Status
- Healthy
- Uptime
- 0.4% over 66 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 52 tools
The tool set has several overlapping clusters: page/content/collection creation, multiple structural edit primitives (insert_nodes, patch_nodes, patch_fixture, move_nodes, remove_nodes), and several read/check tools (get_page, read_rendered_page, screenshot_page, review_site). The descriptions work hard to draw boundaries and call out wrong-tool usage, but the sheer breadth means an agent must still choose carefully among similar-sounding tools.
Tool names are consistently snake_case and almost entirely follow a predictable verb_noun pattern such as get_site, list_sites, create_collection, delete_content_item, and update_seo. Minor variations like undo and publish are still readable and fit the domain without mixing conventions.
At 52 tools, the surface is far beyond the typical well-scoped range and imposes a heavy selection burden on an agent. The domain is broad, so many tools are genuinely useful, but the count creates avoidable confusion across creation, editing, media, domains, SEO, analytics, and submission workflows.
The surface covers a full site-building lifecycle: templates and fixtures, pages, collections and content items, themes, images, publishing, custom domains, SEO, analytics, forms/submissions, contacts, tracking codes, and undo. Minor gaps exist, such as no obvious image deletion tool and no standalone form-creation tool outside section kinds, but core workflows are well represented.
Available Tools
52 toolsadd_content_itemAdd to collectionAIdempotentInspect
Create a new content_items row for a site under a given content_type slug — this is the RIGHT tool for adding any repeating detail page (/projects/<slug>, /blog/<slug>, /searches/<slug>, /publications/<slug>, /work/<slug>, /talks/<slug>, /teaching/<slug>, etc.) when the site already declares a matching collections[] entry. The row is written to the site's DRAFT version, so it shows on the index page's <collection-list> and its detail URL /<prefix>/<slug> in PREVIEW right away (via the collection's template + Mustache substitution); it goes public on the next publish. DO NOT use add_page for detail pages of an existing collection — that creates a static page that the index won't reflect and sitemap won't auto-emit.
IMAGES IN content: source them yourself with find_images or upload_image (with url) — that is the normal path and needs nothing from the person. An image-typed field holds an OBJECT: { "url": "https://…", "alt": "what is in the picture" }. A bare URL string is accepted and stored as { url }, but send alt when you can — it is the only description a screen reader gets, and the template may render it. Check the field's declared type with list_content_types before composing: a url-typed field takes the plain string instead. But if they want THEIR OWN picture on an item (their product shot, their photo of the venue), do not try to carry the file: create the item with the text, then give them get_editor_link with page_slug set to that item's path (e.g. 'blog/my-first-post') so they can drop the original straight onto it.
content is validated against the content_type's JSON schema (lenient/open): required fields must be present and non-empty, declared fields must match their type, extra fields are allowed. Include every field the collection's template references — missing fields render as empty strings in the detail page. visibility defaults to 'public' (anonymous-readable).
SLUG BEHAVIOR (idempotent): re-calling with the SAME slug + identical content is a safe no-op — it returns success with already_existed:true (no error), so a retried write after a dropped connection won't double-post. Re-using the same slug with DIFFERENT content is a real collision and throws ConflictError — pick another slug or use edit_content_item to change the existing row.
If the site doesn't yet have a matching collections[] entry, add one first via create_collection (composes the collections[] entry + optional index page + items[] in one call). Each site defines its own schemas inline at collections[i].fields — there is no global content-type catalog; what shapes exist for a site is whatever the site's draft_fixture declares.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Single-segment kebab-case slug (lowercase alphanumeric + dashes, no slashes, no leading/trailing dashes). The DB enforces this via a CHECK constraint; invalid slugs are rejected at insert time. | |
| content | Yes | ||
| site_id | Yes | ||
| visibility | No | public | |
| content_type | Yes | ||
| published_at | No | ISO-8601 timestamp used as the item's `publishedAt` for ordering. Defaults to now if omitted (and left untouched if `content.publishedAt` is already set). Sort a collection-list newest-first with sortBy:'publishedAt', sortDir:'desc' — more reliable than created_at, which can tie on bulk/automated inserts. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readOnly, idempotent, non-destructive, closed-world, but the description adds substantive behavior beyond them: writes land in the DRAFT version and only go public on publish, idempotent retry semantics with the already_existed:true return, and ConflictError on slug reuse with different content. It also discloses validation leniency (required fields enforced, extra fields allowed, missing template fields render as empty strings) and the visibility default of public.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the routing sentence and the add_page exclusion before any detail, which is the right order. It is long (~350 words) and the image paragraph is discursive, but each section — routing, images, validation, slug behavior, prerequisite — carries non-redundant information, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema and thin schema coverage, this is near-complete: it covers the draft/publish lifecycle, validation contract, error/retry behavior, prerequisite collection existence, and the return marker already_existed:true. The gaps are minor — site_id is never characterized and the full success payload shape is only hinted at.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema coverage at 33%, the description must carry weight and largely does: content is explained as a JSON object validated against the content_type schema, image-typed fields are documented as {url, alt} objects versus url-typed plain strings, content_type is tied to a site's inline collections[].fields, and slug idempotency semantics are spelled out. site_id and published_at get no treatment in the description, leaving two of six parameters to the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource ('Create a new content_items row for a site under a given content_type slug') and enumerates the exact URL patterns it serves. It explicitly carves itself out from the sibling add_page, so an agent can route 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use, an explicit when-NOT-to-use ('DO NOT use add_page for detail pages of an existing collection') with the reason (index won't reflect it, sitemap won't emit). It also names the correct alternatives in each branch: create_collection when no collections[] entry exists, edit_content_item on slug collision, find_images/upload_image for images, and get_editor_link for user-supplied files.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_pageAdd pageAInspect
Add a new ONE-OFF page to an existing site (About, Contact, Pricing, a new landing page, etc.). Creates a bare shell (one section with one heading) and returns its root + section ids so you can fill it with insert_nodes / patch_nodes. Writes a new draft version. Pass copy_of with an existing page's slug to start from a copy of that page instead.
DO NOT use add_page for repeating detail pages that share structure (/projects/<slug>, /blog/<slug>, /work/<slug>, /publications/<slug>, /searches/<slug>, etc.). Those resolve via the site's collections[] definition + Mustache substitution into a single shared template — they are NOT pages[] entries. To add an item to an existing collection, use add_content_item (with the matching content_type). To stand up a new collection on a site that doesn't yet have one, use create_collection (which composes the collections[] entry, an index page, and optional seed items in one call). add_page is wrong every time for collection detail pages: it bakes the row as a static tree, the index page's <collection-list> won't reflect it, and sitemap/SEO won't see it.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | ||
| title | Yes | ||
| copy_of | No | Make the new page a COPY of this existing page (e.g. '/services/plumbing' to start '/services/roofing' from it): its whole tree is cloned with fresh ids, then edit the copy. Omit for a page built from the site's own sections. | |
| site_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (non-destructive write), but the description adds real behaviour: creates a bare shell of one section + one heading, returns root and section ids for insert_nodes/patch_nodes, writes a new draft version, and what breaks if misused (baked static tree, collection-list won't reflect, sitemap/SEO miss). That is 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and return shape, then the exclusion. The parenthetical lists of example slugs are a bit heavy, but each clause carries real routing or behavioural information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating tool with no output schema, the description still discloses the return value (root + section ids) and the follow-up tools to use. Combined with the exclusion section, an agent has everything needed to call it correctly or route elsewhere.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 25%, so the description carries much of the burden: it explains `copy_of` semantics and the slug-vs-title expectation implicitly through the example copy flow. The remaining params (slug, title, site_id) are self-evident, so no significant gap remains.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource with scope: creates a one-off page, not a collection detail page. It explicitly distinguishes itself from its nearest siblings (add_content_item, create_collection) by naming the cases it does not handle.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (About/Contact/Pricing/landing pages), an explicit DO-NOT-use condition (path-parameterised detail pages) and names the correct alternatives for each case. The failure mode of misusing it is also spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_sectionAdd a sectionAInspect
Add a complete, hand-fixture-quality section to a page from a FLAT description — no node-tree authoring. Pick a kind, pass page_slug + the copy fields (eyebrow, heading, body, CTAs) and, for list-based kinds, an items[] array of flat cards/rows. The tool builds a correct section > container > stack > [...] subtree (theme tokens, Lucide icons, responsive grids, real spacing, every text/CTA independently editable) and splices it into the page, saved as one draft. Kinds & use-when: hero (page-opening headline+CTAs); features (icon/title/body card grid); content (long-form block); cta (centered band CTA); gallery (image grid); testimonials (quote cards); stats (count-up numbers); pricing (tier cards, highlight one); faq (Q&A list); logo-strip ('trusted by' logos); pull-quote (centered editorial quote); team-grid (people cards); split-image-text (image + copy split); process-steps (numbered steps); feature-split (copy + bullet list + image); newsletter (inline email signup band); comparison (with-us vs without); metrics-band (stats on accent band); banner-cta (full-width accent CTA); contact-form (copy + name/email/message form). Use this — not patch_fixture — to populate a page or add a section in-editor. For surgical edits to existing nodes use patch_nodes; for bespoke structure use insert_nodes (claude.ai only).
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Supporting paragraph (hero subtitle / content body / cta body). | |
| kind | Yes | Section archetype. Use when: • hero — page-opening eyebrow + big headline + CTAs; `layout` makes it split (photo beside) or full-bleed (photo behind). • features — heading + icon/title/body card grid (items[]: icon,title,body). • content — heading + long-form body (single column). • cta — centered heading + body + buttons on a muted band. • gallery — heading + image grid (items[]: image_url, title=alt). • testimonials — quote cards (items[]: body=quote, title=name, meta=role, image_url=avatar). • stats — row of big count-up numbers (items[]: value, label). • pricing — 2-3 tier cards (items[]: title, price, period, body, cta_label, cta_href, featured). • faq — two-column Q&A (items[]: title=question, body=answer). • logo-strip — quiet 'trusted by' row of logos (items[]: image_url). • pull-quote — centered editorial quote (body=quote, eyebrow=attribution). • team-grid — people cards (items[]: image_url, title=name, meta=role, body=bio). • split-image-text — image one side, copy + CTAs the other (image_url or items[0].image_url). • process-steps — numbered steps (items[]: title, body, icon). • feature-split — copy + icon-bullet list one side, image the other (items[]: icon,title,body). • newsletter — heading + pitch + inline email signup form on a band. • comparison — two columns, 'with us' (items[]: body/title) vs 'without' (items[]: meta). • metrics-band — stats on a full-width accent band (items[]: value, label). • banner-cta — full-width accent band, centered heading + inverted CTAs. • contact-form — copy one side, stacked name/email/message form the other. | |
| name | No | What the section is, in the owner's words ('About us', 'Why choose us', 'Reviews'). Shown as the section's name in the editor, and how later tools recognise it. Defaults to the kind ('Split', 'Features'). | |
| items | No | Repeated flat cards/rows — meaning depends on `kind` (feature cards, gallery images, testimonials, stats, pricing tiers, FAQ pairs, logos, team members, process steps, comparison rows, metrics). Up to 12. | |
| layout | No | kind=hero only — how the hero is arranged. 'centered' (default): text-only, centered. 'split': headline + buttons one side, image_url photo the other. 'full-bleed': image_url photo fills the section under a dark scrim with white text. 'split' and 'full-bleed' need image_url; without one the hero is centered. | |
| eyebrow | No | Small label above the heading (hero/features). | |
| heading | No | Section heading / hero headline. | |
| site_id | Yes | ||
| position | No | Where on the page to add it. Default 'end'. | |
| image_url | No | Single image URL — the photo for a split / full-bleed hero, or for image-led kinds. | |
| page_slug | Yes | Slug of the page to add the section to, e.g. '/' or '/about'. Must be an existing page. | |
| primary_cta_href | No | Primary button href (defaults to '#'). | |
| primary_cta_label | No | Primary button label (hero/cta). | |
| secondary_cta_href | No | Secondary button href. | |
| secondary_cta_label | No | Secondary button label (hero/cta). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-read-only, non-destructive, non-idempotent, closed-world behavior. The description adds the key state effect — it builds a subtree and 'splices it into the page, saved as one draft' — plus internal composition details (theme tokens, independently editable text/CTAs). It does not mention permission requirements or failure modes, so it falls short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded: what the tool does and its key differentiator come first, followed by usage and routing. The 20-kind list duplicates the schema's kind enum description and adds length, but the overall structure is efficient for a 15-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex write tool with 20 kinds and no output schema, the description covers selection, routing, and input shape well. Minor gaps remain around required site/page state and return behavior, though the schema and annotations cover most of that territory.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 93%, so per-parameter meanings are already documented and the baseline is 3. The description adds only a high-level grouping ('copy fields', 'items[] array for list-based kinds') that largely restates what the schema already says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('add') and resource ('section') to a page, and immediately distinguishes itself from node-tree authoring. It also names the sibling tools it replaces for other tasks (patch_fixture, patch_nodes, insert_nodes), so an agent can select it without opening other schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes usage: 'Use this — not patch_fixture — to populate a page or add a section in-editor,' then names patch_nodes for surgical edits and insert_nodes for bespoke structure. It also maps all 20 kinds to concrete use-when conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
capture_urlCapture URLARead-onlyIdempotentInspect
Capture a public URL for cloning. Returns everything needed to build a faithful replica: (1) full-page screenshot for visual context — your vision can attend to specific regions; you don't need per-section crops; (2) recursive rendered DOM tree (up to 500 nodes, 10 deep) with computed styles per node — the fastest way to pick exact colors, font sizes, spacing, and layouts without guessing; (3) ordered section structure with detected content type (hero / grid / cta / gallery / text / …), headings, bounds, and layout tokens (flex/grid/padding/gap); (4) detected brand tokens — primary/background/text colors, heading + body fonts, all fonts, typographic scale, section paddings, gradients and hero background images; (5) real image URLs (reuse them via upload_image (with url) so the clone has actual imagery, not stock placeholders); (6) nav links + OG metadata (title, description, og:image). Usage: capture → study screenshot (you have vision) + element_tree → compose a fixture from primitives mirroring structure.sections[i] → call create_site_from_fixture (the bespoke-composition path). Rate-limited to 5 captures per minute. Read-only as far as your Sitelas account is concerned: it fetches the target page and returns what it found, and saves nothing. Rehosting any image it lists is upload_image (with url)'s job, not this one's.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The public URL to capture. | |
| viewport | No | Viewport preset. Defaults to 'desktop' (1440px wide). | desktop |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: rate limit (5 captures/min), depth/breadth caps (500 nodes, 10 deep), and the explicit note that it saves nothing. These are material operational facts not present in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and return-value enumeration are front-loaded and the workflow guidance comes before the caveats, so the structure is sound. It is dense but every enumerated item conveys concrete capability; the only slight cost is length, which borders on verbose even though each element earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the burden of describing return values — and it does so thoroughly across all six artifact types. Combined with annotations covering the safety profile and rate limits, an agent has everything needed to call this correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters (url, viewport) are fully documented in the schema itself. The description does not add meaningful meaning beyond that — it does not mention the viewport parameter or its desktop/mobile options. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Capture a public URL for cloning') and immediately enumerates the six artifacts it returns, which differentiates it from siblings like screenshot_page, read_rendered_page, and read_rendered_page. An agent can distinguish it from those tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit workflow ('capture → study screenshot + element_tree → compose a fixture from primitives → call create_site_from_fixture') and names the alternative path for rehosting images (upload_image with url). It also states the condition for using this over the template path. 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.
check_custom_domainCheck custom domainsAIdempotentInspect
Without domain: list the custom domains attached to a site — hostname, whether DNS is verified, the verification token, when it was attached. With domain: re-check its DNS and mark it verified when the records resolve; on failure it returns the exact records expected (surface expected_records and message verbatim). A verified domain on a never-published site still 404s — say so and offer to publish. set_custom_domain attaches a domain; remove_custom_domain detaches one.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | No | Re-check DNS for this attached domain (e.g. 'example.com') after the owner changed records at their registrar. Omit to list every custom domain on the site with its verification state. | |
| site_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond annotations: the with-domain call re-checks DNS and marks the domain verified when records resolve, and on failure returns expected_records and message that must be surfaced verbatim. It also warns that a verified domain on a never-published site still 404s and suggests offering to publish. This is consistent with readOnlyHint=false and openWorldHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the two operating modes, then adds the important never-published caveat and sibling routing. Every sentence carries useful information and there is no redundant restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a dual-mode tool with no output schema, the description explains what listing returns, what re-checking does, how failures are surfaced, and the important 404 caveat. It is complete enough for an agent to call the tool correctly in both modes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description thoroughly explains the domain parameter's dual semantics (omit to list, supply to re-check) and adds meaning beyond the 50%-covered schema. However, the required site_id parameter is not described at all beyond the general phrase 'attached to a site', so the description only partially compensates for the schema coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource, then clearly distinguishes the tool's two modes: listing domains when no domain is supplied and re-checking DNS when one is. It also names the related siblings set_custom_domain and remove_custom_domain, so an agent can distinguish attach/detach/check without opening other schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to omit domain (list every custom domain and verification state) and when to supply it (re-check DNS after records were changed at the registrar). It also routes attach and detach operations to the named sibling tools, covering both usage and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_collectionCreate collectionAInspect
Stand up a new collection on an existing site in one call: append a collections[] entry (with contentType, pathPrefix, template, and optional items[]), optionally create the index page that hosts the matching <collection-list>, and seed initial items into the content_items table. After this call:
/{path_prefix}/{slug}resolves each item via Mustache substitutionthe index page's
<collection-list>iterates the seeded itemsadd_content_item/edit_content_item/delete_content_itemmanage rows afterward.
Use this when the user asks 'add a blog to my site', 'set up case studies', 'add a careers section', etc. Schemas are per-site — pick a contentType slug that's unique within the site (call list_content_types to see what's already declared) and ship the fields[] schema inline. Writes a new draft version; call publish to push live.
| Name | Required | Description | Default |
|---|---|---|---|
| items | No | Initial items to seed into content_items. Each row's content must satisfy the collection's `fields` (required fields populated, declared types matched). The index page's <collection-list> will iterate these. | |
| fields | Yes | Per-item field schema. Each field becomes a form input AND a write-time validation rule. Include every field the `template` references (placeholders like {{title}}, {{body}}, {{image.url}} map to field keys). The schema is per-site and per-collection — there is no global catalog. | |
| enabled | No | Defaults to true. Set false to ship the collection definition (template + items) without serving detail URLs or rendering index iteration. | |
| site_id | Yes | ||
| template | Yes | Per-item template Node tree with {{field}} placeholders. The template is rendered for each detail URL with the row's content substituted in. See the canonical examples in lib/fixtures/templates/lanyard.json, prive.json, axel.json for the shape. | |
| index_page | No | Optional index page to create at the same time. If the site already has an index page at the prefix (e.g. /blog), omit this and patch its tree separately. | |
| path_prefix | Yes | URL prefix for detail pages. Single segment, kebab-case, with leading and trailing slashes. Examples: '/blog/', '/projects/', '/searches/', '/case-studies/'. | |
| content_type | Yes | The collection's per-site identifier (its content_type slug). Lowercase kebab-case. Each site owns its catalog — pick whatever name fits the brief (project, blog, recipe, episode, gift, …). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readonly, non-destructive, non-idempotent, closed-world. The description adds real context beyond that: it writes a draft version rather than publishing, describes the post-conditions (detail URLs resolve via Mustache, the <collection-list> iterates seeded rows), and warns that the content type must be unique within the site. It stops short of stating what happens on content_type collision or whether an existing collection is replaced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening sentence front-loads the core action, and the bulleted post-conditions are scannable. It is longer than strictly necessary for a single tool, but nearly every sentence (uniqueness rule, inline fields schema, publish follow-up) carries operational information rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter tool with nested template and index-page trees and no output schema, the description supplies the workflow context an agent needs: preconditions (list_content_types), post-call state, and publish sequencing. The template Node tree shape is delegated to fixture file paths rather than described, which is the only real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 88%, so the baseline is 3, and the description still adds value: it ties fields[] to template placeholders ('include every field the template references'), flags the uniqueness constraint on contentType, and routes the agent to list_content_types. It does not improve on the schema's own detailed notes for image fields or path_prefix, so it is not a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Stand up a new collection on an existing site in one call') and enumerates exactly what gets created: the collections[] entry, the optional index page, and seeded content_items rows. It also explicitly distinguishes itself from the row-level siblings (add_content_item / edit_content_item / delete_content_item) that manage items afterward.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete trigger phrases ('add a blog to my site', 'set up case studies', 'add a careers section') and names the adjacent tools to call at each stage: list_content_types beforehand to check the catalog, publish afterward to go live. That is explicit when-to-use plus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_site_from_fixtureCompose site from fixtureAInspect
Persist a fixture YOU composed as a new Sitelas site. Use this when the archetype-based create_site_from_template can't produce the structure you need — primarily for URL cloning (post-capture_url, when the source's section composition doesn't map cleanly to any shipped archetype), or for genuinely bespoke briefs that no archetype satisfies. For typical generation, prefer create_site_from_template — its archetypes are designer-tuned and produce higher-quality output by default. The fixture is validated (create_site_from_fixture (with dry_run: true) autofixes minor issues, throws on hard structural errors), then saved as a DRAFT (live URL 404s until publish). Returns the preview URL, site_id, manifest of patchable nodes, and warnings (e.g. unreachable pages). Pass dry_run: true to validate a fixture without creating a site.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Validate the fixture without creating anything: returns its errors (with paths) and the autofixes that would apply. site_name is not needed. | |
| fixture | Yes | Complete Fixture you composed. Must include `template` (metadata), `theme.config` (color tokens + typography), and `pages` (at minimum a '/' page with a `tree`). Optional: `siteElements.header/footer/pageLayout`, `collections` (each with its own `template`, `pathPrefix`, and `items[]` for starter rows). The fixture goes through create_site_from_fixture (with dry_run: true)'s autofix pass, so minor structural issues are repaired automatically; hard errors are returned with paths. | |
| site_name | No | Human-readable site name. Used as the metadata label and as the default subdomain base. Does NOT auto-substitute into header/footer brand text — set the brand text in your fixture's siteElements.header explicitly. | |
| subdomain | No | Preferred subdomain slug (a-z, 0-9, hyphen, 3–32 chars). Auto-generated from site_name if omitted. A 4-digit suffix is always appended to guarantee uniqueness. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations: validation with autofix of minor issues, hard errors thrown with paths, the site is saved as a DRAFT whose live URL 404s until publish, and the return payload (preview URL, site_id, manifest, warnings) is described. That draft/404 consequence is exactly the kind of downstream effect an agent cannot infer from readOnlyHint/destructiveHint alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose then routing guidance, and most sentences carry real signal. Minor waste in the closing sentence, which restates the dry_run behavior already given two sentences earlier.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return values; with a nested open fixture object, it explains validation/autofix semantics and the draft-state outcome. An agent has everything needed to call this correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents fixture, site_name (brand-text caveat included) and subdomain. The description's dry_run note duplicates the schema text almost verbatim rather than adding format or shape detail, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb + resource: 'Persist a fixture YOU composed as a new Sitelas site.' It immediately distinguishes itself from the sibling create_site_from_template by naming it and stating it is the fallback path.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('archetype-based create_site_from_template can't produce the structure you need'), the two concrete triggers (post-capture_url cloning, bespoke briefs), and an explicit when-not ('For typical generation, prefer create_site_from_template') with a quality rationale.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_site_from_templateCompose siteAInspect
Create a new Sitelas site by cloning a template archetype. The template provides the design skeleton (page composition, section layouts, typography rhythm); you customize it for the specific brief via brand_overrides at create time + ONE bulk patch_nodes call afterwards (the only patch primitive — no per-node fallback). The site is saved as a DRAFT — not publicly live until the user approves and you call publish. Returns url (preview URL, best shared after customization patches are applied), site_id for subsequent edits, manifest (every patchable node id + current text + slot, replaces get_site for discovery), customization_brief (prose guidance for this archetype), overrides_applied, alternative_templates (other templates and who each suits, for an owner who wants a different design), and next_step (a suggested follow-up summary). Standard customization pattern after this call: read the manifest, build one patches array covering every text/image/cta change across all pages and siteElements, send one patch_nodes call. If the owner described pages, home sections, a hero style or light/dark, pass layout and the response's layout_plan.steps lists the calls that add what the template lacks.
| Name | Required | Description | Default |
|---|---|---|---|
| layout | No | The site's SHAPE when the owner described it — the pages they want, what the home page shows and in what order, how the hero looks, light or dark. Pass it whenever they said any of these: the response then includes `layout_plan`, the exact calls (add_page, add_section, create_collection, move_nodes, set_theme (with colors)) that make the template match what they described. Omit when they described only the business. | |
| site_name | Yes | Human-readable site name. Stored on the template metadata and used as the default base for the subdomain slug. Note: does NOT automatically substitute into visible header/footer brand text — include the header brand-name node in your patch_nodes batch (slot: 'brand-name' in the manifest) to update the displayed brand. | |
| subdomain | No | Preferred subdomain slug (a-z, 0-9, hyphen, 3–32 chars). Auto-generated from site_name if omitted. A 4-digit suffix is always appended to guarantee uniqueness. | |
| page_slugs | No | Re-address the template's pages for THIS brief, as { currentSlug: newSlug } — e.g. { "/attorneys": "/founders", "/practices": "/services" }. Archetypes carry their origin vertical in their paths, so a template used outside that vertical ships URLs that contradict its own copy: a soccer-recruiting site serving /attorneys. Set them here and the pages are simply created at the right paths — no redirects, no aliases, nothing to clean up, because nothing is published yet. Sub-pages follow their parent automatically and the template's own nav links are rewritten to match. Partial is fine; unlisted pages keep the template's slug. Leave paths that already read generically (/about, /contact, /work) alone — the ones to fix are vertical leftovers. An unknown key is an error, not a silent no-op. | |
| template_slug | Yes | Slug of the template archetype to clone (from find_templates). E.g. 'dossier', 'beacon', 'tessel'. | |
| brand_overrides | No | Theme nudges applied at create time: primary/accent/background color, heading/body font. When the brief names a specific mood (rainy PNW, brutalist, Victorian, editorial newsprint) pass both color AND typography that match — don't set colors and leave fonts as the template's default. Each knob is independent. Omit entirely only when the brief says 'use the template as-is' or is silent on both color and typography. | |
| collection_prefixes | No | Re-address collection detail URLs, as { contentType: newPrefix } — e.g. { "project": "/case-studies/" }. Same reasoning and same free-at-creation window as page_slugs; row-template links are rewritten with it. Usually unnecessary: shipped prefixes (/blog/, /shop/, /projects/) are already generic. NOTE this is the only moment a collection's path can change — once its items are published the path is fixed, because moving them would 404 every existing link. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond annotations: the site is saved as a draft and not live until publish, there is no per-node patch fallback, page_slugs and collection_prefixes must be set now because paths lock after publishing, and a full response field list is given. This fills in creation, publication, and path-mutation behavior not captured by the readOnly/destructive/idempotent hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and key constraints are front-loaded, and the dense response-field enumeration is justified because there is no output schema. It is long and packed into a single paragraph, but every sentence carries useful operational detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Comprehensive for a complex creation tool with nested parameters and no output schema. It explains return fields, the customization workflow, draft status, layout_plan behavior, and path-locking constraints, leaving little ambiguity for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so baseline is 3, but the description adds value by linking parameters to the post-create workflow: brand_overrides at create time followed by one bulk patch_nodes call, layout triggering layout_plan.steps in the response, and site_name requiring a separate brand-name patch. These are cross-parameter workflow semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a specific verb and resource: create a new Sitelas site by cloning a template archetype. It clearly distinguishes the operation from sibling tools like find_templates (used first) and create_site_from_fixture by naming the template-cloning workflow and its customization path.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly describes the standard workflow: clone, apply brand_overrides at create time, then make exactly one bulk patch_nodes call. It names when to pass layout and references specific sibling tools (patch_nodes, publish, get_site) and alternatives (alternative_templates).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_collectionDelete collectionADestructiveIdempotentInspect
Delete a whole collection (a blog, projects, menu, team…): its schema, its listing page (the page at its path prefix) and EVERY item in it. Use this when the user wants a whole section of posts or entries gone. To remove one entry use delete_content_item; never remove a collection with patch_fixture, which leaves all its items behind. The items and the listing page come off the live site immediately, like Delete in the editor; the schema removal stays in the draft until publish. Links to the collection elsewhere (menu, footer, buttons) are not changed: they come back in dead_links with where each one is — re-point or remove them. Also cleans up items left behind by a collection that is no longer declared. Permanent.
| Name | Required | Description | Default |
|---|---|---|---|
| site_id | Yes | ||
| content_type | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructive/idempotent annotations, the description explains the live-site vs. draft behavior, that links elsewhere are not changed but returned in dead_links, that orphaned items are cleaned up, and that the action is permanent. These are exactly the consequences an agent needs before invoking 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded: the first sentence states the deletion scope, followed by usage routing and then behavioral consequences. Every sentence adds material information, and the final 'Permanent.' warning is appropriately emphatic.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive collection-deletion tool, the description is highly complete on behavior, side effects, alternatives, and return-side effects like dead_links. It falls short only on explaining the required parameters, which is a real gap for an agent preparing the call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description would need to explain the two required parameters. It never mentions site_id or content_type, nor how to identify the collection to delete. The description gives some conceptual context about collections but does not compensate for the parameter documentation gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource and spells out exactly what is deleted: the collection schema, listing page, and every item. It also directly distinguishes this tool from delete_content_item and patch_fixture, so an agent can identify its scope without opening sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use this tool (when the user wants a whole section gone), when to use an alternative (delete_content_item for one entry), and when not to use another tool (never patch_fixture for collection removal). This is unusually clear routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_content_itemDelete content itemADestructiveIdempotentInspect
Delete a content item by item_id, or by site_id + content_type + its exact slug. It also comes off the live site immediately. Ownership is verified via the parent site's user_id. Returns the deleted item's slug and content_type for confirmation.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | The item's exact slug, with site_id + content_type. | |
| item_id | No | ||
| site_id | No | With content_type + slug, instead of item_id. | |
| content_type | No | With site_id + slug, instead of item_id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the destructiveHint=true annotation by disclosing the real-world consequence ('comes off the live site immediately'), the authorization model (ownership verified via the parent site's user_id), and the return payload (slug and content_type) despite there being no output schema. These are exactly the facts an agent needs before committing to an irreversible publish-affecting action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the addressing rule, then the side effect, then the return value. No filler and nothing repeated from the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers addressing, live-site impact, auth, and return value for a destructive tool with no output schema. It omits cascade behavior (do child nodes, sections, or published assets disappear?) and whether the slug becomes reusable, which matter for a delete of this scope.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75% and item_id has no schema description at all, but the description supplies the crucial semantic the schema lacks: the two parameter sets are alternatives, and slug must be exact when paired with site_id + content_type. It does not clarify what happens if both addressing modes are supplied or whether any parameter is required (required list is empty).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (delete) and resource (content item), plus the two alternative addressing keys, so it is clearly distinguished from siblings like delete_page, delete_site and delete_collection. An agent knows exactly what object this removes without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains how to identify the target (item_id alone, or site_id + content_type + exact slug), which is implicit guidance on invocation. It never says when to choose this over edit_content_item, delete_page, or list_content_items, and offers no exclusions or preconditions beyond the ownership note.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_pageDelete pageADestructiveIdempotentInspect
Delete a page from a site. Cannot delete the home page ('/'). By default also prunes nav-link entries (header / footer / pageLayout / page bodies) that point at the deleted slug so the deletion leaves no broken nav links — set prune_nav_links:false to keep them. A nav-link is kept (with a warning) if removing it would empty its nav-links container. Other links to the deleted page (plain links, buttons, cards) are not changed: they come back in dead_links with where each one is — re-point or remove them before you reply; that is part of deleting the page. The page also comes off the live site immediately (like Delete in the editor); nav-link changes stay in the draft until published. Returns the preview URL.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | ||
| cascade | No | When true, also delete child pages whose slugs start with `${slug}/`. | |
| site_id | Yes | ||
| prune_nav_links | No | When true (default), also remove nav-link nodes across the header, footer, pageLayout, and page bodies whose href targets a deleted slug — so the deletion doesn't leave broken nav entries. A nav-link is left in place (with a warning) if removing it would empty its nav-links container. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructive/idempotent/openWorld, but the description goes well beyond them: nav-link pruning is on by default, a container would not be emptied (kept with a warning), the live site updates immediately while nav-link edits stay in the draft, and remaining links surface in `dead_links`. This is exactly the kind of side-effect and edge-case disclosure a destructive tool needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The exclusion and the default prune behavior are front-loaded, and every sentence (warnings, live vs draft, dead_links) carries operational value. It is slightly dense and could be split, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive delete with no output schema, the description supplies the safety-relevant behavior and return signal (preview URL, dead_links). The only real gap is the undocumented cascade flag, which matters because it changes the blast radius.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%, so the description must carry weight; it elaborates prune_nav_links well (including the kept-with-warning behavior), but `cascade` is never mentioned in the description and neither slug nor site_id semantics are clarified. With half the parameters undocumented in the schema and cascade absent from the prose, the baseline-3 compensation is incomplete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a page from a site') and immediately scopes it with the home-page exclusion. Among siblings (delete_site, delete_collection, delete_content_item) it is unambiguous which resource this removes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when it cannot be used (home page '/') and describes the default nav-link pruning plus the opt-out via prune_nav_links:false. It also directs the agent to handle `dead_links` before replying. It does not compare against delete_site or clarify whether child pages are affected outside the cascade flag, so it falls short of a full when/when-not/alternatives treatment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_siteDelete a site permanentlyADestructiveIdempotentInspect
Permanently delete a site — its subdomain row, all version snapshots, all content_items, all submissions, the alias history, attached custom domains (removed from Vercel), any active billing for the site (cancelled), and any media in the storage bucket. IRREVERSIBLE. Use this when the user explicitly asks to scrap a site (e.g. 'delete my-portfolio-3947, I don't want it' or 'I created the wrong template, throw it away'). Requires confirm: true to be deliberate. Do NOT call this on user-said-something-vague — ask 'are you sure you want to delete {subdomain} permanently?' first and only call after explicit yes. There is no undo. If the billing cancellation fails, the entire delete is aborted so the user is never charged for a deleted site.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | Yes | Required boolean — pass `true` to confirm. Forces you to be deliberate before destroying user data. | |
| site_id | Yes | ||
| confirm_subdomain | No | Recommended: the subdomain of the site being deleted, exactly as the owner confirmed it in the chat (e.g. 'my-portfolio-3947'). When given, the delete is refused unless it matches the site_id's subdomain — a guard against deleting the wrong site. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, but the description goes far beyond that: it lists every affected resource (subdomain row, snapshots, submissions, alias history, custom domains removed from Vercel, billing cancelled, media bucket) and discloses the atomicity guarantee if billing cancellation fails.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but every sentence earns its place: destruction scope, irreversibility, usage trigger, confirmation gate, and failure behavior are all front-loaded for a genuinely destructive operation where thoroughness is warranted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description tells the agent everything needed to call it safely: what is destroyed, that it is irreversible, that confirm must be true, the subdomain guard, and the abort-on-billing-failure behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and the schema already documents confirm's const:true and confirm_subdomain's guard. The description reinforces the confirm requirement in a workflow context ('to be deliberate') and ties subdomain confirmation to safety, though it does not compensate for the undocumented site_id.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Permanently delete a site') and enumerates exactly what is removed, which also distinguishes it from sibling destructors like delete_page, delete_collection, and delete_custom_domain.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use with example utterances ('scrap a site', 'I created the wrong template'), explicit when-not-to-use ('Do NOT call this on user-said-something-vague'), plus the required confirmation workflow before invoking.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_content_itemEdit content itemADestructiveIdempotentInspect
Update fields on an existing content item. Identify it by item_id, OR — when you only know its name — by site_id + content_type + (slug | title); title resolves fuzzily (exact then contains) and errors with the available titles when there's no unique match. patch may include content (shallow-merged into existing content JSON), slug (rename — the old URL 308-redirects to the new one once published), and/or visibility. At least one field is required. When content is patched, the MERGED result is validated against the content_type schema (lenient: required present + declared types; extra fields allowed) and rejected with paths if it would leave the item missing a required field. An image-typed field holds an OBJECT { "url": "…", "alt": "…" } — a bare URL string is accepted and stored as { url }. content is SHALLOW-merged, so patching an image field replaces the whole object: re-send alt alongside url or it is dropped. Ownership is verified via the parent site's user_id. Throws on slug collision.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | Exact item slug to resolve (with site_id + content_type). | |
| patch | Yes | ||
| title | No | Item title to resolve fuzzily (case-insensitive exact, then contains). Errors with the available titles if there's no unique match. | |
| item_id | No | The item's UUID (from a content list). | |
| site_id | No | Site UUID — required when resolving by content_type + slug/title. | |
| content_type | No | Collection content type — required when resolving by slug/title. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (destructive, idempotent, non-readonly); the description adds the behaviors that actually matter here: shallow-merge semantics, merged-result validation against the content_type schema, fuzzy title resolution with error-on-ambiguity, 308 redirect on rename, ownership verification via parent site user_id, and slug-collision failures. This is far beyond what the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense paragraph, but it is front-loaded with the core action and every clause earns its place (resolution, patch semantics, validation, image handling, ownership, errors). It is long relative to typical definitions, though for a nested-object mutation with no output schema the density is defensible rather than padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the entire call path an agent needs: how to resolve the item, what patch fields do, merge/validation rules, image-field gotchas, and failure modes. With no output schema, the description also carries return-adjacent context through its error behavior, leaving no obvious gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high (83%), so the baseline is 3, but the description adds real semantics: the image field object shape and the bare-URL coercion rule, the shallow-merge warning that re-sending alt is required, the validation and rejection behavior when content is patched, and the conditional requirement linking site_id/content_type to slug/title resolution.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Update fields on an existing content item') and immediately clarifies scope via the identification paths, which separates it from siblings like add_content_item, delete_content_item and publish_content_item. An agent can tell what the tool mutates without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditional guidance on resolution ('Identify it by item_id, OR — when you only know its name — by site_id + content_type + (slug | title)') and states the 'at least one field is required' constraint. It stops short of naming alternative sibling tools or when-not-to-use conditions, so it sits below explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_imagesFind imagesARead-onlyIdempotentInspect
Search a curated stock photography library (Pexels) for real imagery to use in a site. Call this BEFORE composing any section that needs imagery — hero, feature-grid with visuals, testimonial cards with portraits, gallery sections, media-and-text sections. Returns large-size URLs, thumbnails, dimensions, average color, and suggested attribution. Chain with upload_image (with url) to persist the chosen image to the site's storage namespace (recommended — external URLs can rot). Be specific with queries; 'brooklyn bakery sourdough on wooden counter' returns much better results than 'bakery'. Rate-limited to 30 searches per minute per user. Read-only: it queries Pexels and returns results. Nothing reaches the site until you call upload_image (with url) with a URL from them.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | How many results to return. Default 6, max 20. | |
| query | Yes | Search query — be specific. 'brooklyn bakery sourdough loaves on wooden counter' beats 'bakery'. Good queries describe subject, setting, mood, lighting; bad queries are single generic nouns. | |
| orientation | No | Shape you need. 'landscape' for full-bleed heroes / media sections, 'portrait' for sidebar + testimonial portraits, 'square' for avatars and team tiles. Omit to get the mix Pexels returns by default. Note 'square' ranks crop-friendly photos first rather than returning only true 1:1 files (there are almost none, and filtering for them throws away every relevant result) — so expect widths and heights that differ, and let the slot centre-crop them. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, open-world, non-destructive, but the description adds genuinely new facts: the 30-searches-per-minute-per-user rate limit, the full return shape (URLs, thumbnails, dimensions, average color, attribution), and the critical side-effect boundary that nothing reaches the site until upload_image is called. That side-effect clarification is exactly the kind of context annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the pre-composition constraint, then chaining advice, then caveats. It is on the long side and repeats the query-specificity advice that also appears in the schema, which is minor redundancy rather than waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description enumerates the return fields, and it covers rate limits, the upload_image handoff, and per-orientation selection. An agent has everything needed to call this correctly and to know what to do with the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds query-craft guidance ('brooklyn bakery sourdough on wooden counter' beats 'bakery') that goes beyond the schema's phrasing. The count and orientation parameters are left to the schema and are only implicitly referenced, so it does not fully compensate on all three.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search a curated stock photography library (Pexels) for real imagery') and distinguishes itself from siblings like list_site_images and replace_images_from_search by being the Pexels search entry point. An agent can tell exactly what will happen without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit timing guidance ('Call this BEFORE composing any section that needs imagery — hero, feature-grid, testimonial cards, gallery, media-and-text'), names the follow-up alternative (upload_image with url) with a stated reason ('external URLs can rot'), and gives negative guidance against generic queries. This is textbook when/when-not/alternatives coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_templatesFind a templateARead-onlyIdempotentInspect
Choose the template a new site starts from. RANK (with a brief): pass audience plus keywords (the business in the owner's words — corroboration is computed from them) and needs (what the site must do); it scores every template and explains the ranking. Check the winner's match_quality: 'corroborated' = the brief's words appear in its use cases; 'structural' = it won on audience/goal alone — usually still build from it, call it a starting point, and push harder on brand, imagery and copy. If out_of_scope is not empty the owner asked for something Sitelas does not build (logins, a cart, live data, an app): say so plainly BEFORE creating and offer its instead. If audience_check is set, re-run with the audience it names. When the owner described the site's shape (pages, hero, light or dark) pass it as layout, and after creating run every call in layout_plan.steps. BROWSE (no brief — 'what designs are there?', 'what else?'): no arguments gives an overview of every audience and its templates; audience opens that shelf in recommended order; query searches ('bakery', 'dark portfolio'); slugs (up to six) gives full detail to compare a shortlist. Read-only: create_site_from_template creates the site.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Normally inferred: any brief field (keywords, needs, conversion_goal, register_hint, density, layout, integrations_required, avoid_categories) ranks; otherwise it browses. Set it only to force one. | |
| page | No | 1-based page of a filtered listing. Default 1. | |
| needs | No | What the site has to DO for the owner, in their words, one per entry: 'a menu', 'booking requests', 'course modules', 'a donate page', 'team bios', 'a price list'. Each template is checked for whether it already ships it (`needs_coverage`), and the one that does ranks higher among templates for the same business. Also list anything app-like the owner asked for — 'member login', 'shopping cart', 'live scores', 'users post photos' — Sitelas builds marketing sites, and those come back in `out_of_scope` so you can say so BEFORE building. | |
| query | No | Search every template's name, description and the businesses it is built for — e.g. 'bakery', 'podcast', 'dark portfolio', 'law firm'. Results are ranked by how many of your words match. | |
| slugs | No | Full detail for up to 6 named templates — complete description, every use case and anti-case, the customization brief and node counts. Use it to compare a shortlist before choosing. Ignores the other filters. | |
| top_n | No | How many ranked matches to return. Default 3. Higher values useful for exploring tradeoffs; 1 forces a confident pick. | |
| layout | No | The site's SHAPE when the owner described it — the pages they want, what the home page shows and in what order, how the hero looks, light or dark. Pass it whenever they said any of these: the response then includes `layout_plan`, the exact calls (add_page, add_section, create_collection, move_nodes, set_theme (with colors)) that make the template match what they described. Omit when they described only the business. | |
| density | No | How image-heavy the site should feel. 'lots of photos / image-first' → image-led; 'mostly text, sparse imagery' → text-led; 'mixed' → balanced. Omit if unclear. | |
| audience | No | WHO the site is for. Most useful single signal, and the one the ranking swings hardest on — 'yoga studio owner' → local-smb-service; 'business coach' → solo-expert; 'photographer' → solo-creative; 'law firm' → b2b-firm; 'podcaster' → creator-with-content; 'nonprofit' → nonprofit; 'jeweller / ceramicist / candle maker / small-batch food producer' → maker-retail; 'church / parish / charity / community group' → nonprofit; 'training academy / online course / school selling courses' → creator-with-content; 'clinic / physio / therapy or health programme' → local-smb-service; 'plumber / electrician / laundry / bike, appliance or car repair / cleaning crew' → local-smb-trade; 'lawyer, accountant or consultant practising alone' → solo-expert (a firm of several → b2b-firm). Note maker-retail vs solo-creative: a maker sells a physical OBJECT (catalogue + buy buttons, or custom-order enquiries), a solo-creative sells work-for-hire (portfolio is the pitch). Getting this wrong sends a bead-jewellery studio to a dark engineer-portfolio template. Pick the closest match; the scorer also considers each template's audienceAlt. | |
| category | No | Coarse category filter: 'portfolio', 'academic', 'business', 'food', 'saas', 'content', 'realestate', 'events', 'document'. `audience` is usually the sharper cut. | |
| keywords | No | Free-form keywords from the brief — used as soft signal against each template's useCases and antiCases. E.g. ['yoga', 'studio', 'class signup', 'restorative']. The scorer matches these against each template's useCases (positive) and antiCases (negative). | |
| page_size | No | Templates per page, up to 25. Default 12. | |
| register_hint | No | Visual + tonal mood the brief asks for. 'calm/restorative/wellness' → calm-professional; 'utility/family-owned/trades' → utilitarian-trustworthy; 'fine dining/dark/refined' → fine-dining-dark; 'editorial/warm-paper/literary' → editorial-warm; 'modernist/sans/whitespace' → modernist-minimal; 'authoritative/legal/formal' → authority-formal; 'kids/playful/family' → playful-warm; 'agency/dramatic/dark-mode' → agency-dramatic. Omit if the brief is silent on visual mood. | |
| conversion_goal | No | Primary CTA shape the brief asks for. Booking calendar → booking-form; discovery call → discovery-call; donation → donation; newsletter signup → newsletter-signup; ticket sale → ticket-sale; selling a physical product → product-sale; restaurant → menu-reservation; tour booking (school/program) → tour-booking; nothing transactional → info-only; standard 'contact us' → lead-form. product-sale means a catalogue page with one card per item — Sitelas has no cart, inventory or order management, so the shape is a catalogue, never a storefront. | |
| avoid_categories | No | Coarse categories to filter out. E.g. ['academic'] when the brief is industry-only. Most useful for steering away from over-served categories. | |
| integrations_required | No | Integrations the brief explicitly calls for. Calendly link → calendly-embed; podcast platform buttons → audio-player; embedded video → video-embed; code samples → code-blocks. Omit if none specified. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description is fully consistent with them: "Read-only: create_site_from_template creates the site." It adds behavioral context beyond annotations, including ranking semantics, match_quality meanings, out_of_scope handling, and layout_plan follow-up steps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but front-loads the purpose and the RANK/BROWSE split, and most sentences carry operational guidance that an agent needs. Some audience and register detail overlaps with the already-rich schema, so a slightly tighter version would be ideal, but it is structured and purposeful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 16-parameter, annotation-covered, read-only tool without an output schema, the description supplies the missing return-value semantics: match_quality, out_of_scope/instead, audience_check, and layout_plan. It also explains creation handoff to create_site_from_template, so an agent has enough context to call and interpret the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds useful grouping and workflow semantics: it explains that audience plus keywords plus needs drive ranking, that browse mode uses audience/query/slugs, and how layout relates to layout_plan. It does not fully duplicate every parameter definition, but it meaningfully clarifies which parameters to use in which mode.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: choosing the template a new site starts from. It clearly distinguishes the two operating modes (RANK with a brief vs BROWSE without one) and explicitly routes site creation to the sibling tool create_site_from_template.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance for both modes: pass a brief to rank, omit one to browse. It also explains follow-up conditions such as checking match_quality, handling out_of_scope, re-running with audience_check, and passing layout when the owner described the site's shape.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_analyticsGet site analyticsARead-onlyIdempotentInspect
Fetch pageview and unique-visitor analytics for a site over a date range. Returns totals, a daily timeseries, top paths, and top referrers. Default range is trailing 28 days ending today. Use range_days for a trailing window, or since + until for explicit bounds. Pass include_activity: true to add form submissions and new contacts for the same window ('how's my site doing?'). Analytics is a Pro feature: on Free it returns billing_gate — say so once and don't ask again.
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | ||
| top_n | No | ||
| until | No | ||
| site_id | Yes | ||
| range_days | No | ||
| include_activity | No | Also return `activity` for the same window (up to 90 days), when the window ends today: form submissions by form type, new contacts, top pages and referrers — for 'how's my site doing this week?'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/non-destructive, and the description adds real behavioral context: default trailing-28-day window, the shape of the response, the 90-day cap on activity, and the Free-tier billing_gate behavior with an instruction on how to react. That goes well 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and return shape, then parameter guidance, then the gating caveat. Every sentence carries information; 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.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return shape, defaults, and tier gating — enough to call correctly. Only `top_n` semantics are unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 17%, so the description must compensate — and it does for `range_days`, `since`/`until`, and `include_activity`, including the 90-day constraint. `top_n` (with its 1-50 bounds) is left undocumented, a minor gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch pageview and unique-visitor analytics for a site') and enumerates the return contents (totals, daily timeseries, top paths, top referrers). No sibling tool covers analytics, and the scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear selection logic between `range_days` and `since`+`until`, and names the trigger for `include_activity` ('how's my site doing?'). It lacks an explicit 'do not use this for X' exclusion, but the context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_editor_linkGet the site's editor linkAInspect
Return a link to the site owner's own visual editor, optionally opening straight to one page or collection item. Give this to the person whenever the next step is theirs rather than yours:
They want to use THEIR OWN image. Pass
image_targetnaming the spot and they get a one-time photo link instead of the editor: one page, one drop, placed on that spot in the draft, no sign-in. Without a spot they get the editor. This is the dividing line for every image on the site, sections and collection items alike: you source pictures withfind_images,replace_images_from_searchandupload_image (with url)and place them yourself, but a file that exists only on their device — their logo, their team photo, their product shots — comes in through the editor. Point them at the exact page or item (page_slugtakes 'blog/my-post' as happily as 'about') rather than the site root.They want to make a change themselves, or asked where to edit something.
They asked to see their site, or seem unaware there is a visual builder at all — many people who connect this connector never find out.
The link opens their editor signed in as them. Do not promise they are already signed in: the session cookie may not exist on the device they open it from, in which case they are sent to sign in first and land in the editor afterwards. share_with_user is worded for that.
The editor link is nothing secret — an ordinary product URL, authenticated by the person's own account. A photo link is a one-time capability for that one spot (30 minutes, one upload, draft only): give it to the person and to no one else.
| Name | Required | Description | Default |
|---|---|---|---|
| alt | No | With image_target: alt text for the photo, if they told you what it shows. Omit to keep the spot's current alt text. | |
| task | No | What the person is going there to do, so the instructions match the actual UI. 'image' — they are supplying their own photo; the steps differ between a standalone image and a background and neither is guessable. 'edit' — any other change they make themselves. Omit only if you genuinely don't know. | |
| site_id | Yes | The site UUID whose editor link should be returned. | |
| page_slug | No | Optional path to open directly. A page slug ('about'), or a collection item's full path ('blog/my-first-post', 'projects/harbour-house') — nested paths are fine. Omit for the home page. Send them to the exact thing they need to change; 'it's in the editor somewhere' is how people give up. | |
| image_target | No | The ONE spot their own photo goes: { node_id } for an image or a section's background photo, or { content_type, item_slug, field } for a collection item's photo. With this, the person gets a one-time link to a page that does only that: they drop the file and it is placed on that spot in the draft. No sign-in, no editor, nothing to save. Use it whenever they have their own photo for a spot you can name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by explaining that the editor link opens signed in as the user but may still route to sign-in depending on session cookies. It also discloses the photo link's security model: one-time capability, 30 minutes, one upload, draft only, and not to be shared beyond the intended person.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded and uses bullet structure effectively for the main usage cases. It is somewhat long and occasionally conversational, but most content earns its place by clarifying routing, auth behavior, and link sensitivity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a link-returning tool with no output schema, the description explains both possible link modes and their important constraints. It also covers the prerequisites and caveats an agent needs before handing the link to a person.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already carries most parameter meaning. The description still adds useful selection semantics by explaining that image_target should be passed only when the person is supplying their own photo for a named spot, and that omitting it returns the editor instead.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: returning a link to the site owner's visual editor, optionally opened to a page or collection item. It clearly distinguishes this from image-sourcing and placement tools like find_images, replace_images_from_search, and upload_image.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use cases: when the next step belongs to the person, when they want to make edits themselves, or when they ask to see their site. It also draws the key routing line between editor links for user-owned files and direct image placement tools for sourcing/placement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_example_fixturesGet example fixturesARead-onlyIdempotentInspect
Return example fixtures in the shape Sitelas expects — the first page's sections (up to 8), each collection's fields with one example item, and theme and template metadata: a Rosetta Stone for which fields are required vs optional, how responsiveStyle nests, what shape data.items/data.tiers/etc actually take in practice. Study one for shape; compose your own for content. The fastest path to a correct first call on an unfamiliar category is calling this once with that category, reading the skeleton, then composing from get_primitive_schema + design principles — not avoiding examples on principle. The goal is never to replicate the reference; it's to get the shape right on call #1.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max number of fixtures to return (default 3, max 10). | |
| minimal | No | Accepted for compatibility; every response is the trimmed shape: full template + theme metadata, the FIRST page's tree (up to 8 sections), siteElements without their inner trees, and each collection's fields with one example item. | |
| categories | No | Site categories to sample (e.g. ['saas', 'portfolio', 'food']). Up to one fixture per category is returned. Omit to get a diverse default sample. | |
| archetypes_category | No | Instead of fixtures: the section archetypes for one site category (e.g. 'saas', 'food') — the typical sections such a site has and what each is for. Use it to plan the sections of a page you are composing. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile, readOnly, idempotent, non-destructive. The description adds useful behavioral context beyond annotations: it discloses that responses are trimmed, limited to the first page's sections, and include collection fields with one example item plus theme/template metadata. It does not cover errors or pagination, so it is not fully exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence front-loads the purpose and return shape, and the usage guidance follows logically. Some phrasing is motivational and slightly repetitive, such as 'not avoiding examples on principle' and 'the goal is never to replicate,' but these sentences still steer agent behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must describe return values, and it does: first page's sections up to 8, each collection's fields with one example item, and theme/template metadata. Given the tool's reference-gathering role, the description is complete enough for an agent to call and interpret it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so limit, minimal, categories, and archetypes_category are already documented in the schema. The description alludes to calling 'with that category' and reading the skeleton, but adds little parameter-specific syntax beyond what the schema provides, making 3 the appropriate baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource: 'Return example fixtures in the shape Sitelas expects.' It also explains exactly what the response contains and contrasts the tool with get_primitive_schema and composing from design principles, so an agent can distinguish reference-gathering from other schema/template tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it: on an unfamiliar category, for a correct first call, by reading the skeleton first. It also names the alternative path, get_primitive_schema plus design principles, and warns not to replicate the example content.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pageRead a pageARead-onlyIdempotentInspect
Read what is on the site's DRAFT. view 'content' (default) lists every editable node id with its text, plus form fields, FAQ items, image nodes and collection items — call it when you come back to a site and before patch_nodes. view 'structure' gives the container nesting with ids (for moving, inserting or removing containers, and the only way to see how header/footer nodes nest). view 'copy' lists all rewriteable copy on the whole site for a full rewrite. To check what visitors see, use read_rendered_page; for pages, theme and publish state, get_site. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | 'content' (default): every patchable node id with its current text, each form's full field list, copy kept in node data (FAQ items, banner links, form messages), image nodes, slots, and each collection's items read live — the view to build a patch_nodes call from. 'structure': the container nesting with ids, types and short labels and no props — for moving, inserting into or removing a container; pass page_slug 'header' / 'footer' / 'pageLayout' / 'shell' for the shared chrome, or 'collection:<contentType>' for a collection's detail template. 'copy': every rewriteable text field on the WHOLE site, chrome and collection items included, for a full copy pass. | |
| site_id | Yes | ||
| max_items | No | With view 'copy': cap on returned items (default 200). When `truncated` is true, or content_items_returned is below content_items_total, call again with a higher cap before reporting the pass done. | |
| page_slug | No | Which page, e.g. '/', '/about'. 'content': omit for the whole site (large — scope it when editing one page; the header, footer and collections are always included, in site_elements, so 'header' or 'footer' returns the home page with them). 'structure': defaults to the home page. Ignored by 'copy'. | |
| instructions | No | With view 'copy': the rewrite intent ('more formal', 'shorter'), echoed back. Nothing is rewritten for you — compose the new copy and apply it with patch_nodes / edit_content_item. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly annotation by disclosing that this reads the DRAFT not the live site, that whole-site content views are large and should be scoped, that header/footer/collections are always included in site_elements, and that copy view rewrites nothing for the agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the draft-vs-live distinction and then routes by view in one dense paragraph; only the trailing 'Read-only.' is redundant with annotations, otherwise there is little waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description explains what each view returns (node ids with text, form fields, FAQ items, container nesting, site-wide copy) and the max_items/truncated retry behavior, which is enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80% and the schema's own param descriptions are richer than the prose (e.g. view enums, page_slug caveats, max_items truncation follow-up are all repeated in schema). The description adds selection guidance for views but little parameter meaning the schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read what is on the site's DRAFT') and immediately distinguishes the three output modes, so an agent knows exactly what it returns versus read_rendered_page or get_site.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: 'content' is for returning to a site and before patch_nodes, 'structure' for moving/inserting/removing containers, 'copy' for a full rewrite, plus named alternatives (read_rendered_page for visitor view, get_site for pages/theme/publish state).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_primitive_schemaGet primitive schemaARead-onlyIdempotentInspect
Return the full prop schema for a single primitive: types, defaults, options, required fields, allowed children, and styleStrip — a map of {style prop: actionable hint} for any inline-style props this primitive's renderer intentionally drops (e.g. on section, layout props like display/flexDirection are stripped because Section is a semantic wrapper; use a Stack/Grid child instead). Read styleStrip BEFORE setting style on a node — eliminates the silent-drop trial-and-error. Without type it lists every primitive.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | The primitive type, e.g. 'heading', 'image-gallery'. Omit to list every primitive type with a one-line summary. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/idempotent safety profile, and the description adds substantial meaning on top: it explains what styleStrip is, why certain inline styles are silently dropped by renderers, and what to do instead (use a Stack/Grid child). That is exactly the kind of non-obvious behavior an agent cannot get 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the return contract before diving into styleStrip semantics. The styleStrip parenthetical is dense but each clause carries real information; minor wordiness in the example explanation keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description fully specifies the shape of the returned data including the non-obvious styleStrip map. For a read-only, single-optional-parameter introspection tool this covers everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single optional `type` parameter is already documented with examples. The description restates the omit-to-list behavior, adding little beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return the full prop schema for a single primitive') and enumerates exactly what comes back: types, defaults, options, required fields, allowed children, and styleStrip. No sibling in the tool list does schema introspection, so an agent can identify this tool's role at a glance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete workflow instruction — 'Read styleStrip BEFORE setting style on a node — eliminates the silent-drop trial-and-error' — and explains the no-arg mode ('Without `type` it lists every primitive'). It lacks explicit when-not-use guidance, but with no competing introspection sibling the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_siteGet siteARead-onlyIdempotentInspect
Fetch details of a single site: pages (slug/title/order/edit URL, plus each page's own search settings and old redirecting URLs when it has any), theme summary, search settings (site-wide title/description/share image/noindex/language, the stated business details, ownership verification codes, connected analytics/ad tracking IDs, and the name and social profiles read from the site), publish status, and URLs. Share url — it always resolves. live_url is null when the site has never been published: it has no public address yet, so say so and offer publish rather than handing over a link. Does NOT return the node tree (use get_page (with view: "structure")) or version history (use get_site_changes (with include_versions: true)). By default returns a slim theme (slug + palette tokens + font families) to keep the response compact; pass include_theme_config=true if you need the complete theme config object. Pass include for more in the same call: 'publish_state' (what is live, edited or draft-only, page by page), 'brief' (the site's design memory), 'data_files' (files embeds load).
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Add to the answer: 'publish_state' — what is live vs edited vs draft-only, per page and per collection item, plus each page's sections and headlines; 'brief' — the site's design memory (vibe, voice, palette and fonts, recent decisions, the extracted design system), read it when you come back to a site; 'full_theme' — the complete theme object (same as include_theme_config); 'data_files' — the JSON/CSV files embeds load (upload_data_file). | |
| site_id | Yes | ||
| include_theme_config | No | When true, returns the complete theme object (all colors, typography, spacing, semantic tokens, etc.). When false or omitted (default), returns a slim theme summary — slug, palette tokens, font families — which is enough for almost every decision and keeps the response compact. Set true only when you need to round-trip the theme (e.g., before patch_fixture against /theme/config/...). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds real operational context the annotations cannot: the default slim theme keeps responses compact, and the live_url null case is called out with the recommended agent behavior ('say so and offer publish rather than handing over a link'). That last point is exactly the kind of branch-handling guidance descriptions should carry; it stops just short of covering pagination/size limits on the pages array.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the payload summary, then exclusions, then defaults and optional flags — a sensible order for an agent scanning top-down. It is long and the 'brief'/'data_files' glosses duplicate the schema's own parameter descriptions, so a few phrases fail to earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries the return-shape burden and does so thoroughly: per-page fields, site-wide search settings, theme default vs full, and the specific null case for live_url. An agent has enough to call it correctly and to interpret the result without a second lookup.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67%, and the description compensates by framing `include` as the way to get more in one call and by giving the default and the round-trip rationale for include_theme_config. It repeats some of the schema's enum explanations rather than adding new detail there, which keeps it below a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Fetch details of a single site') and then enumerates exactly what comes back — pages, theme summary, search settings, publish status, URLs. It explicitly contrasts with get_page and get_site_changes, so an agent can place it precisely among siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternatives and the conditions that select them: get_page with view: 'structure' for the node tree, get_site_changes with include_versions: true for history, include for extra bundles, include_theme_config only when round-tripping the theme. Exclusion guidance is explicit rather than implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_site_changesWhat changed on the siteARead-onlyIdempotentInspect
Summarise what changed: pages added or removed, pages whose content changed, and whether the theme or shared header/footer changed. By default the draft against what is live — what is waiting to be published. since: 'previous' includes the last publish; from + to compares any two of live / draft / previous. include_versions adds the three snapshots. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | With `from`. | |
| from | No | With `to`: compare two snapshots instead — e.g. from 'previous' to 'live' is what the last publish did. | |
| since | No | Compare the current draft with 'live' (default — what publishing would change) or 'previous' (everything including the last publish). | |
| site_id | Yes | ||
| include_versions | No | Also return the three snapshots (live, draft, previous) and when each was saved. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description reinforces read-only while adding substantive behavior: the implicit draft-vs-live baseline, what `since: 'previous'` widens to, and that `include_versions` returns three snapshots. It stops short of describing output shape or any size/latency limits, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence carries information: the first defines the output scope, the second the default comparison, the third and fourth the alternate modes, and the last the safety hint. It is front-loaded with the core behavior and has no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully sketches the return categories (added/removed/changed pages, theme/header-footer changes, optional snapshots). It does not mention result size, pagination, or how large diffs are reported, which is a modest remaining gap for a five-parameter comparison tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so the baseline is 3, but the description adds real meaning: it explains that `from` + `to` compares any two of live/draft/previous and gives the concrete example of 'previous' to 'live' being what the last publish did. `site_id` is left unexplained, which is the only gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Summarise what changed') and enumerates exactly what is captured: pages added/removed, content changes, and theme or shared header/footer changes. No sibling tool performs a diff/snapshot comparison, and this scope statement makes that distinct role unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly explains the default comparison ('draft against what is live — what is waiting to be published') and when to switch modes via `since: 'previous'` or `from` + `to`. There is no explicit exclusion or named alternative tool, but the mode-selection guidance effectively tells an agent which configuration to pick for which question.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
insert_nodesAdd sectionsAInspect
Add many nodes to a site in ONE call, batched into one new draft version. Each insertion is {parent_id, position, node}: parent_id locates an existing parent anywhere in the fixture (pages + siteElements), position is 'start' | 'end' | {after_id}, and node is the subtree to splice in. Use this for structural addition — adding a new section to a page, inserting a nav link, adding a card to a grid, restoring a container that was accidentally removed. To add one more of something that already exists (a menu item, card, team member, timetable column, link), send copy_of: instead of node — the copy matches exactly; then patch_nodes its text using the returned id_map. To show a collection's entries on ANOTHER page ('put my three latest projects on the About page'), copy_of the collection-list — or the grid holding it — from a page that already shows them, then set the copy's limit: a list stays in step with the collection, while hand-copied cards go stale the moment an entry changes. Safe alternative to patch_fixture's JSON-Patch 'add' ops: no hand-constructed paths, validated parent + unique-id checks, and the subtree goes through the same primitive schema as any other node. Use get_primitive_schema + get_primitive_schema to shape the new node's data. Tag each content node with its semantic role — "extra": { "slot": "hero-title" } — so the next read of get_page (with view: "content") can say what the node IS rather than reporting a null role; an unknown slot name is rejected with the closest valid ones, and untagged content comes back as a warning. If a parent or after_id is missing, or a new id collides, the whole batch is rejected. Up to 50 insertions per call. A node may also be sent as a JSON string (node as a string, or a single top-level parent_id + node_json).
| Name | Required | Description | Default |
|---|---|---|---|
| site_id | Yes | ||
| insertions | Yes | Array of insertions, each placing a new node under a parent. All applied as ONE new draft version. Position defaults to 'end' when omitted. If any parent_id is missing, or any new node id collides with an existing id, or the after_id doesn't match an existing child of parent_id, the whole batch is rejected. Up to 50 insertions per call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false / destructiveHint=false; the description adds the traits that actually matter: all insertions land in one new draft version, the batch is all-or-nothing on a missing parent, colliding id, or bad after_id, and the cap is 50 per call. It further discloses the returned id_map, the slot-tagging validation behavior (unknown slot rejected with closest valid names, untagged content produces a warning), and the extra: {slot} convention for get_page(view: content).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Structure is front-loaded and logical: what it does, insertion shape, structural-add use cases, copy_of alternative, cross-page collection case, safety versus patch_fixture, tagging, failure modes, limits. It is still dense and runs long for a tool description, and the doubled 'get_primitive_schema + get_primitive_schema' plus the unsupported node_json variant are sentences that don't earn their space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, yet the description still tells the agent what comes back (id_map for copies), what a rejection looks like and its three triggers, and the batch size ceiling — everything needed to call it correctly and to chain patch_nodes afterward. For a 2-parameter, atomic, mutation tool this is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
At 50% schema coverage the description does real work: it explains position's three spellings, that parent_id may point anywhere in the fixture (pages + siteElements), and the copy_of-versus-node decision with the copy's exact-match/fresh-id semantics. It loses a point for describing an input shape the schema forbids — a single top-level `parent_id` + `node_json` — which would fail against this draft-07 schema's root `additionalProperties: false`, and for the garbled 'Use get_primitive_schema + get_primitive_schema'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Add many nodes to a site in ONE call, batched into one new draft version') and immediately names the sibling it supersedes for raw path-level edits (patch_fixture's JSON-Patch 'add'). It also splits the space between inserting new subtrees and cloning existing ones via copy_of, so an agent can distinguish this from add_section, add_page, or move_nodes without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
When-to-use is spelled out with concrete scenarios (new section on a page, nav link, card in a grid, restoring a removed container), and when to switch to copy_of is given with its own trigger ('adding one more of something that already exists') plus a follow-up step (patch_nodes the copy's text via id_map). It even routes the cross-page collection case ('put my latest projects on the About page') to copy_of the collection-list with limit set, which is a non-obvious alternative an agent would otherwise get wrong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_contactsList site contactsARead-onlyIdempotentInspect
List contacts who have interacted with a site (filled a form, subscribed to newsletter). Filter by text, tags, or activity thresholds (min_submissions, subscribed_only, since). Ordered by most recent activity. Pass email for everything about one person: their record and their timeline ('tell me everything we know about Sarah').
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| No | One person: returns their contact record (activity totals, tags, subscription) and their timeline — form submissions and newsletter events, newest first, up to `limit`. The other filters are ignored. | ||
| limit | No | ||
| since | No | ||
| offset | No | ||
| search | No | ||
| site_id | Yes | ||
| min_submissions | No | ||
| subscribed_only | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety burden is covered. The description adds real behavioral context beyond that: default ordering by most recent activity, that `email` overrides all other filters, and that the timeline is capped at `limit`. It doesn't mention pagination behavior of `offset` or the shape of a list-mode result, keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, front-loaded with the core capability, followed by filters and then the special email mode. The paraphrased example ('tell me everything we know about Sarah') earns its space by disambiguating intent. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description covers the return shape for the email mode (contact record plus timeline, newest first, up to `limit`). The list-mode row shape isn't described, which is the main gap for a 9-parameter listing tool. Otherwise an agent has enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 11%, so the description has to carry the load, and it does: it names the filter axes (text, tags, activity thresholds) and maps them to `min_submissions`, `subscribed_only`, and `since`. The `email` mode's override semantics ('the other filters are ignored') are also stated in prose. `limit` and `offset` paging semantics are left to the schema defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List contacts who have interacted with a site') and scopes it with concrete qualifiers (filled a form, subscribed to newsletter). This clearly separates it from sibling tools like list_submissions and read_submission, which operate on individual form entries rather than contacts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says which filters to use for list queries and dedicates a sentence to the alternate mode: 'Pass `email` for everything about one person.' The when-to-use for the single-person lookup is concrete and even includes a natural-language example. It stops short of naming sibling alternatives such as list_submissions, so it's not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_content_itemsList content itemsARead-onlyIdempotentInspect
List content items (e.g. blog posts, projects) for a site filtered by content_type slug. Optionally filter by visibility ('public' | 'private' | 'all'; default 'all'), with limit/offset paging. Returns each item's id, slug, full content JSON, visibility, and timestamps. Use add_content_item / edit_content_item / delete_content_item to mutate the collection.
| Name | Required | Description | Default |
|---|---|---|---|
| filters | No | ||
| site_id | Yes | ||
| content_type | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety burden is covered; the description adds genuine value beyond that by disclosing the returned fields (id, slug, full content JSON, visibility, timestamps) and the paging mechanism. It still doesn't mention pagination limits or total counts, but that is a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences: scope first, filters second, return shape third, alternative-tool note last. No redundancy and nothing before the key filtering constraint.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming returned fields, and annotations cover the safety profile, leaving an agent able to call it correctly. Only pagination behavior/limits remain unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load; it does define content_type as a slug filter and enumerates visibility values, but the visibility default is already in the schema and it never explains site_id or the limit/offset semantics (default 50, max 200) beyond the word 'paging'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List content items') with concrete examples (blog posts, projects) and the scoping key (site + content_type slug), which cleanly separates it from siblings like list_content_types or list_sites.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes mutation intent to add_content_item / edit_content_item / delete_content_item, so the agent knows this is the read path. However, it gives no guidance on when to prefer this over other listing/read tools (e.g. list_content_types, get_site_tree) or prerequisites for the content_type slug.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_content_typesList content typesARead-onlyIdempotentInspect
List every content collection declared on a site, with its per-item field schema (fields[]). Schemas are per-site — there is no platform-wide catalog. Each entry includes the collection's contentType slug, its pathPrefix, whether it's enabled, and the typed fields[] (each with key, type, optional required, label, description, options for select fields), PLUS observed_fields — keys that actually appear on the collection's items but aren't in the declared schema (the schema is open, so include these when adding an item so it matches the existing ones). Call this before add_content_item to discover which fields a collection supports — or before create_collection to confirm a contentType isn't already taken.
WHAT EACH type HOLDS, because the name does not say: text / textarea / rich-text (HTML) / url / date / select -> string; number -> number; boolean -> boolean; tags -> string[]; image -> an object { "url": "…", "alt": "…" }, NOT a bare string (a plain URL is accepted on write and stored as { url }; send alt when you have it). That last one is the one that gets guessed wrong.
| Name | Required | Description | Default |
|---|---|---|---|
| site_id | Yes | Site whose collection catalog to list. Each site has its own schemas — there is no platform-wide catalog. | |
| content_type | No | Instead of the catalog: the {{tokens}} one collection's detail template and cards can use (e.g. {{title}}, {{cover.url}}) — read it before writing a detail template or a card. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive and closed-world, so safety is covered. The description adds genuinely non-obvious behavioral context: schemas are per-site with no platform catalog, the schema is open so `observed_fields` should be included on write, and `image` fields are stored as `{url, alt}` objects rather than strings. It does not cover pagination or response size, but the extra context is substantive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what it lists and the primary call-before guidance, then a clearly separated block for field-type semantics. The type-mapping block is dense and long, but its caveat about `image` objects earns its space; minor tightening of the field enumeration would improve it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully carries return-value burden: it enumerates every returned property and maps each `type` to its underlying value shape. Nothing an agent needs to call this correctly and interpret the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both `site_id` (per-site catalog) and the `content_type` detail-template mode are already documented in the schema. The description reinforces per-site scoping but adds no syntax or examples for the `content_type` parameter itself, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ('List every content collection declared on a site') and immediately states the per-site scope plus the returned shape (`fields[]`, `contentType`, `pathPrefix`, `observed_fields`). An agent can distinguish it from `list_content_items` or `get_primitive_schema` without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes two workflows: 'Call this before `add_content_item` to discover which fields a collection supports — or before `create_collection` to confirm a contentType isn't already taken.' Both the when and the specific sibling alternative are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_site_imagesList a site's uploaded imagesARead-onlyIdempotentInspect
List the images in a site's library, newest first, with their public URLs. Two main uses: collecting what arrived after you sent someone to the editor with get_editor_link (pass since with the moment you sent it, then place the results with patch_nodes), and checking what a site already has before uploading something it may already hold. Returns storage paths and byte sizes alongside the URLs.
Place what you find with patch_nodes, never patch_fixture or replace_site. If the image arrived because you sent someone a get_editor_link, they may still be in the editor right now; the full-replace tools overwrite the entire draft with no conflict check and would discard their work silently. patch_nodes re-applies onto concurrent edits instead.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum images to return, newest first. Default 30. | |
| since | No | ISO-8601 timestamp. Return only images uploaded after this moment — use it after handing out an upload link to see just what arrived. | |
| site_id | Yes | The site UUID whose image library should be listed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so safety is covered. The description adds ordering (newest first), return payload contents (public URLs, storage paths, byte sizes), and a conflict-behavior warning about concurrent edits in the editor. Most of that warning concerns the sibling write tools rather than this tool itself, which keeps it just short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The lead sentence front-loads purpose and return shape, and the two-use framing follows immediately. The second paragraph is slightly long and spends more words on sibling-tool hazards than on this tool, but every sentence carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by naming the returned fields. For a three-parameter read tool with full annotation coverage, an agent has everything needed 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so site_id, limit, and since are already fully documented, establishing a baseline of 3. The description adds a workflow-level interpretation of `since` (pass the moment you sent the editor link), but no format or edge-case detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ("List the images in a site's library, newest first, with their public URLs") and distinguishes itself from the upload-side siblings (upload_image, find_images, replace_images_from_search) by describing a read of the existing library. An agent knows exactly what it gets back without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names two concrete situations to use it (collecting what arrived after get_editor_link, and checking pre-existing images before upload) and pairs each with the follow-up tool. It goes further and states which downstream tools NOT to use (patch_fixture, replace_site) and why, which is real routing guidance rather than implied usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sitesList sitesARead-onlyIdempotentInspect
List all websites owned by the current user. Returns subdomain, publish status, plan tier, creation date, and URLs for each. Share url — it always resolves. live_url is null for a site that has never been published: that site has no public address yet, so say so and offer publish rather than handing over a link. Use get_site for per-site detail.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so safety is covered structurally. The description adds real value beyond that by explaining the null `live_url` semantics and how the agent should respond to it, though it says nothing about result volume or ordering for larger accounts.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five short sentences, each earning its place: purpose, return fields, the `url` guarantee, the `live_url` null case with a prescribed action, and the sibling pointer. The most decision-relevant constraints are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, no nested objects, and no output schema, the description carries the return-shape burden itself and does so by listing the key fields plus the one field whose null value changes agent behavior. Nothing needed to call or interpret it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics to document and the baseline of 4 applies. The description correctly devotes its space to return-value semantics instead.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List all websites owned by the current user') and enumerates what comes back (subdomain, publish status, plan tier, creation date, URLs). It explicitly differentiates from the sibling get_site by scoping itself to listing and pointing to get_site for per-site detail.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative ('Use get_site for per-site detail') and gives concrete handling guidance: share `url` because it always resolves, and when `live_url` is null offer publish instead of a link. The when-to-use and the edge-case behavior are both explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_submissionsList form submissionsARead-onlyIdempotentInspect
List form submissions for a site. Returns summaries (name, email, form_type, source — which page/form the submission came from, e.g. a specific job position — is_read, preview of message, and attachments — any uploaded files as {field, name, url} with DURABLE download links safe to paste into an exported Google Sheet / CSV) plus a monthly_counter block (used / limit / over_limit / locked / month / plan). The allowance is per calendar month; a month's locked submissions stay locked after it ends. Capture is NEVER gated on any plan: every submission is stored and forwarded to the site's webhook regardless of the count. Each one is also emailed to the site owner's account address — on by default, switched per site from the dashboard's Submissions panel; it can't go to a different address (for that, set the form's integration.webhookUrl). What the allowance controls is READING. On Free, submissions past a month's allowance come back with locked: true — created_at and form_type only, with name, email, description and attachments withheld; say plainly that the submission arrived and was kept. Do NOT imply anything was lost or dropped, and do not pitch a plan change on the back of it, and do not try to recover a locked submission through read_submission or the contact tools — they withhold it too. Pro never locks. Filter by form_type, unread_only, or since-timestamp. form_type is free-form text set by whoever built the form — the built-in presets are contact, waitlist, newsletter, rsvp, quote, application and custom, but templates ship their own (e.g. booking, tour-request, commission-enquiry), so read the form_type values off an unfiltered call before filtering on one. Use read_submission to fetch the full payload of one.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| since | No | ||
| site_id | Yes | ||
| form_type | No | ||
| unread_only | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses detailed behavior: return summary fields, durable attachment links, the `monthly_counter` structure, per-calendar-month allowance semantics, locked-submission behavior on Free, and the fact that capture is never gated on plan. It also gives important agent-facing guidance not to imply data was lost or to pitch a plan change, which is unusually rich 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and return shape, then proceeds through allowance and filtering details. It is long, but most sentences carry non-obvious behavioral or policy information that an agent needs in order to respond correctly to locked submissions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the burden of explaining return values, and it does so in detail: summary fields, attachment links, and the `monthly_counter` block. It also explains the complex locked-submission behavior and filter semantics thoroughly 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description adds useful meaning for three of five parameters: `form_type`, `unread_only`, and `since`. However, it does not explain `limit` or add much beyond the obvious for `site_id`, so it only partially compensates for the lack of schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific verb and resource: "List form submissions for a site." It clearly distinguishes itself from `read_submission` by saying this returns summaries and by explicitly directing the agent to `read_submission` for the full payload of one submission.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly names when to use this tool versus `read_submission`, lists the available filters, and warns that `form_type` is free-form so an unfiltered call should be read before filtering. It also explains that locked submissions cannot be recovered through `read_submission` or contact tools, which is a clear usage constraint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_nodesReorder layoutADestructiveInspect
Move a node to a new position in its page/element tree — reorder it within its current parent (e.g. push a section to the top) or re-parent it under a different container in the SAME tree. This is the safe reordering primitive: it takes node ids (not brittle JSON-Patch index paths) and is validated against the actual tree. position is 'start' / 'end' / { after_id }. Rejects moving a root node, moving a node into itself or its own descendant, and cross-tree moves (use add_page (with copy_of) / insert_nodes for those). Writes one new draft version.
| Name | Required | Description | Default |
|---|---|---|---|
| node_id | Yes | Id of the node to move. | |
| site_id | Yes | ||
| after_id | No | The sibling id, when position is the string 'after'. Equivalent to position: { after_id: '...' } — send either. | |
| position | Yes | Where under the target parent: 'start', 'end', { after_id: '...' }, or 'after' with a separate after_id argument. Both spellings of 'after' are accepted. Required — a move has a destination by definition. | |
| target_parent_id | Yes | Id of the parent the node should move under. Must live in the SAME page/element tree as node_id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false, readOnlyHint=false, and the description adds real context on top: which operations are rejected and that the tool 'writes one new draft version' rather than mutating live content. It stops short of covering recoverability (undo) or what the response returns, but the safety profile is well conveyed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and its two modes, then constraints, then alternatives — a sensible order. The position-value recap slightly duplicates the schema, and the single dense paragraph could be split for scanability, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-idempotent mutation with no output schema, the description covers the essentials: modes, validation rules, and the draft-version write. The remaining gap is what the agent gets back and whether the move can be reversed via undo, which would round it out.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80% and already documents all five parameters, so baseline would be a 3. The description adds genuine meaning beyond the schema by spelling out the position vocabulary ('start' / 'end' / { after_id }) inline and by stating that target_parent_id must live in the same page/element tree as node_id — a server-side constraint the schema only hints at.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (move a node) and immediately scopes it to two modes: reorder within the current parent or re-parent within the SAME tree. It also self-describes as 'the safe reordering primitive,' which separates it cleanly from insert_nodes and add_page named later.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit exclusions and alternatives: cross-tree moves should use add_page (with copy_of) / insert_nodes. It also enumerates the rejected cases (root node, self/descendant, cross-tree), so the agent knows both when to use it and when the call will fail.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
patch_fixtureRestructure siteADestructiveInspect
Apply an RFC 6902 JSON Patch (array of add/remove/replace ops) to the latest fixture snapshot for a site, then save the result as a draft version. Use this when you need precise multi-field edits across the fixture (theme tokens + a couple of nodes + a header swap) without shipping the full fixture again. Paths are JSON Pointers (e.g. '/theme/config/colors/primary' or '/pages/0/tree/children/2'). Returns the preview URL. Call screenshot_page if you want to see the result.
| Name | Required | Description | Default |
|---|---|---|---|
| site_id | Yes | ||
| json_patch | Yes | RFC 6902 JSON Patch — array of {op, path, value?} operations. Supported ops: add, remove, replace. Paths are JSON Pointers (e.g. '/pages/0/tree/children/0/data/text'). Applied in order against the latest fixture snapshot. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered. The description adds genuinely new context beyond the annotations: the mutation lands in a 'draft version' rather than the live site, the return value is a preview URL, and screenshot_page is the follow-up for visual verification. It stops short of saying whether existing draft edits are overwritten.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five tight sentences, each earning its place: action, when-to-use, path format, return value, and follow-up tool. The core operation is front-loaded before the routing and format details. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly covers the return value ('Returns the preview URL') and the follow-up verification path. It also handles the path-format subtleties of JSON Pointer. It omits the 200-op limit and whether the prior draft is replaced, which are minor gaps for a two-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50% and the description's path-format note ('/theme/config/colors/primary', '/pages/0/tree/children/2') largely duplicates the example already present in the json_patch schema description, though the theme-token example is new. site_id remains undocumented in both places, albeit self-evident as a UUID. The description adds only marginal meaning over the schema, so baseline 3 is right.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Apply an RFC 6902 JSON Patch ... to the latest fixture snapshot for a site, then save the result as a draft version.' It clearly conveys the operation and its output state. It implicitly contrasts with update_site_from_fixture ('without shipping the full fixture again') but never names a sibling tool, so it falls short of full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use condition: 'Use this when you need precise multi-field edits across the fixture ... without shipping the full fixture again.' That is a clear routing rule. However, it offers no when-not guidance and does not name alternatives (e.g. patch_nodes, update_site_from_fixture) that an agent might otherwise confuse it with.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
patch_nodesWrite contentADestructiveInspect
Apply many node-level patches to a site in ONE call, batched into one new draft version. The primary patch primitive — there is no single-node tool. Each patch entry provides the node_id plus one or more shorthand fields: 'text' for copy (auto-routes to data.text for heading/button/link/nav-link/banner-bar, data.content for text/rich-text/blockquote), 'href' for link destinations, 'src'/'alt' for images, 'slot' to set or correct a node's semantic role. For props not covered by shorthands (level on heading, variant on button, items on accordion), use 'data_patch' — its keys are validated against the primitive schema (prevents silent failures where the renderer ignores your key). Patches are independent: valid ones are saved even if others fail, and each failure comes back in 'rejected' with the reason, so send a small follow-up call for those rather than resending everything. Typical post-create flow: read the manifest, build an array of {node_id, text} entries for every placeholder copy string, send ONE call. Order doesn't matter — patches merge independently. Repeat entries for one node_id are merged; only two different values for the same field are rejected. Node ids are searched in pages, then header/footer/pageLayout, then COLLECTION DETAIL TEMPLATES — so the labels and CTAs around a detail page's {{placeholders}} (get_page (with view: "content")'s collections[].template_nodes) are patchable like anything else; the response names those under collection_templates_touched, because one such patch changes every item page in that collection at once. Returns dead_links when the site is left with an internal link whose target route does not exist — check it before reporting the work done, because a card whose text is right and whose href is stale looks finished and 404s on click. A patch that changes a text colour, a background or a variant is followed by a contrast check of the rendered pages it touched (a few seconds), and text it left unreadable comes back in unreadable_text — fix it before you reply.
| Name | Required | Description | Default |
|---|---|---|---|
| patches | Yes | Array of patches, each targeting a node by id. All valid patches are applied as ONE new draft version. Patches are independent: one that names a missing node or an invalid key is skipped and itemized in `rejected` while the rest still land, so a single bad entry no longer discards the batch. Check `patches_rejected` on the response and send a follow-up call for those only. A node_id may appear more than once — the entries are merged for you, and only a genuine disagreement (the same field set to two different values) is rejected. | |
| site_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (destructiveHint/idempotentHint/openWorld) by disclosing partial-success semantics, duplicate-node_id merge rules, search order across pages/header/footer/collection templates, the collection_templates_touched side effect that changes every item page at once, plus post-write dead_links and unreadable_text/contrast-check side effects. These are exactly the behaviors an agent must anticipate before invoking a destructive batch write.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the 'primary patch primitive' claim are front-loaded, and nearly every sentence carries operational value (rejected handling, merge rules, template side effects). It is, however, a single dense paragraph with some overlap against the nested schema descriptions and would read better chunked.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, yet the description documents the notable return fields — rejected/patches_rejected, dead_links, unreadable_text, collection_templates_touched — and warns to check dead_links before reporting completion. Nothing material is missing for a 200-item batch mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Adds real routing meaning beyond the schema: which node types each shorthand lands on, that data_patch keys are camelCase and validated against the primitive schema, and that unknown keys reject the patch with allowed keys listed. Slightly reduces confidence because the routing summary omits 'callout' and says nav-link routes to data.text while the schema says data.label for nav-link's label.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (node-level patches applied in one call, batched into one new draft version) and explicitly positions itself as the primary primitive — 'there is no single-node tool' — separating it from insert_nodes, update_page and move_nodes. An agent can identify the tool's role without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use guidance via the 'typical post-create flow' (read manifest, build {node_id, text} entries, send ONE call) and explicit failure routing (send a small follow-up for entries in 'rejected' rather than resending everything). It also names the alternative (get_primitive_schema) for cases the shorthands don't cover.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
publishPublish site, page or itemADestructiveInspect
Make the draft live. With no page_slug or item it promotes the whole draft — the step that turns a draft into a real site; until it runs the live URL does not resolve. With page_slug it publishes one page; with item, one collection item. Publish ONLY on the owner's explicit yes after they have seen the preview — never auto-publish, and don't read 'change X' as 'change X and publish'. If it returns billing_gate, pass its message on as it is and ask the owner what to do; never unpublish another site to make room. Reversible with undo (what: 'last_publish'). The returned url is verified to render.
| Name | Required | Description | Default |
|---|---|---|---|
| item | No | Publish ONLY this collection item (a blog post, a product): add_content_item writes a draft, this takes it live. Omit to publish the whole site. | |
| locale | No | Locale of the page or item variant. Defaults to 'en'. | |
| site_id | Yes | ||
| page_slug | No | Publish ONLY this page (e.g. '/about', '/' for home), leaving every other page and the site-wide header/theme as they are. The site must already be live. Omit to publish the whole site. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (destructiveHint/idempotentHint/openWorld) by disclosing that the live URL does not resolve until this runs, that the action is reversible via undo with what: 'last_publish', and that a billing_gate result must be surfaced verbatim rather than worked around by unpublishing another site.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and scope rules, then the consent gate, then error handling. Dense and mostly waste-free, though the 'with page_slug it publishes one page; with item, one collection item' sentence partly restates what the schema already documents.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-idempotent mutation with no output schema, it covers the side effect (live URL), reversibility, the consent precondition, the error path, and what the returned url guarantees. An agent has everything needed to invoke it safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, and the description reinforces the crucial default semantics — omitting page_slug or item promotes the whole draft, and passing them narrows scope to a single page or collection item. It adds intent-level meaning (page_slug requires an already-live site) but leaves locale unaddressed beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Make the draft live') and then enumerates the three scope modes: whole draft, one page via page_slug, one item via item. This lets an agent distinguish it from siblings like add_page, add_content_item and unpublish without reading any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use gate: only after the owner's explicit yes following a preview, with an explicit prohibition on auto-publishing and on inferring publish intent from 'change X'. It also names the correct alternative flow (add_content_item writes the draft, this takes it live).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_rendered_pageRead the rendered pageARead-onlyIdempotentInspect
THE DEFAULT WAY TO CHECK YOUR WORK. Fetch a page's SERVER-RENDERED text via the preview URL — the visible copy, headings, and (for collection/list pages) the expanded items — in ~35ms with no browser. Call it on every page you touched, before showing the user anything. It is what catches the failure you cannot otherwise see: template copy that survived your edit. A consultant template's funding-stage dropdown on a bike shop, a US Medicare FAQ on a UK dental practice — both shipped because nobody read the page back, and neither looks like an error in a diff. Prefer this over screenshot_page, which runs a real browser, takes ~40x longer, and answers a different question (how it LOOKS, not what it SAYS). Read-side pair to get_page (with view: "structure"): that shows STRUCTURE, this shows RENDERED CONTENT. Reads the draft via the preview URL. Read-only. live: true checks the published site instead (and its dead links); item renders one collection item's draft.
| Name | Required | Description | Default |
|---|---|---|---|
| item | No | Render one collection item's DRAFT through its detail template, without publishing: its text, links and problems such as unresolved {{placeholders}}. Use it right after add_content_item or a detail-template edit. | |
| live | No | Check the LIVE site instead: that it is published and renders, and which internal links point at pages that do not exist (`dead_links` — fix those before telling the owner it is ready). Use it after publishing, before sharing the address. | |
| slug | No | Page slug to read (e.g. '/' or '/blog' or '/blog/my-post'). Defaults to '/'. | |
| site_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description still adds substantive behavior: server-side render in ~35ms with no browser, reads the draft via preview URL, live mode also surfaces dead links. It also explains what it catches that a diff cannot — exactly the context an agent needs to trust 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the primary directive and the key contrast, but the bike-shop and Medicare FAQ anecdotes, while persuasive, add length that a schema-driven reader does not strictly need. Efficient overall, slightly padded by narrative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does describe the return shape (rendered text, headings, expanded items, `dead_links`) and the two modes. Missing only explicit pagination/size limits for very large pages, which is minor for a read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The `live`, `item`, and `slug` parameters are all given purpose and timing in the description, well beyond the schema's own text. `site_id` is left undocumented in both places, but the remaining semantics are strong enough to exceed the 75%-coverage baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch a page's SERVER-RENDERED text via the preview URL') and enumerates what comes back (visible copy, headings, expanded list items). It explicitly separates itself from get_page (structure) and screenshot_page (looks), so an agent can pick it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit triggers: 'Call it on every page you touched, before showing the user anything', prefer over screenshot_page, `live: true` after publishing and before sharing the address, `item` right after add_content_item or a detail-template edit. Alternatives and exclusions are named outright.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_submissionRead form submissionAIdempotentInspect
Fetch the full content of a form submission by id — name, email, message, every field value, and the form's schema at submission time. By default also marks the submission as read. Set mark_read=false to leave the is_read flag alone.
| Name | Required | Description | Default |
|---|---|---|---|
| mark_read | No | ||
| submission_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, and the description explains precisely why: the tool marks the submission as read by default, and it gives the escape hatch (mark_read=false to leave the is_read flag alone). This explains the mutation, its opt-out, and is consistent with idempotentHint=true (marking read twice is idempotent) and destructiveHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the primary fetch purpose, then the side effect and its override. No filler; every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the returned fields (name, email, message, every field value, schema at submission time) and discloses the read-marking side effect. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the load; it does so for mark_read, explaining the default behavior and what false does—well beyond the bare boolean schema. submission_id is only implied by "by id" and not elaborated (e.g. UUID), leaving a small gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Fetch the full content of a form submission by id") and enumerates exactly what comes back (name, email, message, every field value, schema at submission time). The "by id" framing distinguishes it from list_submissions at a glance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: fetching a submission requires an id, and the mark_read default is explained. But there is no explicit guidance on when to choose this over siblings like list_submissions or draft_reply_to_submission, nor any precondition about obtaining an id first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_custom_domainDisconnect a custom domainADestructiveIdempotentInspect
Detach a custom domain from a site (apex + www) and delete it from Sitelas's records — for a typo'd domain, a swap to another, or to stop serving a hostname (the *.sitelas.com address keeps working). Requires confirm: true. Afterwards the owner removes the DNS records at their registrar; Sitelas can't.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Hostname to remove. Must match the exact domain stored against this site. | |
| confirm | Yes | Required boolean — pass `true` to confirm. Forces deliberate removal: the domain is detached from the Vercel project AND deleted from Sitelas's records. | |
| site_id | Yes | The site UUID the domain is attached to. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true and idempotent=true, so the bar is lower, but the description still adds real value: it discloses that the domain is removed from both the Vercel project and Sitelas's records, that the *.sitelas.com address keeps working, and that the owner must remove DNS at the registrar afterwards. The confirm: true requirement is also surfaced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence that is front-loaded with the core action, then the reasons, then the confirm requirement, then the post-action note. It's slightly long but nearly every clause carries meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and annotations covering safety, the description supplies the missing operational context: what remains working, what the caller must do after (DNS at registrar), and what Sitelas cannot do. Enough to call it correctly, though a hint about verifying removal isn't included.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and all three parameters are documented in the schema, so baseline is 3. The description reinforces the confirm requirement and the apex+www scope but adds little syntax or format detail beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource pair (detach/delete a custom domain from a site) and clarifies the apex + www scope. It is clearly distinguishable from sibling tools like set_custom_domain and check_custom_domain without opening their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names concrete situations that select this tool — a typo'd domain, swapping to another domain, or stopping serving a hostname — which gives the agent clear usage context. It stops short of explicitly naming set_custom_domain as the swap alternative, so it's a 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_nodesDelete sections and elementsADestructiveInspect
Delete many nodes from a site in ONE call, batched into one new draft version. Locate each node_id across pages, siteElements and collection detail templates, and splice it out of its parent's children array. Use this for structural subtraction — dropping a testimonials section, removing a nav link, cutting one card from a grid, removing a header/footer column — whenever the brief calls for the template's layout minus something. Safe alternative to patch_fixture's JSON-Patch 'remove' ops for the same purpose: no hand-constructed paths, validated against the actual tree, and rejects root-node removal so you can't nuke a whole page. If a node id isn't found, the whole batch is rejected (fix and retry). Up to 50 removals per call.
| Name | Required | Description | Default |
|---|---|---|---|
| site_id | Yes | ||
| node_ids | Yes | Array of node ids to remove from the fixture. The tool locates each across pages + siteElements + collection detail templates and splices it from its parent. All removals apply as ONE new draft version. Root nodes (page tree root, header root, footer root, pageLayout root) cannot be removed — use delete_page for that. Each node_id may appear at most once. Max 50 per call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive=true and non-idempotent, but the description adds substantially more: all removals collapse into ONE new draft version, operations are validated against the actual tree, the batch is all-or-nothing (a single missing node id rejects everything), root nodes are refused, and there is a 50-removal cap. These are failure and atomicity semantics an agent cannot infer from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and scope, then alternatives, then failure semantics — a sensible order with no filler. The closing 'Up to 50 removals per call' duplicates the schema's maxItems, and the traversal detail overlaps node_ids, so it is slightly longer than strictly needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive batch mutation with no output schema, the description supplies everything an agent needs: what gets created (a new draft version), atomic failure behavior, root protection, the count limit, and the safer-alternative framing. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
node_ids already carries a detailed schema description covering traversal locations, splice behavior, root-node refusal, uniqueness, and the 50 cap — the prose largely restates this. site_id is undocumented in both places (schema coverage 50%), and the description adds nothing about it. Adequate, but little value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (delete many nodes from a site) plus the scope constraint (in ONE call, batched into one new draft version). The concrete examples — dropping a testimonials section, removing a nav link, cutting a card from a grid — make the operation unmistakable and distinguish it from siblings like delete_page, move_nodes, and patch_nodes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the use case ('structural subtraction ... whenever the brief calls for the template's layout minus something') and the alternative (patch_fixture's JSON-Patch 'remove' ops), with the reasons selecting this tool: no hand-constructed paths, tree-validated, no root removal. It also routes root-node deletion to delete_page, so both the when and the when-not are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
replace_images_from_searchReplace imagesADestructiveInspect
Replace many image nodes at once: for each {node_id, query} patch, search Pexels, upload the top match to the site's CDN, and patch the node's src + alt — all in ONE tool call, batched into ONE new draft version. Use this after create_site_from_template to swap every placeholder image at once instead of doing 2N sequential calls (find_images + upload_image (with url) per image). Build the patches array from the manifest's image_nodes (each entry has a suggested_query you can use directly, override when the brief calls for something more specific). Up to 20 images per call. Each patch's node_id must exist in the current fixture; missing nodes are reported as skipped (not fatal — other patches still apply).
| Name | Required | Description | Default |
|---|---|---|---|
| patches | Yes | Array of image-replacement patches. Each item: a node_id from the site's manifest plus a Pexels query. Tool searches, uploads, and patches all in ONE round-trip. Each node_id (and field) may appear at most once. Up to 20 images per call (Pexels rate budget). | |
| site_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint/openWorldHint/idempotentHint=false, but the description adds substantial context beyond them: all patches land in ONE new draft version (not a live publish), missing node_ids are reported as skipped rather than fatal, and there is a hard cap of 20 images per call driven by the Pexels rate budget. These are exactly the mutation-safety and failure-semantics details an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the one-call benefit, then the alternatives, then the input-construction guidance and limits. Dense and nearly every sentence earns its place, though it is a long single paragraph that could be broken up for faster scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but the description covers the essentials for a destructive batch mutation: draft-version isolation, skipped-node reporting, and per-call cap. It could say more about the response shape when some patches are skipped, but nothing critical to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With only 50% schema coverage, the description carries weight by explaining how to build patches from manifest image_nodes and when to override the suggested_query. The 20-item cap and the 'node_id (and field) may appear at most once' uniqueness rule are stated. It stops short of restating the orientation/field semantics, which the schema itself documents well, so it adds value without duplicating everything.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific compound verb chain (search Pexels, upload to CDN, patch src + alt) on a specific resource (many image nodes at once) and explicitly distinguishes itself from the sibling sequence find_images + upload_image. An agent can tell exactly what this tool does that no sibling does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('use this after create_site_from_template to swap every placeholder image'), names the alternative it replaces ('2N sequential calls (find_images + upload_image (with url) per image)'), and explains how to source inputs from the manifest's image_nodes and suggested_query. When-to-use and when-to-use-the-other-option are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
replace_siteReplace the site's design or pagesADestructiveInspect
Replace an existing site's DRAFT. With template_slug: switch it to another template — the owner said 'not my style' and picked another design. The whole draft is replaced (pages, theme, header and footer), so redo the copy and photos for the business afterwards. With fixture: replace everything with a fixture you composed; with page_updates: replace only the listed pages' trees. Saved as a draft — the live URL is unchanged until publish. Share url (the preview) and relay next_step; never say it is live.
| Name | Required | Description | Default |
|---|---|---|---|
| theme | No | Optional theme swap. Can be combined with either fixture or page_updates. | |
| fixture | No | Full updated Fixture — replaces all pages and site elements. Provide this OR page_updates, not both. | |
| site_id | Yes | The site UUID returned by create_site_from_template or list_sites. | |
| page_updates | No | Partial update — only the listed pages are changed. Provide this OR fixture, not both. | |
| template_slug | No | Switch the site to this template (a slug from find_templates): its pages, theme and starter items replace the draft, on the SAME site — never build a second site for a switch. Then rewrite the copy and swap the photos for this business again, as after a first build. Do it only on the owner's yes. | |
| expected_draft_updated_at | No | Optional: the draft_updated_at from the get_page (with view: "content") you built this from. If the draft changed since (the owner edited in the editor), the update is refused with stale_fixture instead of overwriting their work. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and non-idempotent, but the description goes further: it says precisely what is destroyed (pages, theme, header and footer), that the work must be redone afterwards (copy and photos), and that the live URL is unaffected because the result is still a draft. It adds post-call behavior too — share `url`, relay `next_step`, never claim it is live.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then mode-by-mode breakdown, then the post-call instruction — a clean structure. A few clauses (the owner's "not my style" quote, the repeated reminder to redo copy and photos) are slightly padded, but nothing is redundant with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, nested-payload mutation with no output schema, the description covers draft-vs-live semantics, the three payload shapes, consent, and the follow-up agent script; the stale-write guard lives in the schema text. Nothing an agent needs to invoke this safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns above it by explaining the semantic effect of each mode argument (template_slug rewrites the same site rather than creating a new one; fixture replaces everything; page_updates touches only listed page trees). It does not add detail on expected_draft_updated_at or theme combination beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Replace an existing site's DRAFT") and then enumerates the three mutually exclusive modes. An agent can distinguish this from sibling patch_fixture, create_site_from_template, update_page, and set_theme from the text alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit selection conditions per mode (template_slug = owner wants a different design, fixture = replacement you composed, page_updates = only listed pages) and an exclusion rule: "never build a second site for a switch." It also states the consent prerequisite ("Do it only on the owner's yes"), which is exactly the kind of routing an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
review_siteReview the siteARead-onlyIdempotentInspect
Review the draft. Default focus 'health' finds what to fix before publishing — broken links, missing alt text and SEO titles, empty sections, and template content that survived (copy, form options, FAQ and collection items), and text visitors cannot read — it measures contrast on the rendered pages, which is the only check that catches light text left on a light card after a colour change. Run it after a build, a big edit or a set_theme colour change, and fix what it reports. focus 'design' returns design metrics for a self-critique; 'explain' explains the design (pass node_id for one node); 'next' suggests up to 3 next steps. Read-only: it reports and changes nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| focus | No | 'health' (default): problems to fix before publishing — missing alt text, broken or #section links, empty sections, missing SEO titles, copy, form options, FAQ items and collection items still carrying the template's content, and text visitors cannot read (it measures contrast on the rendered pages). 'design': design metrics for a self-critique (section signatures, CTA counts, heading hierarchy, colour/font/spacing use). 'explain': why the design is the way it is — the whole site, or one node with node_id. 'next': up to 3 prioritised suggestions for what to add or fix ('what should I do next?'). | |
| node_id | No | With focus 'explain' (implied when given): explain this one node — its layout role, colours, type and theme tokens. | |
| site_id | Yes | ||
| page_slug | No | With focus 'design': limit to one page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and openWorld, and the description reinforces this with an explicit 'reports and changes nothing' statement. More valuably, it discloses non-obvious behavior: contrast is measured on the rendered pages, which is why it catches light-on-light text after a colour change — context the annotations cannot convey. It stops short of noting cost/latency or result size for a full-site review.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The front-loading is good — 'Review the draft' plus the default-focus behavior comes first — but the description is a dense ~200-word block that duplicates the parameter descriptions almost verbatim (broken links, alt text, SEO titles, form options, FAQ items appear twice). Trimming the mode enumeration to a pointer at the schema would tighten it substantially.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must convey what each mode yields, and it does — problems-to-fix lists, design metrics, per-node explanation, and up to 3 next steps. Read-only safety is covered and the sibling set is unaffected. It could still say roughly how much output comes back from a full-site 'health' pass, but nothing an agent needs to call it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75% and the focus enum is documented in detail inside the schema, so the description largely restates it. It does add two useful inferences beyond the schema: 'health' is the default, and supplying node_id implicitly selects 'explain'. That modest added value fits the baseline-3 case where structured fields do the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (review) against a specific resource (the draft site) and then enumerates all four modes with what each returns, so an agent can distinguish 'health' from 'design', 'explain' and 'next' without opening the schema. The opening sentence is front-loaded and unambiguous about scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit triggers: run after a build, a big edit, or a set_theme colour change, and it maps the 'next' mode to the 'what should I do next?' question. What's missing is routing against siblings — it never says to prefer read_rendered_page or screenshot_page for raw inspection, or get_site for structure — but the when-to-use guidance itself is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screenshot_pageLook at the siteARead-onlyIdempotentInspect
Capture a JPEG when the question is genuinely VISUAL — layout, spacing, hierarchy, whether the hero reads as designed, whether the mobile breakpoint collapses cleanly (pass viewport). Returns the page's text and title alongside the image, fetched concurrently at no extra wall-clock, so you get what the page SAYS as well as how it LOOKS from one call — READ that text, because leftover template copy is the most common way a site ships wrong and it is invisible in an image. Still runs a real browser at ~5s, so when the question is only about wording prefer read_rendered_page at ~357ms. Always captures via the preview URL (preview-{slug}.{rootDomain}), which renders the current draft (or 302s to live when in sync). Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | Page slug to screenshot (e.g. '/' or '/about' or '/work/aperture'). Defaults to '/'. | |
| site_id | Yes | ||
| viewport | No | Render width for the shot: 'desktop' (1280, default), 'tablet' (820), or 'mobile' (390). Use 'mobile' to verify the responsive breakpoint — that columns collapse to one, headings don't overflow, etc. | |
| full_page | No | Capture the ENTIRE page top-to-bottom, not just the first screenful. Set true to verify content below the fold — a contact form, footer, or sections after the hero. Default false = fast top-only crop. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotent, non-destructive), and the description adds substantial context beyond them: ~5s real-browser cost, concurrent text/title fetch at no extra wall-clock, always capturing via preview-{slug}.{rootDomain} which renders the draft or 302s to live. That routing behavior is exactly the kind of non-obvious trait annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core decision ('genuinely VISUAL') before the returns and latency details, and every sentence carries information. It is dense with em-dash asides and runs slightly long, but nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description explains what comes back (page text and title alongside the image) and why to read the text. Combined with latency, preview-URL semantics, and the sibling alternative, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75% and the schema descriptions are already detailed for slug, viewport, and full_page, including the mobile-breakpoint rationale. The description's 'pass viewport' and breakpoint-collapse mention largely restate that structured content rather than adding new syntax or constraints, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Capture a JPEG' of a page) and immediately scopes it to genuinely visual questions, explicitly distinguishing it from read_rendered_page which is name-checked. An agent can tell these two apart 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use criteria (layout, spacing, hierarchy, hero reads as designed, mobile breakpoint collapse) and an explicit when-not ('when the question is only about wording prefer read_rendered_page at ~357ms'). The alternative is named and the selecting condition is quantified with latency.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_card_designRestyle collection cardsAIdempotentInspect
Change how every card of a collection list looks, in one call: design swaps the whole card (a library design from set_card_design (with no design) — each takes the site's own fonts and colours and keeps every field the card shows — a plain arrangement, or 'as-designed' to put the original back), and style adjusts it (surface, corners, padding, photo shape, text alignment, hover). Prefer this to rewriting a card template with patch_nodes/insert_nodes (with parent_id and node_json): it cannot drop a field, break the card's link or lose the way back. Writes one draft version. With neither design nor style it changes nothing and returns the designs and style choices that fit this list's card, with its current style.
| Name | Required | Description | Default |
|---|---|---|---|
| style | No | Card style settings, applied after `design`: surface, corners, padding, photoShape, align, hover. Omitted settings are left as they are. | |
| design | No | 'as-designed' (put back the card the site was built with), a plain arrangement ('image-top', 'overlay', 'image-left', 'text-only'), or a library design id from set_card_design (with no design). | |
| site_id | Yes | ||
| list_node_id | Yes | Id of the collection-list node whose cards to change. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the annotations by disclosing that it 'Writes one draft version', that changes are reversible via 'as-designed ... to put the original back', and that an empty call is a pure read. These are real behavioral facts annotations cannot convey. Missing: what happens on a list node that is not a collection list, or whether the draft must be published afterward.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One long sentence with nested parentheticals that reference the tool by its own name makes it hard to parse on first read. The core verb is front-loaded, but the recursion and stacked clauses cost the reader effort that a short bulleted split would have avoided.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema and no readOnly annotation, this covers the safety story (non-destructive, reversible, draft-only) and the discovery path. The main gap is that the draft/publish lifecycle and the 'library design' discovery flow (an empty call returns design ids) are only implied, not spelled out in sequence.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 75% schema coverage the schema already documents most fields, yet the description still adds value by naming the two design families (library designs, plain arrangements such as image-top/overlay) and enumerating the style dimensions (surface, corners, padding, photo shape, text alignment, hover). It does not explain what any individual style enum value visually does, so an agent must guess between 'border'/'shadow'/'filled'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource plus scope: 'Change how every card of a collection list looks, in one call'. The two-parameter split (design swaps whole card, style adjusts it) is clearly stated. It loses a point for the circular phrase 'a library design from set_card_design (with no design)', which forces the reader to reconstruct meaning from itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes away from the tempting alternative: 'Prefer this to rewriting a card template with patch_nodes/insert_nodes ... it cannot drop a field, break the card's link or lose the way back', and gives the reason. It also defines a discovery mode ('With neither design nor style it changes nothing and returns the designs and style choices'), so an agent knows how to explore before mutating.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_custom_domainAttach a custom domainADestructiveIdempotentInspect
Attach a custom hostname (e.g. example.com, www.example.com, app.example.com) to a Sitelas site. Registers the domain with the CDN, stores it against the site, and returns the EXACT DNS records the user needs to add at their registrar — apex domains get an A record (76.76.21.21) plus a www CNAME, subdomains get a single CNAME. Records are returned both structured (dns_records) and as a copy-pasteable human-readable list (dns_instructions). Relay dns_instructions and next_step verbatim. After DNS propagates (5–30 min typical), call check_custom_domain (with domain) to flip the verified flag. Custom domains are a Pro feature: on a Free site (list_sites and get_site give each site's plan) it returns billing_gate — say so once, before offering to connect one.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Apex or subdomain hostname like `example.com` or `www.example.com`. Do NOT include a protocol (`https://`) or trailing slash. | |
| site_id | Yes | The site UUID to attach the custom domain to. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without the annotations an agent would be guessing, but the description still adds far more than they do: what gets stored, the paid-plan gate, propagation timing, and the instruction to relay dns_instructions and next_step verbatim. It does not address the destructiveHint=true annotation, so an agent cannot tell whether attaching replaces or conflicts with an already-attached domain; that is the remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and its effect, then the follow-up and the plan gate in decreasing order of importance. It is a single dense paragraph running long, but nearly every clause carries actionable information; the example hostname list is the only mildly redundant part.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by naming the returned fields (dns_records, dns_instructions, next_step) and how to use them. Combined with the verification follow-up and the billing gate, an agent can complete the whole task flow from this description alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real semantics: apex versus subdomain hostnames produce different DNS record sets (A record plus www CNAME vs a single CNAME). That is behavior the schema's regex cannot convey, though per-parameter prose is otherwise left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Attach a custom hostname ... to a Sitelas site') and then spells out the mechanics: registers with the CDN, stores it against the site, returns DNS records. It is clearly distinguishable from check_custom_domain (verification) and remove_custom_domain (teardown) in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: after DNS propagates (5-30 min) call check_custom_domain with the domain, and on a Free-plan site the tool returns billing_gate, which the agent should mention once before offering to connect. Both the follow-up step and the when-not case (Free plan) are stated, along with where plan info comes from (list_sites/get_site).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_themeChange the site's lookADestructiveInspect
Change the site's colours and fonts in the draft — any subset; what you leave out is kept, and text that would become unreadable is repaired and reported. Also sets the brand name and tagline, re-applies a saved look (preset_name), and saves the result as a named look (save_as) for later. For one section's surface or one button, prefer that node's own data (section background, button variant) over the theme. After a colour change it measures the preview, and text that no longer reads on its background (accent text on a primary card, a button's own text colour) is given a theme colour that reads and listed in text_recoloured — tell the owner what changed. That check adds up to ~20s. Returns the preview URL.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Brand name, recorded in the site brief. | |
| colors | No | Any subset of the palette (hex/rgb/css). Colours you leave out keep their current values; text that would become unreadable is repaired and reported. | |
| save_as | No | Save the resulting look under this name so it can be re-applied later with preset_name (an existing name is replaced). | |
| site_id | Yes | ||
| tagline | No | Tagline, recorded in the site brief. | |
| body_family | No | Body font (a supported Google Font, e.g. 'Inter'). | |
| preset_name | No | Re-apply a look saved earlier with save_as (its colours and fonts); colours/fonts passed alongside override it. | |
| heading_family | No | Heading font (a supported Google Font, e.g. 'Fraunces'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the destructiveHint/idempotentHint annotations: edits land in the draft, partial input is merged, contrast is auto-repaired and reported via text_recoloured, the check costs ~20s, and a preview URL is returned. It also warns to tell the owner what changed, which is the kind of consequence info annotations can't convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then side effects, then latency and return value. Dense and largely waste-free, though the contrast-repair explanation is repeated across the opening and the second sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-idempotent, destructive, multi-purpose mutation with no output schema, the description covers the side effects, the auto-repair behavior, the runtime cost, and the return value. Nothing an agent needs before invoking it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 88%, so baseline is 3. The description still adds value by explaining the merge semantics of the colours object ('any subset; what you leave out is kept') and the relationship between preset_name and save_as, which is spread across separate schema fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and scope ('Change the site's colours and fonts in the draft') and immediately names the additional operations it bundles (brand name/tagline, preset re-apply, save_as). It also distinguishes itself from node-level siblings by telling the agent to prefer section/button data for single-element tweaks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear boundary case: 'For one section's surface or one button, prefer that node's own data over the theme.' That is a real alternative-selection rule. However, the brand name/tagline handling overlaps update_site_brief without saying which to prefer, and no explicit 'when not to use' for the whole tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_tracking_codesConnect analytics and ad trackingADestructiveIdempotentInspect
Connect the owner's own Google Analytics 4, Google Tag Manager, Meta Pixel or Plausible to their published site. Takes an ID — or the snippet the owner pasted, from which the ID is extracted — never arbitrary script. Omitted providers are kept; null disconnects one. Live on every public page at once, no publish needed (never on preview links). Use only IDs the owner gave you. Sitelas has its own visitor analytics (get_analytics); this is for owners who want their numbers in those tools, or to measure ads. Where the owner's visitors are in the EU/UK, tell them these tools may need a cookie consent banner.
| Name | Required | Description | Default |
|---|---|---|---|
| site_id | Yes | The site to connect. | |
| plausible | No | Plausible site domain (`example.com`). Pass the ID or the whole snippet the owner pasted — the ID is extracted and checked. `null` disconnects it. | |
| meta_pixel | No | Meta (Facebook) Pixel ID, 10–20 digits. Pass the ID or the whole snippet the owner pasted — the ID is extracted and checked. `null` disconnects it. | |
| google_analytics | No | Google Analytics 4 Measurement ID (`G-XXXXXXXXXX`). Pass the ID or the whole snippet the owner pasted — the ID is extracted and checked. `null` disconnects it. | |
| google_tag_manager | No | Google Tag Manager container ID (`GTM-XXXXXXX`). Pass the ID or the whole snippet the owner pasted — the ID is extracted and checked. `null` disconnects it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is partly covered. The description still adds real behavioral detail beyond them: omitted providers are kept, `null` disconnects one (partial update), changes go live on all public pages with no publish step, and preview links are excluded. It does not explicitly connect "null disconnects" to the destructiveHint flag, so not a full 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but every sentence carries a distinct constraint (accepted input form, partial-update rule, propagation scope, authorization, sibling alternative, compliance note). The core verb+resource leads, and nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter mutation with no output schema, the description anticipates the questions an agent would have: what counts as valid input, how omission/null behave, how fast changes take effect, where they do not apply, and the sibling it is not. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, which sets a baseline of 3. The description nevertheless adds cross-parameter semantics the schema lacks — omitted providers are kept and `null` disconnects — plus the guarantee that only IDs are accepted (snippets are parsed, never arbitrary script). That is meaningful value over the per-parameter schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Connect) and the exact resources (GA4, GTM, Meta Pixel, Plausible to their published site), and explicitly contrasts with the sibling get_analytics. An agent can distinguish this from get_analytics 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative (get_analytics) and the condition that routes to this tool: owners who want their numbers in external tools or to measure ads. Adds an explicit authorization constraint (use only IDs the owner gave you) and a compliance caveat for EU/UK visitors.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
undoUndo last publish or discard draftADestructiveInspect
One-step undo. what: 'last_publish' reverts the most recent publish (restored=false when there is nothing to undo); what: 'draft' discards every unpublished change so the draft matches the live site (reset=false when the site was never published; needs confirm: true, so ask first). Neither touches the other: discarding the draft keeps the publish undo available.
| Name | Required | Description | Default |
|---|---|---|---|
| what | Yes | 'last_publish': undo the most recent publish — the live site (or the one page/item that publish shipped) goes back to what was live before it. 'draft': throw away every saved-but-unpublished change so the draft matches what is live ("scrap those changes"). | |
| confirm | No | Required true for what: 'draft' — it discards unpublished work, so ask the owner first. | |
| site_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive/not-idempotent, and the description still adds real value: exactly what gets destroyed (every unpublished change), the friction of confirmation, and the outcome flags restored=false / reset=false when there is nothing to undo. The closing clause 'neither touches the other' discloses a non-obvious interaction guarantee that 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core definition and then the two modes, each followed by its parenthetical edge case. No filler; every clause carries either an action, a guard, or an edge-case outcome.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-idempotent mutation with no output schema, the description covers what is destroyed, the confirm gate, the nothing-to-undo signals, and cross-mode independence. What is missing is smaller: nothing about site_id scope (whole site vs single page) is stated in text, though the 'what' schema covers that for last_publish.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and already documents both 'what' and 'confirm', so the description is duplicating some of that. It still adds meaning beyond the schema: the result flags ('restored=false when there is nothing to undo', 'reset=false when the site was never published') let the caller interpret the response, which is absent from the input schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
'One-step undo' with the two enum modes spelled out ('last_publish' reverts the most recent publish; 'draft' discards unpublished changes) is a specific verb+resource statement that lets an agent tell the two behaviors apart. The only gap is that it never contrasts itself with the sibling 'unpublish', which also reverses a publish and could be confused with 'last_publish'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete selection conditions for each mode ('reverts the most recent publish' vs 'discards every unpublished change so the draft matches the live site') and an explicit precondition ('needs confirm: true, so ask first'). It stops short of naming alternatives such as unpublish, so it is clear context without explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unpublishTake site or page offlineADestructiveIdempotentInspect
Take the whole site offline (its address 404s for visitors), or with page_slug just one page. Drafts are kept, so it can be published again. This changes what visitors see — only when the owner explicitly asks to take something down, and never to make room for another site's publish.
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | Locale of the page variant. Defaults to 'en'. | |
| site_id | Yes | ||
| page_slug | No | Take ONLY this page offline (e.g. '/about'): its live URL 404s and it leaves the menu, its draft is kept, the rest of the site stays live. Omit to take the WHOLE site offline. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds genuinely new behavioral facts beyond them: visitor-facing 404 on the address, page leaves the menu, the rest of the site stays live, and drafts are retained for republishing. It doesn't discuss permission/auth requirements or how to undo (the undo sibling exists), which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, each earning its place: scope, reversibility, then the guardrail on when to use it. The core scope is front-loaded and nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and annotations carry the safety profile (destructive, idempotent, open-world). The description supplies the visitor-facing effect, reversibility, and the usage guardrail, so an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and the schema's own page_slug description is rich. The description nonetheless adds the key semantic split (page_slug = one page, omit = whole site) in its own words, reinforcing correct invocation. The locale parameter is left entirely to the schema, preventing full credit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource+scope: 'Take the whole site offline... or with page_slug just one page.' An agent can instantly distinguish this from delete_site/delete_page because the description says drafts are kept and it can be published again. No ambiguity about what is being taken offline.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when and when-not: only when the owner explicitly asks to take something down, and 'never to make room for another site's publish.' That exclusion is valuable routing guidance. It stops short of naming the alternative tool (e.g. delete_site vs unpublish) explicitly, so not quite a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_pageUpdate pageADestructiveInspect
Update a page's metadata: rename its slug, change its title, toggle reorder (sort_order), or merge into its metadata. For a page's search title, description, share image or noindex, use update_seo with page_slug. At least one field must be passed. The page tree itself is NOT touched — use insert_nodes / patch_nodes for tree edits. To change the nav, edit the nav-link nodes directly (insert_nodes / patch_nodes / remove_nodes).
Renames: the home page ('/') cannot be renamed (it'd break routing). new_slug must satisfy /^/[a-z0-9/-]*$/, not collide with any existing page, and not shadow a reserved Sitelas route (edit). By default, every node whose data.href / data.url equals the old slug is rewritten to the new slug in the same draft write — so internal links stay valid after the rename. The response reports the count and the rewritten node ids. Pass rewrite_links: false to skip the auto-rewrite (only useful when the caller intends to surgically patch the hrefs themselves). Sub-pages move with the parent by default — pass cascade: false to leave them behind — and every moved URL 308-redirects from its old path once published, so existing links and search results survive. Reach for this whenever a page's slug no longer matches what the page became: adapting a template to a different line of work renames the visible labels but leaves the paths saying the old thing. Writes a new draft version; call publish to push live.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Current slug of the page to update (must exist). Use '/' for the home page. | |
| title | No | ||
| cascade | No | On rename, also move sub-pages — pages whose slug starts with `${slug}/` — onto the new prefix, at any nesting depth (`/work/a/b` under a `/work` → `/studio` rename becomes `/studio/a/b`). Default true, because the page tree IS the slug prefix: moving a parent without its children leaves them under a path that no longer exists. Set false only when you intend to re-home the children yourself. Each moved page gets its own old-URL redirect and inbound-link rewrite. | |
| site_id | Yes | ||
| metadata | No | Merged into the page's stored metadata, key by key; `null` removes a key. For the page's search title, description, share image or noindex use `update_seo` with `page_slug` instead. `renamed_from` (the old URLs that redirect here) is kept by the platform and cannot be set or removed. | |
| new_slug | No | Rename the page to this slug. Must match /^\/[a-z0-9/-]*$/ and not collide with an existing page or reserved route. Internal links pointing at the old slug ARE rewritten automatically (see `rewrite_links`, default true), and sub-pages move with the parent (see `cascade`, default true), all in the same atomic write — so renaming is safe and needs no patch_nodes follow-up. The old URL keeps working: it 308-redirects to the new one once published. The response reports how many links were rewritten and which sub-pages moved. | |
| sort_order | No | Re-order the page in the site's page list and sitemap output. Lower numbers come first; home (`/`) is conventionally 0. This does NOT change the site's menu — nav links are nodes placed in the header. | |
| rewrite_links | No | On rename, automatically rewrite every node's `data.href` / `data.url` that equaled the old slug to the new slug. Default true — keeps internal links working after the rename. Set false to leave inbound hrefs untouched (the response still reports the count, so the caller can rewrite them manually with patch_nodes). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare this destructive, non-idempotent, and openWorld=false, but the description adds substantial context beyond them: it explains the auto-rewrite of internal links (and that the response reports the count/node ids), cascade behavior for sub-pages, 308 redirects on publish, the reserved-route and collision guards, and that it writes a new draft version requiring publish to go live. This is unusually rich behavioral disclosure 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and alternatives before the detailed rename semantics. It is long but nearly every sentence carries actionable constraint or behavioral info; the only cost is density, which slightly favors an agent reading carefully over skimming.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 8 params, a nested metadata object, and no output schema, the description is complete: it covers every meaningful parameter behavior, the rename edge cases, and what the response reports (rewritten link count, moved sub-pages). Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75% and the schema itself describes cascade, rewrite_links, new_slug, sort_order, and metadata thoroughly. The description reinforces these with additional meaning, especially the hard-to-infer constraint that the home page ('/') cannot be renamed and the reserved-route restriction. That extra rule beyond the schema earns a 4 rather than a baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the specific verb (update) and resource (a page's metadata), enumerates the editable fields (slug, title, sort_order, metadata), and draws explicit boundaries against update_seo, insert_nodes/patch_nodes, and nav-link node edits. An agent can distinguish it from all relevant siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use update_seo for search title/description/share image/noindex, insert_nodes/patch_nodes for tree edits, edit nav-link nodes for nav changes. It also names the condition under which this tool is the right choice ('whenever a page's slug no longer matches what the page became') and the precondition (at least one field must be passed).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_seoOptimize for searchADestructiveInspect
Set SEO metadata for a site or a specific page. Per-page mode (with page_slug) writes into the page's metadata.seo and ships as a new draft version — call publish to push live. Site-wide mode (no page_slug) writes into the site's metadata.seo and is live immediately, as defaults under each page's own values (see each field). Supported fields: title, description, og_image_url, robots (index|noindex), language (BCP 47 — a page's own for a translated page), and — site-wide only — business (schema.org type, address, telephone, email, logo, same_as for the home page's structured data; use it when the owner asks to appear as a local business in search) and verification (Google Search Console, Bing, Meta or Pinterest ownership tag). Omitted fields are kept; null removes one. get_site returns the current values, including each page's own.
| Name | Required | Description | Default |
|---|---|---|---|
| seo | Yes | SEO fields to set. Only the provided fields are updated; omitted fields are left untouched. | |
| site_id | Yes | The site UUID to update SEO for. | |
| page_slug | No | Page slug to update (e.g. `/about`), or a collection item's own address (e.g. `/work/kitchen-refit`) for that item's title, description and share image. When omitted, applies the SEO values as site-wide defaults that fall through to pages without their own overrides. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a mutation (destructiveHint=true), and the description adds behavior annotations cannot convey: omitted fields are preserved, `null` deletes a field, per-page writes ship as a draft version while site-wide writes go live immediately, and site-wide values act as fall-through defaults. It also warns to use only owner-supplied facts and never placeholders for `business`.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb and the mode split, and nearly every clause carries operational information (publish step, null semantics, site-wide exclusivity). It is a dense single paragraph, though, and the long parenthetical field enumerations make it harder to scan than a short bulleted structure would.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter tool with deep nested objects and no output schema, the description covers both operating modes, live-vs-draft consequences, field support, deletion semantics, and where to read existing values. An agent has everything needed to call it correctly without further exploration.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description layers on mode-scoping that the flat schema can only state per-field: which fields are site-wide only (business, verification), how `page_slug` accepts collection item addresses, and the merge-vs-null semantics. It adds framing value beyond the per-property descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Set SEO metadata for a site or a specific page') and immediately distinguishes the two modes by their discriminating parameter (`page_slug`). An agent can tell this apart from siblings like `update_page` or `set_tracking_codes` without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes per-page mode to `publish` for go-live versus site-wide mode being live immediately, names `get_site` as the way to read current values, and gives the specific trigger for `business` ('use it when the owner asks to appear as a local business in search'). That is when-to-use and how-to-follow-up, not just context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_site_briefUpdate site briefADestructiveInspect
Set or incrementally update the durable site brief (vibe, category, brand voice, palette/font names, tagline, target audience) used as cross-session memory. Merges field-by-field into the existing brief — omitted fields are preserved, and the decisions[] log is left untouched. Call this once after picking a direction, then again whenever the direction shifts. Pass decision (and why) to append a design decision to the same memory.
| Name | Required | Description | Default |
|---|---|---|---|
| why | No | Why the decision was made (with decision). | |
| brief | No | ||
| site_id | Yes | ||
| decision | No | Append a decision to the site's memory — a non-obvious creative or structural choice the owner may revisit (a palette swap, a copy direction). Keep it to the choice itself; put the reason in why. Max 50 kept, oldest dropped. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Exceeds what annotations convey: merge is field-by-field with omitted fields preserved, decisions[] is left untouched, and the decision log caps at 50 with oldest dropped. That directly answers what a mutation with destructiveHint=true actually overwrites versus preserves, resolving the alarming annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences, each adding distinct information: identity/scope, merge semantics, and timing plus the decision-log path. No filler or restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-idempotent, destructive-flagged mutation with no output schema, the description covers persistence, merge behavior, and the decision log. It doesn't hint at what the call returns or any permission requirements, which is the remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%, but the description compensates by mapping the brief subfields to the domain and by explaining the decision/why split (choice in decision, reason in why). Only site_id and the 500-char limits are left solely to the schema, and those are trivial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (set/incrementally update), a named resource (the durable site brief) and enumerates exactly what the brief holds (vibe, category, brand voice, palette/font names, tagline, audience). This distinguishes it clearly from sibling mutations like set_theme or update_page.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Call this once after picking a direction, then again whenever the direction shifts" gives concrete timing for invocation, and the decision/why sentence gives a second trigger. It stops short of naming alternatives (e.g., set_theme for palette changes), so no explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_data_fileUpload data fileADestructiveInspect
Store a JSON or CSV data file for the site and get a public URL that an embed's script can fetch() — for a browser-side widget that needs a dataset (a product finder, a price table, a store locator). Never paste the data into the embed itself, and never hide it in an image. Sources, exactly one: url (a public link — published Google Sheet, Drive/Dropbox share link, any direct file), content (inline text up to 100,000 characters), or mode:"link" (the owner uploads the file in their browser). Up to 2MB stored. Same name replaces the file at the same URL. A CSV is stored as an array of row objects (as:"csv" keeps it as given). Returns the url, row count, the data's shape and a ready fetch line.
| Name | Required | Description | Default |
|---|---|---|---|
| as | No | What a CSV is stored as. "json" (default): an array of row objects (header row = keys; plain numbers become numbers, leading-zero values like zip codes stay strings), so the widget reads it with fetch(url).then(r => r.json()) and never parses CSV. "csv": the file as given. JSON input is stored as JSON either way. | |
| url | No | A public link to a JSON or CSV file, fetched by Sitelas. Works with a Google Sheet published to the web as CSV, a Google Drive or Dropbox share link set to 'anyone with the link' (rewritten to its direct download), or any direct file URL. Use this for anything big. Give exactly one of url, content or mode. | |
| mode | No | "link": the file is on the owner's computer. Returns a one-time upload page (link_url) to give the owner; the file lands at the returned url once they upload. Give exactly one of url, content or mode. | |
| name | Yes | File name: lowercase letters, digits and hyphens, 1–64 characters, no extension (e.g. 'car-models'). Uploading again under the same name REPLACES the file, and its URL stays the same — so a widget keeps working when the data is updated. | |
| content | No | The file's text, JSON or CSV, written inline — up to 100,000 characters. Bigger data must come through url, or mode:"link" for a file only the owner has. Give exactly one of url, content or mode. | |
| site_id | Yes | The site the data file belongs to. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: the 2MB storage cap, the 100,000-character inline limit, replacement semantics under the same name at a stable URL, CSV normalization into row objects, and even a summary of the return payload (url, row count, shape, fetch line). The replacement/overwrite behavior is consistent with destructiveHint=true, and the stable-URL nuance usefully qualifies the idempotentHint=false annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the key 'never do this' guidance, and nearly every clause carries a distinct constraint. It is a dense single paragraph, however, and the source-selection rules would be more scannable as a short list.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description still covers the return payload, size limits, format conversion, overwrite behavior, and the asynchronous link-mode flow. Nothing material is missing for an agent to select a source and invoke this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema descriptions already carry the mutual-exclusion rule, the CSV `as` modes, the name pattern, and the link-mode flow. The description restates the exactly-one-of rule and the size thresholds but adds no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (store a JSON or CSV data file) plus the concrete outcome (public URL fetchable by an embed's script), and gives example use cases (product finder, price table, store locator). This clearly separates it from upload_image and from add_content_item in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly rules out alternatives ('Never paste the data into the embed itself, and never hide it in an image') and gives a decision rule among the three sources: url for anything big, content up to 100,000 characters, mode:"link" for a file only the owner has.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_imageUpload an imageADestructiveInspect
Store an image on Sitelas's CDN (resized, WebP, blur placeholder) and return its URL — from url (the normal case), or base64 for a small image you made yourself. Pass image_target to also put it on its spot in the same call; without it, place the URL with patch_nodes or edit_content_item. Local agents with the file on disk use mode: 'link', PUT the bytes, then call again with staging_path. When the PERSON has the photo on their device, this is the wrong tool at any size: call get_editor_link with image_target and give them the one-time photo link.
| Name | Required | Description | Default |
|---|---|---|---|
| alt | No | What the image shows, for screen readers. Required for url, base64 and staging_path. | |
| url | No | Public URL of an image (jpeg/png/webp/gif/svg, under 10MB). The usual source: a photo link the owner pasted, a logo on their old site. | |
| mode | No | Local agents only (Claude Code, Cursor): get a one-hour URL you PUT image bytes from your own disk to, then call upload_image again with staging_path. Not available in hosted chats. | |
| base64 | No | Raw base64 bytes (no data: prefix) of an image YOU authored — an SVG you wrote, a small generated mark — under ~30KB. Bigger payloads get cut off in transit. Never for the owner's own photo: that goes through get_editor_link with image_target (a one-time photo link). | |
| site_id | Yes | ||
| filename | No | With mode: 'link': the original filename, optional. | |
| mime_type | No | With base64: a fallback only; the bytes are sniffed. | |
| image_target | No | Also place the image, in the draft: { node_id } for an image or a section's background photo (ids from get_page view 'content'), or { content_type, item_slug, field } for a collection item's photo. Omit to just get the URL back. | |
| staging_path | No | After mode: 'link' and your PUT: the staging_path it returned. Processes and stores the image. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint, openWorldHint, and non-idempotency, so the safety bar is lower. The description adds real behavioral detail beyond that: image processing pipeline, the one-hour PUT URL staging flow for local agents, the ~30KB base64 cutoff, and the 10MB URL source limit. It does not state that placing via image_target may overwrite an existing image, which would be the key remaining gap given destructiveHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and return value, then flows into source selection, placement, and the local-agent flow. It is dense with parentheticals and em-dashes, but nearly every clause carries actionable routing information rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter, nested-object mutation tool with no output schema, the description covers the return value (a URL), both source paths, the staging-workflow sequencing, and the explicit exclusion case. An agent can choose and invoke it correctly without further reading.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 89%, so the schema already documents most parameters; the description still adds decision-level semantics, e.g. url is the 'usual source', base64 is for images you authored and is capped in size, and mode 'link' is a multi-call staging flow. The image_target placement tradeoff and the patch_nodes fallback are explained rather than repeated.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a precise verb+resource and scope: stores an image on Sitelas's CDN with specific processing (resize, WebP, blur placeholder) and returns a URL. It explicitly distinguishes itself from siblings by naming the alternative (get_editor_link) for the case where the person has the photo on their device.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing rules: use url in the normal case, base64 for small self-authored images, pass image_target to place in the same call, otherwise use patch_nodes or edit_content_item. It also names the wrong-tool case ('when the PERSON has the photo on their device, this is the wrong tool at any size') and redirects to get_editor_link with image_target.
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.
92 tool updates
- First observed
add_content_item - First observed
add_page - First observed
add_section - First observed
apply_brand - First observed
apply_palette - First observed
cancel_scheduled_job - First observed
capture_url - First observed
create_collection - First observed
create_image_upload_link - First observed
create_site_from_fixture - First observed
create_site_from_template - First observed
critique_design - First observed
delete_collection - First observed
delete_content_item - First observed
delete_custom_domain - First observed
delete_page - First observed
delete_site - First observed
draft_reply_to_submission - First observed
duplicate_page - First observed
edit_content_item - First observed
explain_design - First observed
finalize_image_upload - First observed
find_images - First observed
generate_sitemap - First observed
get_analytics - First observed
get_collection_tokens - First observed
get_contact - First observed
get_editor_link - First observed
get_example_fixtures - First observed
get_preview - First observed
get_primitive_schema - First observed
get_site - First observed
get_site_brief - First observed
get_site_changes_since - First observed
get_site_manifest - First observed
get_site_overview - First observed
get_site_tree - First observed
get_version_diff - First observed
insert_nodes - First observed
insert_tree - First observed
list_card_designs - First observed
list_contact_activity - First observed
list_contacts - First observed
list_content_items - First observed
list_content_types - First observed
list_custom_domains - First observed
list_primitives - First observed
list_scheduled_jobs - First observed
list_section_archetypes - First observed
list_site_copy - First observed
list_site_images - First observed
list_site_templates - First observed
list_site_versions - First observed
list_sites - First observed
list_submissions - First observed
move_nodes - First observed
patch_fixture - First observed
patch_nodes - First observed
preview_collection_item - First observed
publish_content_item - First observed
publish_page - First observed
publish_site - First observed
read_rendered_page - First observed
read_submission - First observed
record_decision - First observed
remove_nodes - First observed
replace_images_from_search - First observed
reset_draft - First observed
revert_site - First observed
save_theme_preset - First observed
schedule_content_publish - First observed
schedule_publish - First observed
screenshot_page - First observed
select_template_for_brief - First observed
set_card_design - First observed
set_custom_domain - First observed
set_tracking_codes - First observed
site_health_check - First observed
suggest_next_step - First observed
summarize_recent_activity - First observed
top_pages - First observed
unpublish_page - First observed
unpublish_site - First observed
update_page - First observed
update_seo - First observed
update_site_brief - First observed
update_site_from_fixture - First observed
upload_image_from_data - First observed
upload_image_from_url - First observed
validate_fixture - First observed
verify_custom_domain - First observed
verify_site
Publisher details
- Operator
- Sitelas · Publisher source
- Operator website
- https://sitelas.com
- Vendor relationship
- First-party
- Documentation
- https://sitelas.com/docs/agents
- Trust center
- https://sitelas.com/docs/trust
- Restrictions
- Requires a free Sitelas account (OAuth sign-in). Free plan: 1 live site and 10 drafts per account; custom domains and higher caps need Pro. · Publisher source
Related MCP Connectors
- LanlanOAuthsite.lanlan
Build a hosted website by chatting. Snapshots, forms, analytics. Hand off the dashboard. Walk away.
Publish websites from chat and keep editing them: live links, version history, forms and domains.
Publish and edit static websites on a free subdomain, just by chatting.
- WebTwizzOAuthcom.webtwizz
Build websites and web apps with AI, see them in the chat, and publish them.
Related MCP Servers
AlicenseNot gradedqualityBmaintenanceEnables users to build, publish, share, and manage websites, dashboards, reports, and small web tools through chat, including updating content and design, managing access and custom domains, and restoring deployments.7MIT- AlicenseNot gradedqualityDmaintenancePublish the website you built with AI to a live public URL — straight from chat, no setup. Enables deploying static sites and updating them with edit tokens.1MIT

SiteCTRLofficial
AlicenseNot gradedqualityCmaintenancesitectrl turns a plain-language description into a real, hosted, live website — not a mockup. Your AI can ask sitectrl's builder to do it (create_site), or write the code itself and push the files (write_site_files + publish_site). Every site ships with hosting, SSL, working contact forms, and private built-in analytics; domains and email connect in-product.MIT- AlicenseAqualityCmaintenanceEnables building and iterating on a software company through natural language, returning live preview URLs, without needing a browser.414 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.