WebCake Landing MCP
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@WebCake Landing MCPBuild a landing page for my coffee shop with hero, features, and lead form"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
WebCake Landing MCP
English · Tiếng Việt
Describe a landing page in plain words — your AI builds it, checks it, and ships it straight to WebCake.
⭐ If this saves you an afternoon of dragging boxes, give it a star — it's a one-dev project and every star keeps it alive.
"Build a landing page for my coffee shop — a hero with a sign-up button, a 3-feature section, and a lead form. Save it to my workspace."
…and a real, editable WebCake page appears in your account. No dragging boxes, no learning the schema, no hand-writing JSON.
🧩 How it works
This server is the bridge between your AI assistant and WebCake. The AI never guesses what a WebCake page looks like — it asks this MCP, which knows the entire element model, validates the result, and saves it for you.
You AI assistant webcake-landing MCP WebCake
┌──────┐ prompt ┌────────────┐ tools ┌──────────────────────┐ API ┌──────────┐
│ idea │ ───────► │ Claude / │ ──────► │ • knows the element │ ────► │ a real │
│ │ │ Cursor / │ │ model + AI hints │ │ editable │
│ │ ◄─────── │ Windsurf │ ◄────── │ • builds + validates │ ◄──── │ page in │
└──────┘ page URL └────────────┘ result │ • saves to your acct │ │ WebCake │
└──────────────────────┘ └──────────┘You ask in plain language — goal, brand, sections, CTA, form fields.
The AI learns the model from the MCP: the element catalog, the absolute-positioning canvas, the event vocabulary — so it builds a real WebCake page, not a guess.
It assembles + validates the full
{ page, popup, settings, options }JSON.validate_pagecatches off-canvas boxes, dangling CTAs, and missing form fields before anything is saved.It persists to your WebCake account — dry-run preview first, then for real.
You get an editor link — open it, tweak, publish. The AI did the heavy lifting.
Why it's reliable
📚 Knows the real model | Serves WebCake's actual element catalog (40+ types — hero, form, countdown, gallery, product list…), each with its exact |
✅ Validates before saving | Structural + semantic checks (unique ids, on-canvas layout, working CTAs, unique form fields) so the page isn't broken when it lands. |
🛡️ Safe by default | Every write is dry-run first (preview the request, token masked) — nothing touches your account until you confirm. |
✏️ Edits surgically | Ask for one change ("make the CTA green") and it edits only that element — every other id, coordinate, and block stays exactly as it was. |
💡 Lead-gen, events, invitations, app promos — or selling COD/online? It speaks WebCake's commerce model too (product lists, variations, cart).
Related MCP server: webappmcp
✨ What you can build
One sentence to your AI → a finished, editable WebCake page. A taste of what people ship with it:
Just say… | |
🧲 Lead-gen landing | "A SaaS waitlist page — hero, 3 benefits, an email-capture form." |
🛒 COD / online store | "A one-product page for my skincare serum — gallery, price, variations, an order form with cart." |
🎟️ Event / webinar | "A registration page for Saturday's webinar — countdown, agenda, sign-up form." |
💌 Invitation | "A wedding invite — names, date, a map, an RSVP form." |
📱 App promo | "A page for my fitness app — phone mockups, feature list, App Store + Google Play buttons." |
⚡ Flash sale | "A flash-sale page — big countdown, discounted product grid, a sticky Buy button." |
🔗 Link-in-bio | "A link-in-bio for my creator profile — avatar, short bio, 5 link buttons, socials." |
🎉 Product launch | "A launch page for v2 — hero, what's-new list, an early-access form." |
…then "make the CTA green" or "add a 4th feature" and it edits only that block — every other id and coordinate stays exactly where it was.
🤖 Works in Claude Desktop, Claude Code, Cursor, Windsurf, Augment, Codex, Antigravity, Gemini CLI, Cline, Kiro, OpenCode, or any MCP-capable client — and the reference + generation tools need zero setup, so you can try it before ever pasting a token.
Under the hood
MCP (Model Context Protocol) server that teaches AI agents how to build a complete WebCake landing-page source JSON from a requirement — and persist it to a WebCake backend.
It exposes the element catalog, per-element usage hints + specials, the full page JSON Schema,
valid element/page skeletons, a page validator, and tools to create or edit pages on the backend.
The AI agent produces the full { page, popup, settings, options, cartConfigs } JSON; create_page
persists it and auto-publishes (build + publish_html) so the preview renders immediately (the edit
tools save source-only — re-publish via publish_page after edits).
Method | Best for | Auth |
npx (local) — runs on your machine | Personal daily use, full control | browser |
Hosted URL — use our live server, nothing to install | No Node.js, teams, the claude.ai dialog | your personal |
The reference + generation tools (get_generation_guide, list_elements, validate_page, …) and the ingest tools (ingest_html, ingest_url — turn an existing HTML or URL into a layout anchor so the AI can recreate or adapt it) work with zero config; only the persistence tools (create_page, update_page, add_section, patch_page, publish_page, list_pages, find_pages, get_page, list_organizations) need a token. Credentials resolve in order: per-request header → env var → saved auth.json (login).
🚀 Get connected — the 2 main ways
Pick one. Both hand your AI tool (Claude, Cursor, …) the full Webcake landing toolkit. No coding.
① npx — runs on your machine (recommended for personal use)
Zero install, always the latest version, needs Node.js 18+. One line grabs your token and writes the IDE config:
# Interactive — pick environment, log in via browser (or paste a JWT), pick IDE(s)
npx -y webcake-landing-mcp install
# Non-interactive — configure every supported IDE at once (env + token via flags)
npx -y webcake-landing-mcp install --ide all --env prod --jwt <your-jwt>
# Remove the server from every IDE config
npx -y webcake-landing-mcp uninstallIt writes a webcake-landing entry into the right config file for each target: claude-desktop,
claude-code, cursor, windsurf, augment (VS Code), codex, antigravity, gemini (Gemini CLI),
cline, kiro, opencode, or all. Flags: --ide, --env, --jwt, --org-id,
--api-base/--app-base, --npx/--local, -y — see install --help.
Just want to run the server (configure by hand later)? npx -y webcake-landing-mcp
🛠️ Hand-written per-IDE config, shell-script installers (
install.sh/install.ps1), or a cloned local build → docs/manual-install.md.
② Remote URL …/mcp?jwt= — hosted, nothing to install
The server is already live at https://mcp.toolvn.io.vn/mcp — no Node.js, no machine to keep awake.
Grab your personal link (your token is baked in) and paste it into your client's Add custom connector / config:
https://mcp.toolvn.io.vn/mcp?jwt=<YOUR_TOKEN>Two ways to get the link:
Easiest — open https://webcake.io/mcp-remote in your Webcake dashboard → it builds & copies the link for you.
By hand — see the step-by-step guide: docs/connect-mcp.md.
Optional extras: &env=prod, &org_id=…, &api_base=…. Hand each teammate a link with their own jwt →
per-user, no OAuth. Clients that support headers should send the token as x-webcake-jwt instead of
putting it in the URL — the full header ↔ env mapping is in docs/configuration.md.
✅ Best for: no Node.js, team/shared use, the claude.ai connector dialog (URL-only, no headers). ⚠️ The link contains your personal token — treat it like a password, always use HTTPS.
⚙️ Configuration
The quick version — only the persistence tools need any of this:
npx -y webcake-landing-mcp login # opens the browser once, saves the token to ~/.webcake-landing-mcp/auth.json…or set WEBCAKE_ENV (local | staging | prod — fills in all base URLs) + WEBCAKE_JWT.
For publish_page to actually put a page live, a build host is needed (it renders the
app/app_css that the live publish_html route requires):
prodpreset auto-configureshttps://build.webcake.io— no extra setup (the preset applies when the env resolves toprod:WEBCAKE_ENV=prod,--env prod, orx-webcake-env: prod).For staging/local, set
WEBCAKE_BUILD_BASE=<url>or send thex-webcake-build-baseheader per request.Without it,
publish_pagefalls back to a legacy source-only save withrendered:false, live:false+ a warning — nothing goes live.A page is only permanently live with a
custom_domain; without one the returned/preview/<page_id>link expires ~10 minutes after the publish.
Everything else — the full env-var table, environment presets, per-request headers for the hosted
server, the login browser flow (+ backend contract), and how to grab a JWT by hand — lives in
docs/configuration.md.
📚 Docs
Guide | What's inside |
Step-by-step connection for every client (npx & hosted URL), troubleshooting table. | |
Env vars, | |
All 23 tools in detail + the step-by-step workflow + model notes. | |
Three end-to-end walkthroughs: build from a brief, surgical edit, inspect a type. | |
Shell installers, cloned builds, hand-written per-IDE config. | |
The full element-model reference (+ every special/event). |
🧰 The tools at a glance
23 tools in five groups — full descriptions in docs/tools.md:
Group | Tools | Needs |
Reference |
| nothing |
Generation |
| nothing |
Media |
| nothing |
Ingest |
| nothing |
Persistence |
|
|
Every write defaults to dry_run=true — it previews the exact request (token masked) and only
touches your account when you re-run with dry_run=false.
Suggested prompt
Build me a WebCake landing page for <brand/offer>. Use the webcake-landing MCP: call
get_generation_guide,new_page_skeleton, thenget_elementfor each element type you use, assemble the{ page, popup, settings, options }JSON,validate_pageuntil zero errors, thencreate_page(dry-run first).
⭐ Like the idea? Drop a star
This is a solo, open-source project — every ⭐ genuinely keeps it moving and helps other builders discover it.
⭐ Star the repo — 2 seconds, huge motivation.
🐛 Open an issue — a bug, a missing element type, or just an idea.
🔁 Share it with anyone still building landing pages box by box.
Built with ❤️ for the WebCake community. Thanks for being here.
Available Tools
23 toolsadd_sectionAInspect
Appends one or more section nodes to the end of an existing page's page array, server-side: only the new sections are sent, and the backend rejects element ids that already exist on the page. The sections are validated first. dry_run defaults to true: it validates, caches the payload under a draft_id and previews the request; dry_run:false appends. A validation failure also returns a draft_id, which patch_page accepts for element-level fixes. Section-level saves cannot change page settings, so font weights that need new font links are reported in font_weights_notice. Requires Webcake credentials.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Default TRUE — validate the section(s) and preview the request without writing. Set false to actually append. | |
| page_id | Yes | The page id to append to (from create_page or list_pages; must be owned by the account). | |
| draft_id | No | A draft id returned by a previous add_section call (dry_run=true or validation failure). Loads the cached section payload, so the sections are not re-sent. | |
| sections | No | One section node, or an array of section nodes, appended to the end of `page` (object/array or JSON string). Each is a normal section element { id, type:'section', responsive, children, … } with a unique id; sections stack vertically after the existing ones. Nodes may be sparse — omitted properties/runtime/empty events and children/per-breakpoint config are filled from factory defaults. Required unless draft_id is supplied. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: the backend rejects duplicate element ids, sections are validated first, dry_run defaults to true and caches under a draft_id, validation failures still return a draft_id, font weights needing new links surface in font_weights_notice, and Webcake credentials are required. This is exactly the operational context an agent needs for a mutating 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-loads the append operation and the dry_run default before secondary details, and every sentence carries information. It is dense and slightly long, but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description covers the key return signals (draft_id on validation failure, font_weights_notice) plus credential requirements. It does not fully describe the shape of the dry_run preview response, a minor gap for a server-side mutation.
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 cross-cutting meaning: dry_run's default and dual behavior, draft_id's cache-loading purpose, its acceptance by patch_page, and the sparse-node filling from factory defaults. It largely echoes the schema for the core fields, keeping it out of the top band.
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 — appending section nodes to an existing page's `page` array — and clarifies it is server-side with only new sections sent. It also names patch_page as the sibling for element-level fixes, so an agent can distinguish it from other write 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?
Explains when the tool applies (appending to an existing page) and routes element-level fixes to patch_page, plus documents the dry_run-first workflow. It stops short of an explicit when-not-to-use statement versus siblings like create_page or update_page.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_pageAInspect
Creates a new page in the user's Webcake account from a page source { page, popup, settings, options, cartConfigs }, saves it, and then publishes it (builds the rendered app on the Webcake build host and publishes it through the editor's publish route) so its preview renders; publish:false skips publishing, and a failed publish does not fail the create (result.publish reports the outcome). Before validating it applies deterministic layout corrections (off-canvas boxes, elements below wrapped text, containers grown to fit) and lists them in auto_fixed. External images and self-hosted font files in the source are re-hosted on Webcake's CDN during the save. dry_run defaults to true: it validates, caches the source under a draft_id, and returns the request it would send with the token masked; dry_run:false performs the create. A draft_id (from a validation failure, dry run, or timed-out create) re-runs from the cached source. Organization: explicit organization_id ('personal' = no organization), then WEBCAKE_ORG_ID / x-webcake-org-id, then automatic — no organizations → personal, exactly one → selected (organization_auto_selected:true), two or more → ok:false with the organization list. A page without a custom domain has a preview link that renders for about 10 minutes after each publish. Requires Webcake credentials.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Page name (default 'AI Page'). | |
| source | No | Page source { page, popup, settings, options, cartConfigs } (object or JSON string). Required unless draft_id is given. Elements may be sparse — id, type, responsive.<bp>.styles for both breakpoints, specials and real events; omitted properties/runtime/empty events and children/per-breakpoint config are filled from factory defaults (full nodes also work). | |
| dry_run | No | Default TRUE — validate, cache the source as draft_id, and preview the request without sending. Set false to actually create. | |
| publish | No | Default TRUE — after a successful create, automatically build the rendered app and publish (publish_html) so the preview renders immediately. Set false to create source-only (blank preview until publish_page runs). | |
| draft_id | No | A draft_id from a previous create_page call (validation failure, dry_run=true, or a timed-out/failed create). Loads the cached source, so the full JSON is not re-sent; covers the dry-run → real call step, fixes after errors, and retries after a timeout. | |
| organization_id | No | Organization to create the page in (an organization id). The string 'personal' saves without any organization and skips auto-resolution. When omitted: WEBCAKE_ORG_ID / x-webcake-org-id, else automatic — one organization is selected, two or more return the list (ok:false), none means personal. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses the automatic deterministic layout corrections and auto_fixed list, CDN re-hosting of external images/fonts, dry_run default true and caching under draft_id, that a failed publish does not fail the create and result.publish reports outcome, the 10-minute preview link lifetime, and credential/organization resolution order. Annotations only cover readOnly/destructive/openWorld, so this adds substantial 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?
Front-loaded with the core action, but the single long block buries several operationally critical facts (dry_run default, draft_id semantics, organization resolution) in a dense paragraph rather than structuring them. Most sentences earn their place, but the wall of text and lack of paragraphing hurt scanability.
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 6-param, zero-required, no-output-schema creation tool, the description covers the full operation: validation, layout fixes, save, publish behavior and failure mode, dry-run contract, draft reuse, organization resolution, and credential requirement. An agent has everything needed to invoke it correctly without opening the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so baseline is 3; the description adds real semantics over the schema for several params (dry_run default and caching behavior, publish consequence, draft_id retry coverage, organization_id resolution chain with the 'personal' sentinel). It doesn't add format/syntax detail for the sparse 'source' schema beyond what's documented, keeping it from 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+resource ('Creates a new page in the user's Webcake account') and delineates the full lifecycle: validation, layout correction, save, publish. Distinguishable from siblings like new_page_skeleton (no save/publish) and update_page (modification not creation), though it never explicitly names them.
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?
Clear usage context is embedded: dry_run defaults to true for validation, draft_id covers the retry/fix/after-timeout steps, publish:false gives source-only. The 'covers the dry-run → real call step, fixes after errors, and retries after a timeout' line is explicit routing guidance. No explicit exclusions vs siblings, so not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_pagesARead-onlyInspect
Searches the account's pages by name, domain and/or page id. Filters are AND-combined; name and domain are case-insensitive substrings, and domain matches custom_domain or default_domain. Each result includes id, name, organization_id, custom_domain, default_domain and updated_at. With no filters it returns the most recently updated pages. Requires Webcake credentials.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Case-insensitive substring of the page name to match. | |
| limit | No | Max results (default 50, capped at 100). | |
| domain | No | Case-insensitive substring of the page's domain (matches custom_domain OR default_domain). | |
| page_id | No | Exact page id — narrows to that single page (useful to confirm it exists/owned). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint, so the description carries the extra load and does so well: it discloses AND-combination semantics, case-insensitive substring matching, the custom_domain-or-default_domain matching rule, the no-filter default ordering, the credential requirement, and the result field set. That is rich behavioral 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?
Three dense sentences with no filler. The search scope is front-loaded, followed by matching semantics, default behavior, result fields, and prerequisites in a logical order.
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 compensates by listing the returned fields (id, name, organization_id, custom_domain, default_domain, updated_at). Combined with the auth requirement and matching semantics, an agent has everything needed to call and interpret this 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 100%, so the per-parameter details already exist and baseline is 3. The description goes a step further by explaining the interaction between parameters (AND-combined) and clarifying that domain matches either custom_domain or default_domain — relationship semantics the schema cannot express on its own.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Searches the account's pages') and enumerates what can be searched on (name, domain, page id), which clearly separates it from get_page or list_elements. It stops short of explicitly naming a sibling such as list_pages or get_page, so the differentiation is inferable rather than stated.
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 call conditions: filters are AND-combined, and with no filters it returns the most recently updated pages. It also hints page_id is useful to confirm a page exists/is owned. No explicit exclusions or named alternatives are offered, but the context needed to pick this tool is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_elementARead-onlyInspect
Returns usage details for one element type, or for several via types: [...]: a summary, when it applies, key specials fields, a sparse skeleton node (the server fills omitted boilerplate), and for common types a filled example. types returns { elements: { [type]: details } }; type returns a single doc.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Single element type. | |
| types | No | Several element types fetched in one call, e.g. ['section','text-block','button','form','input']. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered; the description goes further by disclosing the return contract — a summary, key `specials` fields, a sparse skeleton node whose boilerplate the server fills, and a filled example for common types. With no output schema, that disclosed behavior is valuable, though some terms (`specials`, "skeleton node") stay undefined.
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 is front-loaded in the opening clause and the remaining clauses each carry distinct information (what is returned, and the two return shapes). It is a single dense sentence with domain jargon but no filler or repetition, so nothing is wasted even if it reads densely.
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 no required parameters, the description carries the load of describing return values, and it does so for both call shapes. Remaining gaps are minor — the meaning of `specials`, error behavior, and how the skeleton is intended to be reused are not clarified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: it states that `types` returns { elements: { [type]: details } } while `type` returns a single doc, which is not expressed anywhere in the input schema. It also clarifies the mutual purpose of the two params (one type vs several in one call).
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 names a specific verb and resource ("Returns usage details for one element type") and even enumerates what those details contain (summary, specials, skeleton, example). It implicitly separates itself from list_elements by being a per-type detail lookup, but never names that sibling or any other, so differentiation is left to inference rather than stated.
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 when to use the `types` array versus the single `type` string (several types in one call vs one type), which is genuine usage guidance. However, it offers no guidance on when to reach for this tool at all compared to siblings like list_elements or get_page_schema, so a tool-selection context is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_generation_guideARead-onlyInspect
Returns the page-building conventions reference: output shape, the absolute-positioning coordinate system, event vocabulary, and the recommended workflow.
| 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, so the description adds little behavioral context beyond the content list. It doesn't disclose any side effects or permissions, but the read-only nature is clear.
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 a single, well-structured sentence that front-loads the purpose and lists the specific topics. No wasted words.
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 zero-parameter reference tool with no output schema, the description adequately covers what the tool provides. It lists the key conventions, making it complete for its purpose.
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 has zero parameters and 100% schema description coverage. The description does not need to add parameter information. Baseline 4 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?
The description explicitly states what the tool returns: 'page-building conventions reference' with detailed contents (output shape, coordinate system, event vocabulary, workflow). This clearly distinguishes it from sibling tools like get_page_schema or list_pages.
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?
The description implies the tool should be used when conventions are needed but does not explicitly state when or when not to use it. No alternatives or exclusions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_icon_svgARead-onlyInspect
Resolves icon-font names into inline SVG markup via the public Iconify API (https://iconify.design/docs/api/). Accepts Material Symbols refs ("ms:verified"), Font Awesome refs ("fa:chart-line"), Iconify ids ("mdi:home"), or bare names (treated as Material Symbols); underscores become hyphens, and Material Symbols resolve to the outlined variant with a filled fallback. These are the same ms: / fa: refs that ingest results report in block.icon. Returns { icons: { "": { ok, svg, iconify } } }. In Webcake an icon renders as an SVG mask on a rectangle element: the SVG goes in responsive.desktop.config.svgMask and responsive.mobile.config.svgMask (each breakpoint is read separately), the visible color comes from styles.background (the SVG's own fill is ignored), and the mask is stretched to the box (preserveAspectRatio='none'), so a square box keeps its proportions. No Webcake credentials needed.
| Name | Required | Description | Default |
|---|---|---|---|
| icons | Yes | Icon references to resolve (1–40), e.g. ["ms:verified", "ms:support_agent", "fa:chart-line"] — typically the block.icon values from an ingest result. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, but the description adds substantial extra context: it is a public API needing no credentials, it normalizes underscores to hyphens, it resolves Material Symbols to the outlined variant with a filled fallback, and it fully describes how the SVG must be plumbed into Webcake (svgMask per breakpoint, color from styles.background, preserveAspectRatio='none'). That is real behavioral disclosure beyond the structured 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?
Front-loaded with the core action and API reference, then progressive detail on formats, resolution rules, return shape, and Webcake rendering. Every clause carries information, though the Webcake rendering passage is dense enough that the paragraph runs long.
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 single-parameter tool with no output schema, the description compensates by documenting the return shape ({ icons: { '<ref>': { ok, svg, iconify } } }) and the downstream rendering contract. An agent has everything needed to call it and consume the result 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 the baseline is 3, but the description goes further by defining the transformation semantics of each ref string — prefix handling, underscore-to-hyphen conversion, and bare-name treatment as Material Symbols. It adds meaning the schema example alone does not convey.
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 (resolves) and resource (icon-font names into inline SVG markup) and names the concrete backing service (public Iconify API). It is unmistakable against siblings like search_images or render_preview because it operates on icon refs, not images or pages.
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?
Explains the accepted ref formats ('ms:verified', 'fa:chart-line', 'mdi:home', bare names) and ties them to where the agent will encounter them (block.icon values from an ingest result), which is clear contextual guidance. It stops short of explicitly stating when-not to use it or naming a fallback alternative, so it lands just under full marks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pageARead-onlyInspect
Fetches an existing page's source tree { page, popup, settings, options, cartConfigs } with its name, organization_id and source_version. By default the tree is compacted: boilerplate shared by every element (properties, runtime, empty events/children, per-breakpoint config and factory-default style keys) is stripped, giving the same sparse shape the save tools accept and re-hydrate. compact:false returns the raw stored tree. Requires Webcake credentials.
| Name | Required | Description | Default |
|---|---|---|---|
| compact | No | Default TRUE — strip factory-default boilerplate from every element (sparse shape, far fewer tokens). false returns the raw stored tree. | |
| page_id | Yes | The page id (from list_pages or a URL). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, and the description goes well beyond them: it discloses the default compaction behavior, exactly what boilerplate is stripped, how to opt out (compact:false), and that Webcake credentials are required. It stops short of describing failure behavior for missing pages or size limits, but the added context is substantial for a read tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the verb and resource, then the return shape, then the compaction default, then the auth prerequisite. Three dense sentences with no filler; the compaction clause is slightly long but each clause carries distinct 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?
There is no output schema, so the description must carry the return shape — and it does, naming the tree sections plus name, organization_id, and source_version, and explaining the default sparse form. Combined with annotations covering the read-only safety profile, an agent has enough to call this correctly; only edge-case/error behavior is 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 100%, so the baseline is 3, and the description earns more by explaining the semantic purpose of compact:true — the output is not just smaller but is the re-hydratable shape accepted by the save tools, which the schema text does not convey. page_id is left to the schema, which 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 and resource ('Fetches an existing page's source tree') and enumerates the top-level sections returned (page, popup, settings, options, cartConfigs). This is clearly distinguishable from siblings like get_page_schema, list_pages, and get_element 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?
Usage context is only implied: the note that the compacted tree matches 'the same sparse shape the save tools accept and re-hydrate' hints this is the read half of an edit round-trip. It never names an alternative tool or states when to prefer list_pages/find_pages/get_page_schema instead, so no explicit routing guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_page_schemaARead-onlyInspect
Returns the full JSON Schema (Draft 2020-12) of a Webcake page source object { page: [...], settings: {...} } for structural reference and validation.
| 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, so the description's statement of returning full JSON Schema aligns and adds detail (Draft 2020-12, structure). No hidden behaviors or contradictions.
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?
Single sentence, front-loaded with verb and object, no wasted words. Perfectly concise for the tool's simplicity.
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 zero-parameter read-only tool, the description fully covers what it does and what it returns. No output schema exists but the description specifies the return structure sufficiently.
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?
No parameters (schema coverage 100% with empty schema). Baseline is 4 as per rule. Description adds no param info because none are needed.
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 specific verb 'Returns' and resource 'full JSON Schema of a Webcake page source object' with clear purpose 'for structural reference and validation'. It distinguishes from siblings like validate_page or get_page by stating it returns the schema 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?
The description clearly implies when to use (when needing schema for reference/validation) but does not explicitly mention when not to use or name alternatives. However, the context of sibling tools and the tool's name make the use case unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ingest_htmlARead-onlyInspect
Parses an HTML string into a reference AST for rebuilding the page in Webcake: title, description, og_image, language, and sections classified by role (header, hero, features, about, form, cta, gallery, testimonials, pricing, faq, footer, unknown), each with headings, paragraphs, images, CTAs, links, form fields and a size_hint (desktop section height in px — from CSS when explicit, else estimated). Also returns top colors, fonts, palette and background_images; for Tailwind-CDN pages (e.g. Google Stitch) the palette and design_tokens (spacing grid, corner radii, type scale) come from the page's tailwind.config. detail:'compact' (default, ~2–5 KB) or 'full' (up to ~25 KB: per-section blocks such as cards and steps, lists, gradients, images as { src, alt }, and widgets — the cleaned HTML + CSS of composite visuals such as device mockups). Fonts: font_groups lists self-hosted fonts from @font-face rules in the settings.fontGroups shape; typography and per-section text_styles give the computed font size (desktop and mobile), weight, family, line height and letter spacing. Absolute-canvas builder exports (LadiPage-family or Webcake-published HTML) are detected and converted deterministically into a complete Webcake page source, with clone_notes listing approximations and canvas_summary summarizing per-section geometry; external images in that source are re-hosted automatically when it is saved. Garbled Vietnamese text (UTF-8 read as Latin-1) is repaired, with a warning. No credentials, no writes.
| Name | Required | Description | Default |
|---|---|---|---|
| html | Yes | Raw HTML of a page or a section. | |
| detail | No | Level of detail in the returned AST. 'compact' (default, ~2–5 KB): sections, top colors and fonts. 'full': adds the CSS custom-property palette (design tokens by name), background_images from stylesheets, gradients, per-section blocks (repeating card/tile/step structures with title/body/image/cta), li lists, extended paragraphs, images as { src, alt }, and per-section widgets = { hint, html, css? } — the cleaned source HTML + matching CSS of composite visuals (device mockup, chat thread, dashboard, browser frame). Both levels lift the design system from a `tailwind.config` block when present (Google Stitch / Tailwind-CDN pages): `palette` named by token (e.g. primary → #a43b38), `colors` ranked by usage, and `design_tokens` with the resolved spacing grid, corner radii and type scale (e.g. display-lg → 48px). Image URLs in the result (images, background_images, og_image) belong to the source page. Absolute-canvas builder exports return the deterministic `source` at either level. | |
| intent | No | How the result will be used. 'adapt' (default): the reference provides layout and imagery while the text is rewritten for the user's brand. 'clone': text and images stay close to the original. Absolute-canvas exports return a clone `source` either way. | |
| base_url | No | The page's original URL, when the HTML was saved or copied from a live site. Resolves relative font and image URLs and fetches the page's external stylesheets (+ @imports), so self-hosted fonts (`font_groups`) and computed type (`typography` / `text_styles`) defined outside the HTML are included. | |
| sections | No | Absolute-canvas mode only: return only these canvas section ids (from a previous result's canvas_summary.sections[].id; 'SECTION_POPUP' selects the popups). A full-page result marked canvas_summary.truncated:true has its styles pruned to fit the size cap; per-section results carry each section's `source` untrimmed, and `source.page[0]` is a single section node. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover readOnlyHint and openWorldHint; the description goes far beyond them, disclosing the size caps (2–5 KB vs 25 KB), deterministic canvas conversion, clone_notes/canvas_summary, automatic image re-hosting on save, garbled-Vietnamese repair with a warning, and the explicit 'No credentials, no writes' safety statement.
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 is front-loaded, but the body is a single dense ~300-word block that re-explains much of what the parameter descriptions already state. For a genuinely complex tool some of this earns its place, yet the redundancy and lack of paragraph structure work against readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden of describing the return shape, and it does so thoroughly: sections, headings, CTAs, form fields, size_hint, typography, font_groups, palette, design_tokens, and the canvas 'source'/clone_notes payloads. An agent can anticipate the result at both detail levels.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description largely restates the schema's detail/intent/sections semantics rather than adding meaning, with the one genuinely additive nuance—that base_url triggers remote stylesheet fetching—already being covered in the schema. It compensates for nothing and adds little beyond structured data.
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 opening clause gives a precise verb+resource ('Parses an HTML string into a reference AST for rebuilding the page in Webcake') and enumerates the extracted outputs (sections by role, colors, fonts, design tokens, canvas conversion). However, it never names its obvious sibling ingest_url, so the agent must infer the boundary (raw HTML here vs URL fetching there) rather than being told.
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 well framed through the parameter semantics: when to choose detail:'compact' vs 'full', intent:'adapt' vs 'clone', and when to supply base_url. It does not state explicit exclusions or point to alternatives such as ingest_url, so the 'when not to use this' guidance is absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ingest_urlARead-onlyInspect
Fetches a public webpage (GET, 10 s timeout, 2 MB cap) together with its external stylesheets and @imports, and parses it into the same reference AST as ingest_html: role-classified sections with size_hint heights, palette, design tokens, self-hosted fonts (font_groups), computed typography, images, and — with detail:'full' — per-section blocks, lists and widgets. Absolute-canvas builder exports (LadiPage-family or Webcake-published pages) are detected and converted deterministically into a complete Webcake page source with clone_notes and canvas_summary. JavaScript is not executed, so client-rendered sites (React/Vue/Next.js) may return little content; the result then carries a warning that the body was empty. Fetches are restricted to public hosts (private and link-local addresses are blocked). No credentials, no writes. Docs: https://github.com/vuluu2k/webcake-landing-mcp/blob/main/docs/tools.md
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public HTTP(S) URL of the page to fetch. | |
| detail | No | Level of detail in the returned AST. 'compact' (default, ~2–5 KB): sections, top colors and fonts. 'full': adds the CSS custom-property palette (design tokens by name), background_images from stylesheets, gradients, per-section blocks (repeating card/tile/step structures with title/body/image/cta), li lists, extended paragraphs, images as { src, alt }, and per-section widgets = { hint, html, css? } — the cleaned source HTML + matching CSS of composite visuals (device mockup, chat thread, dashboard, browser frame). Both levels lift the design system from a `tailwind.config` block when present (Google Stitch / Tailwind-CDN pages): `palette` named by token (e.g. primary → #a43b38), `colors` ranked by usage, and `design_tokens` with the resolved spacing grid, corner radii and type scale (e.g. display-lg → 48px). Image URLs in the result (images, background_images, og_image) belong to the source page. Absolute-canvas builder exports return the deterministic `source` at either level. | |
| intent | No | How the result will be used. 'adapt' (default): the reference provides layout and imagery while the text is rewritten for the user's brand. 'clone': text and images stay close to the original. Absolute-canvas exports return a clone `source` either way. | |
| sections | No | Absolute-canvas mode only: return only these canvas section ids (from a previous result's canvas_summary.sections[].id; 'SECTION_POPUP' selects the popups). A full-page result marked canvas_summary.truncated:true has its styles pruned to fit the size cap; per-section results carry each section's `source` untrimmed, and `source.page[0]` is a single section node. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Well beyond the readOnlyHint/openWorldHint annotations, it discloses timeout, size cap, JS non-execution, the empty-body warning, SSRF-style private/link-local blocking, and 'no credentials, no writes.' It also explains the deterministic absolute-canvas conversion path and clone_notes/canvas_summary behavior.
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 densely informative with little filler, but the single long paragraph (with em-dashes and asides) is heavy, and the detail-level semantics echoed in the schema description create mild redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden and does so: it enumerates the returned AST fields, the compact/full distinction, canvas_summary/source handling, and failure modes. An agent has everything needed 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 real semantics: what detail:'full' yields, what intent changes, and that absolute-canvas exports return a clone source either way. Much of the detail/intent prose duplicates the schema, capping it above baseline rather than at the top.
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 ('Fetches a public webpage') and immediately scopes it (GET, 10 s timeout, 2 MB cap, external stylesheets and @imports). It distinguishes itself from the sibling ingest_html by defining the shared output ('the same reference AST as ingest_html') and its distinct input (a URL).
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 strong contextual usage signals: JavaScript is not executed so client-rendered sites may return little content, fetches are limited to public hosts, and the intent/detail params set expectations. It does not, however, explicitly frame ingest_html as the alternative to pick when the agent already has HTML in hand; the routing is left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
layoutARead-onlyInspect
Computes on-canvas coordinates (top/left/width/height) for a group of elements on both breakpoints. Modes: 'center' (one box centered on the canvas), 'row' (N boxes in a centered horizontal row on desktop, stacked into one column on mobile), 'grid' (N uniform cells in cols columns, stacked on mobile), 'stack' (a vertical list down the content column). Respects the page margins (content column 80–880 on desktop and 20–400 on mobile by default). Returns one box per item in input order, plus notes for off-canvas or over-wide inputs. Pure computation: no credentials, no network.
| Name | Required | Description | Default |
|---|---|---|---|
| gap | No | Horizontal gap between row/grid items (px). Default 24. | |
| top | No | Desktop start y inside the section (px). Default 0. | |
| cols | No | Grid columns. Default min(itemCount, 3). | |
| mode | Yes | Layout pattern. center=one box; row=horizontal row (stacks on mobile); grid=cols×rows (stacks on mobile); stack=vertical list. | |
| align | No | Horizontal alignment of the block within the canvas. Default center. | |
| count | No | Uniform shortcut: number of identical boxes (use with itemWidth/itemHeight). | |
| items | No | Explicit per-item sizes in order (row/stack may vary sizes). Provide this OR count+itemWidth+itemHeight. | |
| rowGap | No | Vertical gap between grid rows / stacked items (px). Default = gap. | |
| itemWidth | No | Uniform item width (with count). | |
| mobileTop | No | Mobile start y (px). Default = top. | |
| itemHeight | No | Uniform item height (with count). | |
| canvasMobile | No | Mobile canvas width. Default 420 (use 360 to match a narrow design). | |
| marginMobile | No | Mobile page margin / content inset. Default 20. | |
| canvasDesktop | No | Desktop canvas width. Default 960 (use 1200 for wide pages). | |
| marginDesktop | No | Desktop page margin / content inset. Default 80. | |
| mobileItemWidth | No | Stacked-mobile item width (row/grid). Default = mobile content width. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint=false; the description adds real behavior beyond that: order of returns ('one box per item in input order'), edge-case handling ('notes for off-canvas or over-wide inputs'), and the no-credentials/no-network guarantee. It stops short of describing error conditions or units explicitly, so not 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 with purpose, then modes, then margin constraints, then return shape and the pure-computation guarantee. Five dense sentences with no filler, though the mode list partially restates the schema's enum descriptions, keeping it just under 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?
With 16 params, one required, no output schema, and only readOnly annotations, the description carries the return-format burden and does so ('one box per item in input order, plus notes'). It covers defaults context and edge cases; units are only implied by '(px)' comments in the schema, which is a minor 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 100%, so the baseline is 3 and the schema already documents all 16 params including defaults. The description still adds a derived fact not in the schema: the effective content column (80–880 desktop, 20–400 mobile) produced by the margin defaults, plus mode-specific mobile stacking behavior that guides which params matter.
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: 'Computes on-canvas coordinates (top/left/width/height) for a group of elements on both breakpoints.' The final clause ('Pure computation: no credentials, no network.') cleanly separates it from every sibling CRUD/render tool. An agent knows exactly what this returns 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?
The description explains what each mode does and that it respects page margins, which implies the intended scenario (getting positions before placing elements). However it never states when to reach for this tool in a workflow (e.g. before add_section/new_element) and names no alternative or exclusion. Usage is inferable but not prescribed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_elementsARead-onlyInspect
List every supported element type, grouped by category, with a one-line summary and whether it is a container (can hold children).
| 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, and description adds detail about output format (grouped by category, summary, container info). No contradictions; it enhances transparency.
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?
Single sentence with no wasted words, front-loaded with action and resource, structured with logical groupings of output details.
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 no parameters and annotations, the description fully covers what the tool does and returns. No output schema, but description explains output content adequately.
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?
No parameters exist, and schema coverage is 100% (empty). Description does not need to add parameter information; baseline for 0 params is 4.
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 clearly states the verb 'list', the resource 'supported element types', and specifies grouping by category, one-line summary, and container flag. It distinguishes from sibling tools like 'get_element' (singular) and 'new_element' (creation).
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?
The description implies usage for browsing all element types but does not explicitly state when to use or not use this tool versus alternatives. Context from sibling tools suggests it's for overall listing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_organizationsARead-onlyInspect
Returns the account's Webcake organizations (id, name, is_default). The default org (type===1, usually the personal workspace) is where pages normally go. Needs WEBCAKE_API_BASE + WEBCAKE_JWT.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the bar is lower. The description adds value by specifying output fields and the default org concept, plus authentication requirements (WEBCAKE_API_BASE + WEBCAKE_JWT). No contradictions.
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 deliver purpose, output fields, a usage hint, and authentication prerequisites. No wasted words; front-loaded with action.
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 parameterless list tool with annotations, the description fully covers what is returned, the significance of the default org, and environment requirements. No gaps given the tool's simplicity.
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?
Input schema has zero parameters and 100% coverage. Per guidelines, baseline is 4. The description does not add parameter detail, but none is needed.
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 clearly states the tool 'Returns the account's Webcake organizations' with specific fields (id, name, is_default). It adds context about the default org, distinguishing it from other organization-related calls. No sibling tool duplicates this purpose.
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?
The description explains when to use this tool (to get organizations, especially the default org for page routing) but does not explicitly exclude alternatives or compare to siblings. The context is clear, but lacking exclusions prevents a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_pagesARead-onlyInspect
Lists the pages owned by the account (id, name, organization_id, updated_at), most-recent first. Needs WEBCAKE_API_BASE + WEBCAKE_JWT.
| 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 and openWorldHint=true, so the description adds value by specifying the ordering (most-recent first) and the exact fields returned. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core purpose, and every word contributes. No extra fluff.
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?
The description covers purpose, fields, and ordering, but lacks information on pagination, limits, or whether the list is complete. Given no output schema, missing pagination details reduces completeness for a list operation.
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 has no parameters, and schema coverage is 100% (no properties). The description does not need to add parameter meaning beyond what the schema provides; baseline for 0 parameters is 4.
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 clearly states the tool lists pages owned by the account, specifies returned fields (id, name, organization_id, updated_at), and indicates ordering (most-recent first). However, it does not differentiate from sibling tools like find_pages, which may filter.
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?
The only usage guidance is authentication requirements (WEBCAKE_API_BASE and WEBCAKE_JWT). No context on when to use this tool versus alternatives like find_pages or get_page, and no exclusions or prerequisites are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
new_elementARead-onlyInspect
Returns a default element node for a type in the sparse authoring shape: a fresh id, seeded styles for both breakpoints, and seeded specials. properties, runtime, empty events and per-breakpoint config are omitted because the server fills them from factory defaults on validate and save.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional properties.name override (layer label). | |
| type | Yes | Element type to create. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=true, openWorldHint=false) already establish that nothing is persisted, and the description adds substantial non-obvious context beyond that: exactly what is seeded (fresh id, styles for both breakpoints, specials) and exactly what is deliberately omitted (properties, runtime, empty events, per-breakpoint config) because the server fills them from factory defaults on validate and save. This tells the agent not to hand-populate those 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 tight sentences with the primary behavior front-loaded and the omission rationale following. No filler, though terms like 'specials' and 'per-breakpoint config' are project jargon that go unexplained.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-shape burden and does so well, enumerating what the node will and will not contain. What is missing is the downstream step — which sibling consumes this node (e.g. add_section/validate_page) — leaving the workflow slightly open.
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 parameters (type, name) are already documented in the schema, including the name-override semantics. The description only restates that a type is required and adds no format, enum, or naming-convention detail beyond the schema, 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?
States a specific verb and resource — it *returns* a default element node for a given type, in a named 'sparse authoring shape'. The word 'Returns' implicitly separates it from retrieval tools like get_element and from the persisted new_page_skeleton, but no sibling is named explicitly, so the differentiation is left to inference.
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?
There is no explicit when-to-use statement or conditional routing to alternatives. Usage is only implied by the mention of the 'sparse authoring shape' and the fact that the server fills gaps on validate/save, from which an agent can infer this is a pre-authoring scaffolding step rather than a read of existing data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
new_page_skeletonARead-onlyInspect
Returns an empty, complete top-level page source { page:[], popup:[], settings, options, cartConfigs } in the Webcake editor's shape. desktopWidth (960 or 1200) and mobileWidth (420 or 360) set settings.width_section, the canvas width that all element coordinates are measured in.
| Name | Required | Description | Default |
|---|---|---|---|
| mobileOnly | No | true if the page renders mobile-only. | |
| mobileWidth | No | Mobile canvas width (settings.width_section.mobile). 420 (default) or 360 (to match a ~360–390 mobile design). | |
| desktopWidth | No | Desktop canvas width (settings.width_section.desktop). 960 (default, simple/narrow) or 1200 (wide/multi-column/editorial, or cloning a >960 reference). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered and the description's 'Returns' is consistent with it. Beyond that, it discloses the exact returned shape and the non-obvious behavioral fact that width_section is the canvas width all element coordinates are measured in — real context an agent needs before placing elements.
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 dense sentences with no filler, and the most important fact (what is returned) is front-loaded. The return-shape enumeration is compact rather than sprawling, though it slightly crowds the more decision-relevant width/coordinate 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?
There is no output schema, and the description compensates by naming the returned keys (page, popup, settings, options, cartConfigs). Combined with the read-only annotations and the coordinate-system explanation, 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 baseline is 3, and the description earns above that by linking desktopWidth/mobileWidth to settings.width_section and explaining the consequence: this width is the coordinate basis for every element. It omits mobileOnly, but that parameter is already documented in 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: returns an empty, complete top-level page source in the Webcake editor's shape, with the exact top-level keys enumerated. This clearly separates it from read-oriented siblings like get_page, though it never names create_page or explains which sibling to prefer for bootstrapping a real 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?
Usage is only implied: the phrase 'empty, complete top-level page source' suggests scaffolding a new page before adding elements, but there is no explicit when-to-use statement, no prerequisites, and no named alternative (e.g. create_page). An agent can infer intent but receives no routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
patch_pageADestructiveInspect
Edits a page by element id without sending the whole source. The target is either a live page (page_id) or a cached draft (draft_id) returned by a failed or dry-run create_page, add_section or update_page call. Ops: {op:'update', id, type?, specials?, styles?:{desktop?,mobile?}, config?:{desktop?,mobile?}, events?, properties?} shallow-merges fields (op defaults to 'update'; it cannot delete existing keys), {op:'replace', id, element} swaps the node, {op:'remove', id} deletes it, and {op:'add', parent_id, element} appends a child to a container; element may be sparse. The server loads the source, applies the ops, validates the whole merged tree (errors block the save) and saves: a live page is updated in place, a create draft becomes a new page, a section draft is appended, and an update draft is re-saved. With a draft_id and no patches, the cached draft is committed as-is (the retry after a timeout). dry_run defaults to true (load, merge, validate, preview; no write); dry_run:false saves. Requires Webcake credentials; a page_id patch reads the live page, so it needs them even on a dry run.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Default false. Only meaningful when committing an 'update' draft: true saves the cached snapshot even though the page changed outside this session, discarding those changes. A page_id patch never needs it — it merges into the tree it just read. | |
| dry_run | No | Default TRUE — load, merge, validate and preview the resulting save WITHOUT writing. Set false to actually save. | |
| page_id | No | A live page id to edit (must be owned by the account). Provide page_id OR draft_id; with a sections or update draft_id, page_id overrides the stored target page. | |
| patches | No | One op object or an array of them (object/array or JSON string). Each targets an element by id: {op:'update',id,type?,specials?,styles?:{desktop?,mobile?},config?:{desktop?,mobile?},events?,properties?} merges fields into the element (op may be omitted; `type` changes the element type; a merge cannot delete an existing key, so schema 'must NOT have additional properties' errors are fixed with op:'replace' and a clean node); {op:'replace',id,element} swaps the node; {op:'remove',id} deletes it; {op:'add',parent_id,element} appends a child to a container. `element` may be a sparse node (id/type/styles/specials/events); omitted boilerplate is filled from factory defaults. Empty or omitted with a draft_id: the cached draft is committed as-is. | |
| draft_id | No | Commit or fix a CACHED source: from create_page (failed/timed-out → new page created once valid), add_section (dry_run or failure → sections appended), or update_page/live-page patch (timed-out/failed → updatePageSource retried). The originating tool's error/dry_run response returns draft_id. Provide page_id OR draft_id. Empty/omitted patches = commit the cached draft as-is (the RETRY PATH after a timeout). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint/readOnlyHint annotations, it discloses that validation errors block the save, that dry_run defaults to true so no write occurs unless dry_run:false, that force discards concurrent changes, and that credentials are required even on a dry read. These are exactly the behavioral facts an agent needs for a destructive mutation.
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 is front-loaded and the prose is information-dense, but the op grammar is restated almost verbatim in both the description and the patches schema, and the long final sentence packs save-routing rules tightly. Mostly earning its place with some duplication.
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, credential-gated mutation with no output schema, it covers the full lifecycle: source loading, merge, whole-tree validation, save routing per draft type, dry-run preview, retry path, and force. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema baseline is 3, but the description adds real meaning: the op grammar (update/replace/remove/add), that update cannot delete keys, that merge cannot fix additionalProperties errors, and that an empty patches with draft_id commits as-is. Most of this is nonetheless echoed in the schema, so it lands just above 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?
Opens with a specific verb+resource and a distinguishing constraint ('Edits a page by element id without sending the whole source'), immediately separating it from update_page/create_page/add_section. The draft_id/page_id duality is framed clearly so an agent knows what resource it targets.
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 routes the agent well: draft_id originates from failed/dry-run create_page, add_section or update_page calls, and empty patches with draft_id is explicitly the retry path after a timeout. It does not, however, give an explicit when-not-to-use rule versus update_page for a fresh edit, leaving the choice partly inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
publish_pageADestructiveInspect
Publishes an existing page: builds the rendered app on the Webcake build host (POST /render/build; https://build.webcake.io in production, overridable with WEBCAKE_BUILD_BASE / x-webcake-build-base) and then creates or updates the published record that public serving reads. With custom_domain (already pointed at Webcake) the page is served at that domain; when omitted, the page's currently attached domain is reused; with no domain, or custom_domain:'', only the preview link (/preview/<page_id>) is returned, and it renders for about 10 minutes after the publish. Without a build host, or if the build fails, it falls back to a source-only publish that saves a version but serves nothing, and returns a warning. dry_run defaults to true and makes no network calls; dry_run:false builds and publishes. Requires Webcake credentials.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Default TRUE — preview the request without sending. Does NOT call the build host. Set false to actually publish (build + publish). | |
| page_id | Yes | The page id to publish (must be owned by the account). | |
| custom_path | No | Optional path under the custom domain (e.g. 'sale'). | |
| custom_domain | No | Optional custom domain to serve the page at (e.g. 'shop.example.com' — must already point at Webcake). OMIT to reuse the page's CURRENTLY-ATTACHED domain (so republishing keeps it live at the same URL, like the editor's publish modal); if the page has none it publishes domain-less (preview-host URL). Pass an empty string '' to force a domain-less publish even when the page has a domain. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructive/openWorld; the description adds substantial context they cannot carry: the build-host fallback to a source-only publish that 'serves nothing' and returns a warning, the ~10-minute rendering window on preview links, domain reuse semantics on republish, and the credential requirement. It is consistent with destructiveHint=true (it overwrites the live published record) and never contradicts 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 action and its two effects before diving into fallbacks and domain behavior, and every sentence carries real information. It is one dense, deeply nested paragraph rather than cleanly segmented, which costs it the top mark.
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 mutating tool with no output schema, the description covers the full lifecycle: what is built, what record is written, what URL is served under each domain case, what happens with no build host or a failed build, and what dry_run returns. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description restates the custom_domain omit-vs-'' distinction and the dry_run default that the schema already documents, adding little parameter meaning beyond the structured 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?
States a specific verb+resource ('Publishes an existing page') and immediately distinguishes it from sibling mutations like update_page/create_page by naming the two concrete effects: building the rendered app on the build host and creating/updating the published record that public serving reads. An agent knows exactly what this does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational context: dry_run defaults to true so an agent knows calling it blind does nothing destructive, and it explains the domain-resolution conditions (custom_domain provided / omitted / empty). It stops short of naming alternatives (e.g. render_preview or update_page) or stating when not to publish, so not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_previewARead-onlyInspect
Renders a public URL to a PNG screenshot and returns it as an image. page_id targets a created page's preview URL (/preview/); url targets any public page and takes precedence. full_page (default true) captures the whole scrollable page and width sets the viewport; tiles:true returns a tall page as several top-to-bottom band images (requires a self-hosted Playwright host via RENDER_SCREENSHOT_BASE, otherwise a single image is returned). Engine: Microlink's free tier by default (API: https://microlink.io/docs/api/getting-started/overview; about 50 requests/day per IP — when rate-limited the result is ok:false with HTTP 429), or a self-hosted screenshot proxy set by RENDER_SCREENSHOT_BASE / x-render-screenshot-base; MICROLINK_API_KEY / x-microlink-key raises the quota. A page published without a custom domain serves its preview for about 10 minutes after the last publish; after that the preview shows 'Preview page is expired'. Docs: https://github.com/vuluu2k/webcake-landing-mcp/blob/main/docs/tools.md
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Any public http(s) URL to screenshot (e.g. the reference page being cloned). Wins over page_id. | |
| tiles | No | Tall pages: return the page as MULTIPLE top→bottom band images (each readable in detail) instead of one squished full-page image. Requires a Playwright host (RENDER_SCREENSHOT_BASE); without one it falls back to a single image. | |
| width | No | Viewport width in px (default 1280; ~960 or 1200 matches the desktop page canvas, ~420 the mobile one). | |
| page_id | No | A created page's id — screenshots its /preview/<id> URL (built from the preview base). Provide page_id OR url. | |
| full_page | No | Capture the whole scrollable page (default true) vs just the viewport. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far exceeds the annotations: discloses the ~50 requests/day per-IP rate limit, the HTTP 429 / ok:false failure shape, that tiles requires a self-hosted Playwright host and otherwise degrades to one image, that MICROLINK_API_KEY raises quota, and that published previews expire ~10 minutes after the last publish. This is exactly the behavioral context annotations cannot 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?
A single dense paragraph, front-loaded with the core action and output before engine/rate-limit details. Almost every clause is actionable, though the Microlink doc URL and dual env-var naming add marginal bulk.
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 cover return behavior — and it does: PNG image, multiple band images under tiles, or ok:false on rate limiting. Combined with the expiry caveat and host requirements, an agent has everything needed to call it 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 description coverage is already 100% for all five params, so the schema carries the parameter burden. The description largely restates the same facts (url precedence, tiles fallback, width semantics) rather than adding new syntax or constraints; the baseline of 3 fits.
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 concrete verb+resource+output: renders a public URL to a PNG screenshot and returns it as an image. It further specifies two targeting modes (page_id vs url) and precedence, which cleanly separates it from every sibling tool (none of which are screenshot 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?
Explains the two input modes and their precedence ('url takes precedence'), the tiles vs single-image choice and its host prerequisite, and full_page defaults. It stops short of explicit when-not-to-use guidance, but the operational context is clear enough for correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_imagesARead-onlyInspect
Searches Pexels stock photos (API: https://www.pexels.com/api/documentation/) by short English subject queries. Each photo includes hotlinkable URLs at several sizes, a sizes map with each variant's pixel dimensions, avg_color, and the photographer's name and attribution URL; the response also includes a size_guide mapping slot widths to variants (hero/banner ~940–1880px → large/large2x, card ~350px → medium, avatar → tiny). queries: [...] runs several searches in parallel and returns { queries: { [q]: result } } — pick:'best' (default) keeps only the top photo per query, pick:'all' the full list; query runs a single search. Works without configuration through a shared hosted proxy; a PEXELS_API_KEY env var or x-pexels-key header uses a personal Pexels quota.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Result page for pagination (default 1). | |
| pick | No | With `queries`, 'best' (default) returns only the top photo per query (compact, drop-in for specials.src); 'all' returns the full result. Single-query calls always return the full result. | |
| size | No | Minimum photo size to return (default any). | |
| color | No | Optional color filter: a name (red, blue, …) or a hex like '6a8f3c'. | |
| query | No | Single subject query; returns the full result. | |
| queries | No | Several subject queries (typically one per image slot), run in parallel in one call. | |
| per_page | No | Photos per query (default 5). | |
| orientation | No | Preferred shape — 'landscape' for heroes/banners, 'portrait' for tall cards, 'square' for icons/avatars. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint. The description adds crucial behavioral context: the default shared proxy works without configuration, and a PEXELS_API_KEY or x-pexels-key header uses a personal quota. It also details the response structure (hotlinkable URLs, sizes map, avg_color, size_guide), which is essential without an output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose and remains information-dense with no filler sentences. It is a single long paragraph rather than a bulleted list, which slightly hurts scanability, but every sentence contributes relevant 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?
With no output schema, the description fully covers the return shape (photo fields, `sizes` map, `avg_color`, attribution, `size_guide`, and the parallel-search response envelope). It also addresses authentication modes. An agent has everything needed to call 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%, so the baseline is 3. The description adds meaningful detail beyond schema descriptions: the interaction between `pick` and `queries` (best limits to top photo, all returns full list), the parallel behavior of `queries`, and the practical size_guide mapping to slot widths.
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 ('Searches') and resource ('Pexels stock photos') and distinguishes the operation from all siblings, which cover different resources like icons, pages, and uploads. An agent can immediately tell this is the stock-photo search tool.
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?
Explains when to use `queries` (multiple slots in parallel), `query` (single search), and `pick:'best'` vs `pick:'all'`, giving clear operational context. It does not explicitly exclude or compare against sibling tools, but no true alternative for stock photo search exists among them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_pageADestructiveInspect
Replaces an existing page's stored source with an edited tree (source only; the published build is not refreshed). Validates first. Concurrency check: the save is refused with page_changed_externally when the page was edited elsewhere since it was last read (base_version, or the version the server recorded), or with unverified_overwrite when an unverified save would delete live element ids; force:true overrides. dry_run defaults to true: it validates, caches the source under a draft_id and returns the masked request; dry_run:false saves. A draft_id from a dry run or a failed/timed-out update re-runs from the cached source. Requires Webcake credentials.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Default false. true saves even when the page changed outside this session, discarding those outside changes. | |
| source | No | The edited page source { page, popup, settings, options, cartConfigs } (object or JSON string). Required unless draft_id is given. The compacted tree from get_page can be edited and sent back AS-IS — sparse nodes are re-hydrated from factory defaults (a full tree also works). | |
| dry_run | No | Default TRUE — validate, cache the source as draft_id, and preview without sending. Set false to actually save. | |
| page_id | No | The page id to update (must be owned by the account). Required unless draft_id is given (the page_id is stored in the draft). | |
| draft_id | No | A draft_id from a previous update_page call (dry_run=true or a timed-out/failed update). Loads the cached source, so the full JSON is not re-sent; covers the dry-run → real call step and retries after a timeout. | |
| base_version | No | The page's source_version as returned by get_page. When it no longer matches the live page, the save is rejected rather than reverting edits made in the Webcake editor meanwhile. Optional — when omitted, the server uses the version it recorded at this session's last read or write of the page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, but the description goes well beyond them: it discloses the validate-first step, the exact refusal codes (page_changed_externally, unverified_overwrite), the force:true override, the dry_run default and draft caching, and the Webcake credential requirement. An agent knows what gets destroyed (outside edits on force) and what failure modes to expect.
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 behavior, then layers validation, concurrency, dry-run, draft reuse, and credentials — every sentence carries distinct information with no filler. It is dense and would read better with minor structure, but 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?
With no output schema, the description still explains what a dry run returns (a masked request + draft_id) and the reuse path, plus failure behavior and auth requirements. For a destructive 6-parameter mutation tool, 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 description coverage is 100%, so the baseline is 3 and the per-parameter docs already carry the load. The description still adds integration value by wiring the parameters into a workflow — how base_version/force interact in the concurrency check, and that draft_id lets a retry re-run from cached source without resending JSON — rather than merely restating individual 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+resource and scope: 'Replaces an existing page's stored source with an edited tree (source only; the published build is not refreshed).' The parenthetical implicitly separates it from publish_page and patch_page by nailing down that only the stored source changes, which lets an agent route correctly without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives strong when-to-use context: validate-first flow, dry_run defaulting to true, draft_id reuse after a dry run or timeout, and when the server refuses the save. It never names a sibling alternative (e.g. patch_page vs update_page, or publish_page for the live build) explicitly, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_imagesAInspect
Re-hosts images on Webcake's CDN (statics.pancake.vn) and returns a map from each original entry to its hosted URL. Accepts up to 20 entries per call, processed in parallel, up to 200 MB each: http(s) image URLs, data:image/…;base64 URIs, and — only when the server runs locally over stdio — local file paths (absolute, ~/, file://, or Windows drive paths; rejected per entry on the remote HTTP transport). Upload target: with Webcake credentials and a resolved organization, each image is filed into that organization's media collection (the library the Webcake editor's media picker shows) and marked collection:true with its asset_id; without credentials the public CDN endpoint is used (the URL works, but the image is not in any collection: collection:false). Organization resolution: organization_id, then WEBCAKE_ORG_ID / x-webcake-org-id, then automatic selection when the account has exactly one organization; with two or more and none given, the result is ok:false with reason:'organization_required' and the organization list. dry_run defaults to false, because this only adds images to the media library and changes no page data; dry_run:true lists what would be processed without any network or filesystem access.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | Yes | Image sources to upload — 1–20 per call. Accepted formats: • http(s) URLs (remote images to download and re-host) • data:image/...;base64,... URIs (inline image data) • Local file paths from the user's machine: absolute POSIX paths (/home/user/photo.jpg), home-dir paths (~/Pictures/logo.png), file:// URIs, or Windows drive paths (C:\Users\…). Local paths are only allowed when the server runs in stdio mode (the user's own machine); they are rejected on the remote HTTP transport. Up to 200 MB per image (the backend multipart limit). | |
| dry_run | No | Default FALSE — the call actually reads/downloads and uploads, returning hosted URLs. Set true to only preview the endpoint and entries that WOULD be processed, without any network or filesystem activity (local paths: reports whether the file exists and its size). | |
| in_folder | No | Collection folder id to file the uploaded assets into (the media library's folder). Omit to use the account's root folder. Ignored when the upload falls back to the public CDN endpoint (no credentials). | |
| organization_id | No | Organization whose media collection receives the images — normally the organization the page lives in. Optional when WEBCAKE_ORG_ID / x-webcake-org-id is set or the account has exactly one organization; with two or more and none given, the result is reason:'organization_required' with the organization list. Ignored without credentials (public CDN fallback). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=false, openWorldHint=true), the description discloses limits (20 entries, 200 MB each, parallel processing), transport-dependent behavior (stdio vs HTTP for local paths), the collection:true/false outcome depending on credentials, the exact failure shape (ok:false, reason:'organization_required'), and dry_run semantics. It also complements destructiveHint=false by stating the operation changes no page data.
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 is front-loaded, but the remainder is one dense run-on block with stacked em-dash clauses that is hard to parse. Most content is genuinely useful, yet the packaging over-packs detail (org resolution is repeated from the schema) and could be broken into tighter sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden and does so well: it explains the return value (entry→hosted-URL map), failure outcomes, credential/collection effects, and transport constraints. An agent has everything needed to call this complex 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 100% and the parameter descriptions are already thorough (including the org-resolution chain and dry_run behavior), so the description largely mirrors existing schema semantics. It adds the framing of in_folder as the editor's media-picker library, but nothing materially new. 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?
The first sentence states a specific verb (re-hosts), a specific resource (images on Webcake's CDN at statics.pancake.vn), and the return shape (a map from original entry to hosted URL). This clearly distinguishes it from the closest sibling, search_images, without the agent needing to open 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?
The description gives clear operational context: it documents the credential/org-resolution path (organization_id → WEBCAKE_ORG_ID → auto-select), states dry_run defaults to false because the tool only adds to the media library, and notes local paths are rejected on the remote HTTP transport. It provides no explicit routing against sibling tools (e.g., when to prefer search_images), so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_pageARead-onlyInspect
Validates a page source against the JSON schema and semantic rules: unique ids, dangling event targets, children only on container types, missing field_name, top-level types, and form-data bindings (duplicate field_name within one form; dangling promoId / connectedSurvey / connectedForm / set_field_value targets). Before validating it applies deterministic layout corrections (off-canvas boxes moved on-canvas, elements below wrapped text moved down) and lists them in auto_fixed. Returns errors (structural problems that block saving) and warnings (visible layout defects such as overlapping text, off-canvas bounds, or empty bands).
| Name | Required | Description | Default |
|---|---|---|---|
| page | Yes | The page source object { page:[...], settings:{} } OR a JSON string of it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint/openWorldHint already covering the safety profile, the description still adds real behavioral content: the deterministic auto-corrections applied before validation, the auto_fixed channel, and a meaningful errors-vs-warnings distinction (blocking vs. visible defects). There is mild tension between 'applies deterministic layout corrections' and readOnlyHint=true, but since it explicitly reports them in auto_fixed rather than persisting, this reads as a pure computation rather than a genuine contradiction.
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 two dense but information-bearing sentences. The rule enumerations are long, but each clause corresponds to a distinct class of check the agent may need to reason about, 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?
No output schema exists, so the description correctly carries the return contract (errors, warnings, auto_fixed) and explains what each channel means. It is nearly complete for a single-parameter validator, with the only gap being guidance on when in a workflow to invoke it and whether the corrected page must be re-saved.
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?
One parameter at 100% schema description coverage, so the schema already documents that 'page' accepts either the source object or a JSON string of it. The description adds no format, size, or encoding guidance beyond that, which is the expected baseline 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 and resource ('Validates a page source') and then enumerates the exact rule families checked (unique ids, dangling event targets, container-only children, form-data bindings). No sibling tool performs validation, so an agent can distinguish this immediately from layout, render_preview, or create_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?
Usage is only implied: 'errors (structural problems that block saving)' hints that this is a pre-save gate, but the description never explicitly says when to call it versus alternatives such as render_preview, layout, or patch_page. No prerequisites, ordering, or exclusions are stated.
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.
11 tool updates
v1.5.11- Changed
add_section3 fields changed- changed
Input schema / properties / draft_id / descriptionPrevious value: -"A draft id returned by a previous add_section call (dry_run=true or validation failure). Loads the cached section payload — no need to re-send the sections JSON. Use for dry-run → real call transitions and fix-after-error rounds."New value: +"A draft id returned by a previous add_section call (dry_run=true or validation failure). Loads the cached section payload, so the sections are not re-sent." - added
Input schema / properties / sections / anyOfAdded value: +[ + { + "additionalProperties": {}, + "type": "object" + }, + { + "items": { + "additionalProperties": {}, + "type": "object" + }, + "type": "array" + }, + { + "type": "string" + } +] - changed
Input schema / properties / sections / descriptionPrevious value: -"One section node, or an array of section nodes, to append to the END of `page` (object/array or JSON string). Each is a normal section element { id, type:'section', responsive, children, … } with a UNIQUE id; they stack vertically after the existing sections. Author SPARSE nodes — omit properties/runtime/empty events+children/per-breakpoint config; the server hydrates them from factory defaults. Required unless draft_id is supplied."New value: +"One section node, or an array of section nodes, appended to the end of `page` (object/array or JSON string). Each is a normal section element { id, type:'section', responsive, children, … } with a unique id; sections stack vertically after the existing ones. Nodes may be sparse — omitted properties/runtime/empty events and children/per-breakpoint config are filled from factory defaults. Required unless draft_id is supplied."
- Changed
create_page4 fields changed- changed
Input schema / properties / draft_id / descriptionPrevious value: -"A draft_id from a previous create_page call (validation failure, dry_run=true, or a timed-out/failed create). Loads the cached source — no need to re-send the full JSON. Use for dry-run → real call transitions, fix-after-error rounds, and retrying after a timeout."New value: +"A draft_id from a previous create_page call (validation failure, dry_run=true, or a timed-out/failed create). Loads the cached source, so the full JSON is not re-sent; covers the dry-run → real call step, fixes after errors, and retries after a timeout." - changed
Input schema / properties / organization_id / descriptionPrevious value: -"Organization to create the page in (id from list_organizations). Pass the string 'personal' to explicitly save without any organization (skips auto-resolution). Omit to fall back to WEBCAKE_ORG_ID env; if that is also unset, the server calls list_organizations: 1 org → auto-selected; 2+ orgs → returns the list and asks you to pick; 0 orgs → personal."New value: +"Organization to create the page in (an organization id). The string 'personal' saves without any organization and skips auto-resolution. When omitted: WEBCAKE_ORG_ID / x-webcake-org-id, else automatic — one organization is selected, two or more return the list (ok:false), none means personal." - added
Input schema / properties / source / anyOfAdded value: +[ + { + "additionalProperties": {}, + "type": "object" + }, + { + "type": "string" + } +] - changed
Input schema / properties / source / descriptionPrevious value: -"Page source { page, popup, settings, options, cartConfigs } (object or JSON string). Required unless draft_id is given. Author elements SPARSE — only id, type, responsive.<bp>.styles for BOTH breakpoints, specials, and real events; OMIT properties/runtime/empty events+children/per-breakpoint config — the server hydrates them from factory defaults (a full node also works)."New value: +"Page source { page, popup, settings, options, cartConfigs } (object or JSON string). Required unless draft_id is given. Elements may be sparse — id, type, responsive.<bp>.styles for both breakpoints, specials and real events; omitted properties/runtime/empty events and children/per-breakpoint config are filled from factory defaults (full nodes also work)."
- Changed
get_element2 fields changed- changed
Input schema / properties / type / descriptionPrevious value: -"Single element type — backward-compat. Prefer `types` when fetching more than one."New value: +"Single element type." - changed
Input schema / properties / types / descriptionPrevious value: -"Multiple element types to fetch in one call (recommended for a section that needs several types, e.g. ['section','text-block','button','form','input'])."New value: +"Several element types fetched in one call, e.g. ['section','text-block','button','form','input']."
- Changed
ingest_html4 fields changed- added
Input schema / properties / base_urlAdded value: +{ + "description": "The page's original URL, when the HTML was saved or copied from a live site. Resolves relative font and image URLs and fetches the page's external stylesheets (+ @imports), so self-hosted fonts (`font_groups`) and computed type (`typography` / `text_styles`) defined outside the HTML are included.", + "type": "string" +} - changed
Input schema / properties / detail / descriptionPrevious value: -"Level of detail in the returned AST. Both levels also lift the design system from a `tailwind.config` block when present (Google Stitch / Tailwind-CDN pages keep the WHOLE design system there, not in CSS): `palette` is named by token (primary→#a43b38, surface-container-low→#f3f3f3 — map utility classes like text-primary/bg-surface-container-low back to it), `colors` is usage-ranked from the classes actually on the page, and `design_tokens` carries the resolved spacing grid, corner radii, and TYPE SCALE (e.g. display-lg→48px, xl→80px) — REBUILD from these tokens so sizing/spacing/color match the original. 'compact' (default) — backward-compatible ~2-5 KB shape with top colors/fonts from inline styles. 'full' — richer AST: CSS custom-property palette (design tokens by name), background_images from stylesheets, gradients, per-section blocks (repeating card/tile/step structures with title/body/image/cta), li lists, extended paragraphs, images as { src, alt } objects, and per-section widgets = { hint, html, css? } — the cleaned source HTML + matching CSS of composite visuals (phone/device mockup, chat thread, dashboard, browser frame) to rebuild VERBATIM as ONE html-box (inline the css; don't re-imagine the markup). Use 'full' for clone-faithful rebuilds. Image URLs found in the result (images, background_images, og_image) are the user's assets: re-host them via upload_images and reuse them in the generated page for BOTH intents (never hotlink, never replace them with search_images stock photos). NOTE: for absolute-canvas builder exports the deterministic `source` is returned regardless of detail."New value: +"Level of detail in the returned AST. 'compact' (default, ~2–5 KB): sections, top colors and fonts. 'full': adds the CSS custom-property palette (design tokens by name), background_images from stylesheets, gradients, per-section blocks (repeating card/tile/step structures with title/body/image/cta), li lists, extended paragraphs, images as { src, alt }, and per-section widgets = { hint, html, css? } — the cleaned source HTML + matching CSS of composite visuals (device mockup, chat thread, dashboard, browser frame). Both levels lift the design system from a `tailwind.config` block when present (Google Stitch / Tailwind-CDN pages): `palette` named by token (e.g. primary → #a43b38), `colors` ranked by usage, and `design_tokens` with the resolved spacing grid, corner radii and type scale (e.g. display-lg → 48px). Image URLs in the result (images, background_images, og_image) belong to the source page. Absolute-canvas builder exports return the deterministic `source` at either level." - changed
Input schema / properties / intent / descriptionPrevious value: -"How the caller intends to use the result. 'adapt' (default) — use as a layout reference and rewrite the TEXT for the user's brand (images from the reference are still re-hosted via upload_images and reused). 'clone' — keep text and images close to the original. For absolute-canvas exports the deterministic `source` is a clone either way."New value: +"How the result will be used. 'adapt' (default): the reference provides layout and imagery while the text is rewritten for the user's brand. 'clone': text and images stay close to the original. Absolute-canvas exports return a clone `source` either way." - changed
Input schema / properties / sections / descriptionPrevious value: -"Absolute-canvas mode only: return ONLY these canvas section ids (use the ids from a previous call's canvas_summary.sections[].id; 'SECTION_POPUP' selects the popups). When a full-page call comes back canvas_summary.truncated:true (styles pruned to fit the size cap), re-call per section to get each section's `source` in FULL untrimmed detail — pairs naturally with building the page incrementally via add_section (pass that call's source.page[0] to add_section)."New value: +"Absolute-canvas mode only: return only these canvas section ids (from a previous result's canvas_summary.sections[].id; 'SECTION_POPUP' selects the popups). A full-page result marked canvas_summary.truncated:true has its styles pruned to fit the size cap; per-section results carry each section's `source` untrimmed, and `source.page[0]` is a single section node."
- Changed
ingest_url3 fields changed- changed
Input schema / properties / detail / descriptionPrevious value: -"Level of detail in the returned AST. Both levels also lift the design system from a `tailwind.config` block when present (Google Stitch / Tailwind-CDN pages keep the WHOLE design system there, not in CSS): `palette` is named by token (primary→#a43b38, surface-container-low→#f3f3f3 — map utility classes like text-primary/bg-surface-container-low back to it), `colors` is usage-ranked from the classes actually on the page, and `design_tokens` carries the resolved spacing grid, corner radii, and TYPE SCALE (e.g. display-lg→48px, xl→80px) — REBUILD from these tokens so sizing/spacing/color match the original. 'compact' (default) — backward-compatible ~2-5 KB shape with top colors/fonts from inline styles. 'full' — richer AST: CSS custom-property palette (design tokens by name), background_images from stylesheets, gradients, per-section blocks (repeating card/tile/step structures with title/body/image/cta), li lists, extended paragraphs, images as { src, alt } objects, and per-section widgets = { hint, html, css? } — the cleaned source HTML + matching CSS of composite visuals (phone/device mockup, chat thread, dashboard, browser frame) to rebuild VERBATIM as ONE html-box (inline the css; don't re-imagine the markup). Use 'full' for clone-faithful rebuilds. Image URLs found in the result (images, background_images, og_image) are the user's assets: re-host them via upload_images and reuse them in the generated page for BOTH intents (never hotlink, never replace them with search_images stock photos). NOTE: for absolute-canvas builder exports the deterministic `source` is returned regardless of detail."New value: +"Level of detail in the returned AST. 'compact' (default, ~2–5 KB): sections, top colors and fonts. 'full': adds the CSS custom-property palette (design tokens by name), background_images from stylesheets, gradients, per-section blocks (repeating card/tile/step structures with title/body/image/cta), li lists, extended paragraphs, images as { src, alt }, and per-section widgets = { hint, html, css? } — the cleaned source HTML + matching CSS of composite visuals (device mockup, chat thread, dashboard, browser frame). Both levels lift the design system from a `tailwind.config` block when present (Google Stitch / Tailwind-CDN pages): `palette` named by token (e.g. primary → #a43b38), `colors` ranked by usage, and `design_tokens` with the resolved spacing grid, corner radii and type scale (e.g. display-lg → 48px). Image URLs in the result (images, background_images, og_image) belong to the source page. Absolute-canvas builder exports return the deterministic `source` at either level." - changed
Input schema / properties / intent / descriptionPrevious value: -"How the caller intends to use the result. 'adapt' (default) — use as a layout reference and rewrite the TEXT for the user's brand (images from the reference are still re-hosted via upload_images and reused). 'clone' — keep text and images close to the original. For absolute-canvas exports the deterministic `source` is a clone either way."New value: +"How the result will be used. 'adapt' (default): the reference provides layout and imagery while the text is rewritten for the user's brand. 'clone': text and images stay close to the original. Absolute-canvas exports return a clone `source` either way." - changed
Input schema / properties / sections / descriptionPrevious value: -"Absolute-canvas mode only: return ONLY these canvas section ids (use the ids from a previous call's canvas_summary.sections[].id; 'SECTION_POPUP' selects the popups). When a full-page call comes back canvas_summary.truncated:true (styles pruned to fit the size cap), re-call per section to get each section's `source` in FULL untrimmed detail — pairs naturally with building the page incrementally via add_section (pass that call's source.page[0] to add_section)."New value: +"Absolute-canvas mode only: return only these canvas section ids (from a previous result's canvas_summary.sections[].id; 'SECTION_POPUP' selects the popups). A full-page result marked canvas_summary.truncated:true has its styles pruned to fit the size cap; per-section results carry each section's `source` untrimmed, and `source.page[0]` is a single section node."
- Changed
patch_page3 fields changed- changed
Input schema / properties / page_id / descriptionPrevious value: -"Edit a LIVE page by id (from create_page, list_pages, or find_pages; must be owned by the account). Provide page_id OR draft_id. For a sections or update draft_id you may also pass page_id here to override the stored page target."New value: +"A live page id to edit (must be owned by the account). Provide page_id OR draft_id; with a sections or update draft_id, page_id overrides the stored target page." - added
Input schema / properties / patches / anyOfAdded value: +[ + { + "additionalProperties": {}, + "type": "object" + }, + { + "items": { + "additionalProperties": {}, + "type": "object" + }, + "type": "array" + }, + { + "type": "string" + } +] - changed
Input schema / properties / patches / descriptionPrevious value: -"One op object or an array of them (object/array or JSON string). Each targets an element by id: {op:'update',id,type?,specials?,styles?:{desktop?,mobile?},config?:{desktop?,mobile?},events?,properties?} merges fields into the element (op may be omitted; set `type` to fix a wrong element type; update MERGES — it cannot DELETE an existing/stray key, so 'must NOT have additional properties' errors need op:'replace' with a clean node); {op:'replace',id,element} swaps the node; {op:'remove',id} deletes it; {op:'add',parent_id,element} appends a child to a container. `element` may be a SPARSE node (id/type/styles/specials/events only) — the server hydrates omitted boilerplate from factory defaults. OMIT (or pass empty array) when draft_id is given and you just want to commit/retry the cached draft as-is."New value: +"One op object or an array of them (object/array or JSON string). Each targets an element by id: {op:'update',id,type?,specials?,styles?:{desktop?,mobile?},config?:{desktop?,mobile?},events?,properties?} merges fields into the element (op may be omitted; `type` changes the element type; a merge cannot delete an existing key, so schema 'must NOT have additional properties' errors are fixed with op:'replace' and a clean node); {op:'replace',id,element} swaps the node; {op:'remove',id} deletes it; {op:'add',parent_id,element} appends a child to a container. `element` may be a sparse node (id/type/styles/specials/events); omitted boilerplate is filled from factory defaults. Empty or omitted with a draft_id: the cached draft is committed as-is."
- Changed
render_preview1 field changed- changed
Input schema / properties / width / descriptionPrevious value: -"Viewport width in px (default 1280; use ~960/1200 to match the page canvas, ~420 for mobile)."New value: +"Viewport width in px (default 1280; ~960 or 1200 matches the desktop page canvas, ~420 the mobile one)."
- Changed
search_images2 fields changed- changed
Input schema / properties / queries / descriptionPrevious value: -"Multiple subject queries (one per image slot) to run in parallel — recommended for a page with 2+ images so each only costs ONE round-trip."New value: +"Several subject queries (typically one per image slot), run in parallel in one call." - changed
Input schema / properties / query / descriptionPrevious value: -"Single subject query — backward-compat. Prefer `queries` when the page needs 2+ images."New value: +"Single subject query; returns the full result."
- Changed
update_page4 fields changed- changed
Input schema / properties / base_version / descriptionPrevious value: -"The source_version get_page returned for this page. When it no longer matches the live page the save is REJECTED instead of reverting whatever was edited in the Webcake editor meanwhile. Optional — omit it and the server uses the version it recorded on your last read/write of this page."New value: +"The page's source_version as returned by get_page. When it no longer matches the live page, the save is rejected rather than reverting edits made in the Webcake editor meanwhile. Optional — when omitted, the server uses the version it recorded at this session's last read or write of the page." - changed
Input schema / properties / draft_id / descriptionPrevious value: -"A draft_id from a previous update_page call (dry_run=true or a timed-out/failed update). Loads the cached source — no need to re-send the full JSON. Use for dry-run → real call transitions and retrying after a timeout."New value: +"A draft_id from a previous update_page call (dry_run=true or a timed-out/failed update). Loads the cached source, so the full JSON is not re-sent; covers the dry-run → real call step and retries after a timeout." - changed
Input schema / properties / force / descriptionPrevious value: -"Default false. true = save even when the page changed outside this session, discarding those changes. Only pass it after the user has said to."New value: +"Default false. true saves even when the page changed outside this session, discarding those outside changes." - added
Input schema / properties / source / anyOfAdded value: +[ + { + "additionalProperties": {}, + "type": "object" + }, + { + "type": "string" + } +]
- Changed
upload_images1 field changed- changed
Input schema / properties / organization_id / descriptionPrevious value: -"Organization whose media collection the images are filed into — REQUIRED when the account has 2+ orgs, and it must match the org the page is created in. Omit only to use WEBCAKE_ORG_ID / x-webcake-org-id, or to auto-select when the account has exactly ONE org; with 2+ orgs and none given the call returns reason:'organization_required' with the org list. Ignored when there are no credentials (public CDN fallback)."New value: +"Organization whose media collection receives the images — normally the organization the page lives in. Optional when WEBCAKE_ORG_ID / x-webcake-org-id is set or the account has exactly one organization; with two or more and none given, the result is reason:'organization_required' with the organization list. Ignored without credentials (public CDN fallback)."
- Changed
validate_page2 fields changed- added
Input schema / properties / page / anyOfAdded value: +[ + { + "additionalProperties": {}, + "type": "object" + }, + { + "type": "string" + } +] - added
Input schema / requiredAdded value: +[ + "page" +]
2 tool updates
v1.5.2- Changed
patch_page1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Default false. Only meaningful when committing an 'update' draft: true saves the cached snapshot even though the page changed outside this session, discarding those changes. A page_id patch never needs it — it merges into the tree it just read.", + "type": "boolean" +}
- Changed
update_page2 fields changed- added
Input schema / properties / base_versionAdded value: +{ + "description": "The source_version get_page returned for this page. When it no longer matches the live page the save is REJECTED instead of reverting whatever was edited in the Webcake editor meanwhile. Optional — omit it and the server uses the version it recorded on your last read/write of this page.", + "type": "string" +} - added
Input schema / properties / forceAdded value: +{ + "description": "Default false. true = save even when the page changed outside this session, discarding those changes. Only pass it after the user has said to.", + "type": "boolean" +}
23 tool updates
v1.5.0- First observed
add_section - First observed
create_page - First observed
find_pages - First observed
get_element - First observed
get_generation_guide - First observed
get_icon_svg - First observed
get_page - First observed
get_page_schema - First observed
ingest_html - First observed
ingest_url - First observed
layout - First observed
list_elements - First observed
list_organizations - First observed
list_pages - First observed
new_element - First observed
new_page_skeleton - First observed
patch_page - First observed
publish_page - First observed
render_preview - First observed
search_images - First observed
update_page - First observed
upload_images - First observed
validate_page
TDQS
Scored across 23 tools
Most tools target a clearly distinct resource+action, and the verbose descriptions explicitly clarify boundaries (e.g. update_page replaces the whole source while patch_page edits by element id, add_section appends). A few adjacent pairs create mild overlap — list_pages vs find_pages, and the validate_page step that is already embedded in create/update/publish — but an agent can still tell them apart.
The surface is overwhelmingly consistent snake_case verb_noun (get_page, create_page, update_page, publish_page, ingest_url, search_images). Minor deviations: 'layout' is a bare noun, 'new_element'/'new_page_skeleton' use 'new' instead of 'create', and 'search'/'find' are used for the same lookup concept — readable but not perfectly uniform.
23 tools is on the heavy side and sits in the 16-25 'feels heavy' band, but the domain (ingest, build, validate, layout, media, icon, publish lifecycle) is genuinely broad and each tool maps to a distinct capability with little redundancy. Slightly over-scoped rather than bloated.
Strong lifecycle coverage: create, read (get/list/find), update, patch, add_section, validate, publish, plus ingest and asset tooling. The notable gap is deletion — there is no delete_page or unpublish tool, so cleanup/lifecycle teardown is a dead end that agents cannot reach.
Maintenance
Related MCP Connectors
Build and edit landing pages and websites from your AI assistant, and pull how they are performing.
- PagereeOAuthcom.pageree
Build, publish, capture leads from, measure and improve landing pages from your AI assistant.
Build, edit, and publish Biver landing pages, products, orders, and leads from AI assistants.
Build, edit, and publish real websites and online stores by chatting with your AI assistant.
Related MCP Servers
AlicenseAqualityDmaintenanceEnables AI assistants to build complete, live websites from natural language descriptions by connecting to Buildez.ai.18 npm1MIT- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with web applications through DOM inspection, user interaction simulation, and application state management.MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI coding agents to plan, build, and review websites and product interfaces with a persistent, user-led process, including design direction, component contracts, and implementation review.-
- AlicenseBqualityAmaintenanceEnables AI assistants to build, validate, and publish storefront pages to WebCake/StoreCake sites based on natural language descriptions.131534 npm4MIT