WebCake Storefront

io.github.vuluu2k由 GitHub 账号 vuluu2k 发布v1.38.0更新于 Nov 5, 2026

Build pages and manage products, orders, and content on the WebCake/StoreCake storefront builder.

已验证Streamable HTTP可网页运行效率与工作流开发者工具商业与电商

概览

AI 生成的概览

让 AI 助手构建和编辑 WebCake/StoreCake 店铺页面,并管理线上店铺的商品、订单、内容与代码。

可以做什么
  • 用 BuilderX 元素组合并校验店铺页面,然后创建和发布
  • 查看和修改页面源码、单个元素、多语言内容、自定义 CSS/JS 与全局区块
  • 创建和管理 CMS 文件与 HTTP 函数,运行、调试并回滚到已保存版本
  • 浏览和查询数据集合、商品、订单、博客内容等店铺数据
  • 查看连接上下文、列出并切换站点、更新登录凭据
适用场景
适合经营 WebCake/StoreCake 店铺、希望助手代劳生成或改版页面、做局部元素修改,或读取与修改商品、订单、数据集合等店铺数据的场景,无需手写页面 JSON。
运行要求
可通过 npx 在本机运行(需 Node.js 18+),也可自建 Streamable-HTTP 端点。需要 WebCake 账号及 WEBCAKE_TOKEN(Bearer JWT)和 WEBCAKE_SESSION_ID,或使用 OAuth 连接流程 / x-webcake-jwt 请求头。WEBCAKE_ENV 选择 prod、staging 或 local 地址。可选 PEXELS_API_KEY 用于图片搜索。
安装前请注意
令牌和会话 ID 属于个人凭据;带 ?jwt= 的链接应视同密码,并在生产环境使用 HTTPS。许多工具会写入线上站点——页面、自定义代码、CMS 文件、数据集合、商品以及发布——建议保持确认模式并先用 dry-run 预览。凭据和站点选择会保存在本地配置文件中。

安装

在 SourceWeft 中

  1. 打开 控制台中的 WebCake Storefront,将其添加到工作区。
  2. 连接 所需的 凭据。它们会被私密存储,绝不会在公开页面上展示。
  3. 为需要使用其工具的对话启用该服务。

Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。

交给智能体安装

把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。

阅读 https://sourceweft.com/mcp/io.github.vuluu2k%2Fwebcake-storefront-mcp/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。

查看智能体所依据的安装指南

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。 客户端会在首次连接时完成 OAuth 登录。

{
  "mcpServers": {
    "webcake-storefront": {
      "type": "http",
      "url": "https://store.toolvn.io.vn/mcp"
    }
  }
}

README

[WebCake Storefront MCP]

WebCake Storefront MCP

English · Tiếng Việt

[npm version] [npm downloads] [GitHub stars] [MCP]

Describe a store page in plain words — your AI builds it, validates it, and publishes it to your WebCake storefront.

⭐ If this saves you an afternoon of dragging blocks around, give it a star — every star keeps a solo project alive.

"Build a page for my coffee shop — a hero with a Shop Now button, a product grid, and an order form. Save it and publish."

…and a real, editable page appears on your WebCake/StoreCake site. No dragging blocks, no learning the schema, no hand-writing JSON.


🧩 How it works

This server is the bridge between your AI assistant and your storefront. The AI never guesses what a page looks like — it asks this MCP, which knows the entire BuilderX component model, validates the result, and saves it.

text
   You              AI assistant          webcake-storefront MCP          WebCake / StoreCake  ┌──────┐  prompt  ┌────────────┐  tools ┌───────────────────────┐  API ┌──────────┐  │ idea │ ───────► │  Claude /  │ ─────► │ • knows the BuilderX  │ ───► │  a real  │  │      │          │  Cursor /  │        │   component model     │      │ editable │  │      │ ◄─────── │  Windsurf  │ ◄───── │ • builds + validates  │ ◄─── │  page on │  └──────┘ live URL └────────────┘ result │ • saves + publishes   │      │ your site│                                          └───────────────────────┘      └──────────┘
  1. You ask in plain language — goal, brand, sections, products, form fields.
  2. The AI learns the model from the MCP: the element catalog, the CSS-grid layout, the breakpoints — so it builds a real storefront page, not a guess.
  3. It assembles + validates the { sections: [...] } page source. validate_page catches duplicate ids, broken grids, and form fields without a name before anything is saved.
  4. It saves to your site — dry-run preview first, then for real — and publish_site makes it live.
  5. You get the preview URL — open it, tweak in the editor, done.

Why it's reliable

📚 Knows the real modelServes 130+ BuilderX component types (text, image, button, form, product grid, cart, countdown, gallery…) ported straight from the builder's own factory — the exact same shapes the editor produces.
✅ Validates before savingStructural checks (unique ids, valid grid, form fields with names, working event targets) so the page isn't broken when it lands.
🛡️ Safe by defaultEvery write is dry-run first — preview the change, nothing touches your site until you confirm.
✏️ Edits surgicallyAsk for one change ("make the CTA green") and it edits only that element — every other id, style, and block stays exactly as it was.

💡 Selling COD or online? It speaks the full commerce model too — products, variations, cart, orders, promotions, combos.


✨ What you can build

One sentence to your AI → a finished, editable storefront page:

Just say…
🛒 Product page"A one-product page for my skincare serum — gallery, price, an order form with cart."
🏬 Storefront home"A homepage — hero banner, featured product grid, a newsletter form."
⚡ Flash sale"A flash-sale page — big countdown, discounted product grid, a sticky Buy button."
🎟️ Event / webinar"A registration page — countdown, agenda, a sign-up form."
💌 Invitation"A wedding invite — names, date, a map, an RSVP form."
📰 Blog / content"A blog index with featured posts and a subscribe box."
🔗 Link-in-bio"A link-in-bio — avatar, short bio, 5 link buttons, socials."

…then "make the CTA green" or "add a 4th feature" and it edits only that block.

🤖 Works in Claude Desktop, Claude Code, Cursor, Windsurf, VS Code, or any MCP-capable client — and the build guide + element catalog tools need zero backend calls, so you can explore the model before pasting a token.


Under the hood

An MCP (Model Context Protocol) server that teaches AI agents the WebCake/StoreCake storefront builder (BuilderX) component model and connects them to the backend. The AI produces the full { sections: [...] } page source; build_page creates the page and saves it, and publish_site makes the whole site live.

Beyond page authoring, it exposes your real store: pages & custom code, products, orders, collections, blog articles, promotions, combos, themes, customers, and automation — ~280 tools in total.

MethodBest forAuth
npx (local) — runs on your machinePersonal daily use, full controlbrowser login, or a token + session
Remote (serve) — self-host Streamable-HTTPTeams, the claude.ai dialog, always-on?jwt= link / x-webcake-jwt header

The build + catalog tools (get_build_guide, list_elements, get_element, new_section, validate_page) work with zero config; everything that reads or writes your site needs a token + session.


🚀 Get connected

Pick one. Both hand your AI tool the full storefront toolkit. No coding.

① npx — runs on your machine (recommended)

Zero install, always the latest version, needs Node.js 18+. One line connects your account and configures your AI apps:

bash
# Opens the browser — click Connect, your installed IDEs are configured (prod)npx -y webcake-storefront-mcp install
# Developers only — step by step: environment, login or token, IDE(s)npx -y webcake-storefront-mcp install --dev
# Scripts and CI — every supported IDE, even ones not installed yetnpx -y webcake-storefront-mcp install --ide all --token <token> --session <session-id>
# Remove the server from every IDE confignpx -y webcake-storefront-mcp uninstall

install asks nothing. It connects to production, opens your browser so you can click Connect, then adds the server to every AI app it finds on this computer. Your other servers are kept, and any config file it changes is backed up next to the original as <file>.webcake-storefront-backup. No AI app found? It says so and exits with an error: install one and run it again, or name it with --ide.

Need staging or local? --dev opens the step-by-step wizard, or skip it with --env staging / --env local.

Installed with an older version? Run install again. Older versions wrote VS Code's config under the wrong key, so the server never appeared there, and registered Claude Code for the current folder only.

Targets for --ide: claude-desktop, claude-code, cursor, windsurf, vscode, codex, antigravity, gemini, cline, kiro, opencode, or all. Just want to run the server (configure by hand)? npx -y webcake-storefront-mcp.

② Reconnect your account — no token copy/paste

bash
npx -y webcake-storefront-mcp login

install already does this the first time. Use login when your token expires: it opens the builder's connect page, you click Connect, and your token + session are saved locally and picked up automatically.

Remote URL — self-hosted, nothing per-client to install

bash
npx -y webcake-storefront-mcp serve --port 8787

Then point any client at http://<host>:8787/mcp?jwt=<TOKEN> (clients that support headers can send x-webcake-jwt instead; pick the site in chat with switch_site). Server-side secrets like PEXELS_API_KEY live on the host — handy on a VPS.

⚠️ A ?jwt= link contains your personal token — treat it like a password and use HTTPS in production.


⚙️ Configuration

Two values are required: WEBCAKE_TOKEN (Bearer JWT) and WEBCAKE_SESSION_ID (sent as x-session-id). You pick the site at runtime — just ask in chat and the AI calls list_my_sites / switch_site (your choice is saved and reused next session), so no WEBCAKE_SITE_ID is needed.

Base URLs come from a named environment — set WEBCAKE_ENV (or --env) and you never type a URL:

WEBCAKE_ENVapiapp (login)preview
localhttp://localhost:24679http://localhost:5173demo.localhost:24679/<siteId>
staginghttps://api.staging.storecake.iohttps://staging.webcake.iostaging2.webcake.me/<siteId>
prod (default)https://api.storefront.webcake.iohttps://webcake.io<site_slug>.webcake.me

Override a preset with WEBCAKE_API_URL / WEBCAKE_APP_URL. Optional, configured server-side: PEXELS_API_KEY (search_images). Token / session / site can also be set in chat via update_auth and switch_site — saved to a local config file at ~/.webcake-storefront-mcp/.

How to get your token + session
  1. Open the WebCake builder and log in.
  2. Open DevTools (F12) → Network tab → click any API request.
  3. In Request Headers: Authorization: Bearer … → WEBCAKE_TOKEN; x-session-id: … → WEBCAKE_SESSION_ID.
  4. No site id needed up front — in chat, run list_my_sites then switch_site to choose the site (remembered next time).

🧰 The tools at a glance

~280 tools. The headline group builds pages; the rest read and edit your live store.

GroupToolsNeeds
Build a pageget_build_guide · list_elements · get_element · new_element · new_section · new_page_skeleton · validate_page · build_page · add_sectioncatalog tools: nothing
Media & ingestsearch_images (Pexels) · upload_images (CDN) · ingest_html · ingest_url (recreate a reference page)—
Pages & codelist_pages · get_page_source · search_page_elements · get_page_element · update_page_element(s) · create_page · update_page · update_page_source · custom CSS/JS · page contents · global sections · publish_sitetoken + session
Commerceproducts · orders · collections · promotions · combostoken + session
Content & storeblog articles · themes / site style · apps · customers · send_mailtoken + session
Backend codeHTTP-function CRUD (get_http_function, edit_http_function, run_function, debug_function…)token + session
Contextget_current_context · list_my_sites · switch_site · update_auth · toggle_confirm_modetoken
Site plansget_site_subscription (current plan, status, days left) · count_my_sites (by plan / custom domain / trash) · list_planstoken

Every write defaults to dry_run=true — it previews the exact change and only touches your site when you re-run with dry_run=false.

💬 Suggested prompt

Build me a WebCake storefront page for <brand/offer>. Use the webcake-storefront MCP: call get_build_guide, list_elements, build the sections with new_section, validate_page until zero errors, then build_page (dry-run first) and publish_site.


⭐ Like the idea? Drop a star

This is a solo, open-source project — every ⭐ genuinely keeps it moving and helps other builders find it.

  • ⭐ Star the repo — 2 seconds, huge motivation.
  • 🐛 Open an issue — a bug, a missing component, or just an idea.
  • 🔁 Share it with anyone still building store pages block by block.

[Star History Chart]

Built with ❤️ for the WebCake community. Thanks for being here.

来源:README.md,提交 3946f59

工具

132

get_intake_guide

Get the INTAKE questionnaire + build flow to run BEFORE creating a new site/store/page. Call this at the start of any fresh build: ask the user this one short batch (plain words, with defaults), restate the plan, get a yes, THEN build. Skip only for tiny edits, data questions, or when the user already gave the brief / says 'just do it'.

无需输入参数。

get_current_context

Show current connection context: which site_id, API URL, session, and account info. Call this first to confirm you're working on the right site

无需输入参数。

list_my_sites

List the current account's PERSONAL sites (team sites are not included). Use this to find a site_id before switching. filter: "all" = active sites (default), "removed" = sites in trash. Each site has status, published_at (set at creation — not proof of publishing), slug, primary domain and has_custom_domain (verified, live, non-default domain). For plans use get_site_subscription / count_my_sites.

输入参数pagetermlimitfilter

create_site

Create a brand-new storefront site for the current account, then (by default) switch to it and return an EMPTY, CLEAN site (no sample products/categories) ready for element composition. The backend auto-seeds off-theme sample products + categories (and a sample blog); by default this tool DELETES that seed right after creating the site (keep the non-deletable default "All" category) so you start from a blank, on-theme store. Pass keep_seed:true to keep the sample data. The site has NO pages — after this, compose a homepage from elements: get_build_guide → new_section/new_element → build_page (type:'main', is_homepage:true). Note: free accounts are limited to 4 sites (creation fails with a quota error past that).

输入参数name必填slug必填keep_seedswitch_to

switch_site

Switch to a different site by site_id. All subsequent tool calls will target the new site. The choice is saved to local database — next session will auto-connect to this site. Use list_my_sites first to find the site_id

输入参数site_id必填

update_auth

Update authentication credentials. All values are saved to local database — next session auto-restores them. Get token and session_id from browser DevTools → Network tab → copy from any API request headers

输入参数tokenapi_urlsession_id

toggle_confirm_mode

Toggle update confirmation mode. Controls whether update tools ask for user confirmation before saving. - "always_confirm" (default): Shows diff first, requires user approval before saving. Safer. - "auto_apply": Applies changes immediately without preview. Faster but riskier. Current mode is saved to database and persists across sessions. Call this tool when the user says things like: → "tự động xác nhận" / "auto confirm" / "không cần hỏi" / "don't ask" / "apply directly" → mode: "auto_apply" → "hỏi trước khi lưu" / "luôn hỏi" / "always ask" / "confirm before saving" / "xác nhận trước" → mode: "always_confirm"

输入参数mode必填

list_cms_files

List all CMS files (HTTP functions, cron jobs, ...) for the site

无需输入参数。

create_cms_file

Create a new CMS file. Types: "http_function", "jobs_config", "default"

输入参数name必填typecontent必填

update_cms_file

Update the code content of an existing CMS file

输入参数id必填namecontent必填

get_http_function

Get the main HTTP function file. Choose the right mode for your task: - overview=true: function names + line ranges only, NO code body. Use for: browsing, understanding structure, finding which function to read. - overview=false (DEFAULT): full code + collection schemas. Use for: writing new features, refactoring, understanding full context. Tip: for small fixes, use overview first then get_http_function_snippet to read just that function. Add include_guide=true on first call to get the coding guide

输入参数overviewinclude_guide

get_http_function_snippet

Read specific function(s) by name. Much more token-efficient than reading the full file

输入参数function_names必填

edit_http_function

Edit the HTTP function file by function name — best for targeted changes (fix a bug, rename, add one function). For writing multiple new functions or major refactors, use update_http_function with full content instead. Actions: - "replace_function": replace an ENTIRE function by name with new code. Server finds function boundaries automatically. - "add": append new function code at end of file. - "remove": remove a function by name. - "update_imports": replace the import block (lines before first export). Returns updated function list after edit.

输入参数codeaction必填function_name

update_http_function

Write the FULL HTTP function file content. Best for: writing new features, major refactors, or changes that touch multiple functions. For small targeted edits (fix one function, add one function), use edit_http_function instead. After update, auto-deploys to the bundle service

输入参数content必填

run_function

Run a deployed HTTP function. function_name excludes method prefix. Example: "get_Products" → function_name="Products", method="GET"

输入参数methodparamsfunction_name必填

debug_function

Run JS code in debug mode (without deploying). Returns execution result and console logs

输入参数paramscontent必填function_name必填

save_file_version

Save a version snapshot of a CMS file for rollback

输入参数content必填is_publiccms_file_id必填

get_file_versions

View version history of a CMS file. Each version includes its saved content — to restore, pass that content back to update_http_function (the http_function file) or update_cms_file, or use restore_file_version.

输入参数cms_file_id必填

restore_file_version

Roll a CMS file back to a saved version in one step: reads the version's content and writes it back to the file. Omit version_id to restore the most recent snapshot. Tip: save_file_version on the current content first if you want an undo point.

输入参数version_idcms_file_id必填

toggle_debug_render

Toggle debug render mode for a CMS file

输入参数cms_file_id必填

list_pages

List all pages of the site (metadata only, without source)

无需输入参数。

get_page_source

Get page source overview: section count, element type counts, and all custom CSS classes. Use this first, then use search_page_elements to find specific elements

输入参数page_id必填

search_page_elements

Search/filter elements within a page source. Returns matching elements with full detail (id, type, style, text, classes, etc.). Examples: - Find all buttons: type="button" - Find elements with custom class: custom_class="hero" - Find text containing "subscribe": text="subscribe" - Find all data-bound elements: has_bind=true - Find all elements with events: has_events=true - Find all elements with custom CSS classes: has_custom_class=true

输入参数idtexttypelimitpage_id必填has_bindhas_eventscustom_classhas_custom_class

create_page

Create a new (empty) page. For a page with content use build_page instead. type is a KIND (main/store/member/blog/custom/error/maintain) mapped to the numeric backend type; pass seo so it doesn't publish with an empty title. ONE page per site for main (homepage) / error / maintain, and slugs are unique per site — a duplicate is refused with the existing page_id to edit instead; only 'custom' pages can be created over and over.

输入参数seoname必填slug必填typeis_homepage

update_page

Update page properties: name, slug, homepage, SEO ("Cài đặt SEO") and settings. seo / settings are MERGED into the page's current settings — fields you don't pass are kept.

输入参数seonameslugpage_id必填settingsis_homepage

get_site_custom_code

Get custom code of the site (CSS/JS). Two modes: - Default: returns ALL 4 code fields (full content) - With field filter: returns only the specified field(s) — saves tokens when you only need CSS or JS Add include_guide=true on first call to get the coding guide. Custom code is the last resort: see get_build_guide → NATIVE FIRST before adding any. All-fields reads include _budget (usage vs limits).

输入参数fieldsinclude_guide

update_site_custom_code

Update custom code (CSS/JS) for the entire site. Only sends fields you specify — others remain unchanged. LAST RESORT: use native elements, their settings or an app first; a special feature uses the CMS app (collection + HTTP function) with only a small glue script here. See get_build_guide → NATIVE FIRST. Oversized code or UI/data in code is refused unless native_gap explains why. IMPORTANT: Before calling, you MUST read existing code with get_site_custom_code first, then show the user what will change and get explicit confirmation. NEVER update without user approval. - code_before_head: HTML/script inserted before </head> - code_before_body: HTML/script inserted before </body> - code_custom_css: Custom CSS (auto-wrapped in <style>) - code_custom_javascript: Custom JavaScript

输入参数native_gapallow_shrinkcode_custom_csscode_before_bodycode_before_headcode_custom_javascript

append_site_custom_code

Append or prepend code to a custom code field. LAST RESORT: use native elements, their settings or an app first; a special feature uses the CMS app (collection + HTTP function) with only a small glue script here. See get_build_guide → NATIVE FIRST. Oversized code or UI/data in code is refused unless native_gap explains why. For full rewrites, use update_site_custom_code instead.

输入参数code必填field必填positionnative_gap

delete_page

Delete a page

输入参数page_id必填

get_page_versions

View version history of a page

输入参数page_id必填

list_page_contents

List multi-language contents (translations) of the site's pages and global sections. Pass page_id + language_code to read one page's translation.

输入参数page_idlanguage_code

update_page_content

Create/update page content for a specific language. IMPORTANT: Before calling, you MUST read existing content with list_page_contents first, then show the user what will change and get explicit confirmation. NEVER update without user approval.

输入参数content必填page_id必填meta_tagslanguage_code必填

get_page_element

Get full detail of a single element by its ID (e.g. 'TEXT-3', 'BUTTON-1', 'SECTION-2'). Returns style, config, specials, events, bindings, responsive, and children IDs

输入参数page_id必填element_id必填

update_page_element

Update properties of a specific element in page source. Two-step process: STEP 1: Call with dry_run=true (default) → returns diff of what will change. STEP 2: Show the diff to the user and ask for confirmation. NEVER proceed without explicit user approval. STEP 3: Only after user confirms, call again with dry_run=false to apply. IMPORTANT: You MUST show the diff to the user and get explicit "yes/ok/confirm" before calling with dry_run=false. Skipping confirmation risks data loss. Merge rules: style/config/specials = shallow merge, responsive = merge by bp key. events/bindings = REPLACE the whole array — pass the COMPLETE list (read it first with get_page_element so you don't drop the others); entries are auto-normalized (id + eventName filled in, so you can pass just { action, ...fields } / { target }).

输入参数styleconfigeventsdry_runpage_id必填bindingsspecialselement_id必填responsiveallow_shrink

update_page_elements

Batch update multiple elements in one page. Two-step process: STEP 1: Call with dry_run=true (default) → returns per-element diff. STEP 2: Show all diffs to the user and ask for confirmation. NEVER proceed without explicit user approval. STEP 3: Only after user confirms, call again with dry_run=false to apply. IMPORTANT: You MUST show the diff to the user and get explicit "yes/ok/confirm" before calling with dry_run=false. Skipping confirmation risks data loss. Same merge rules: style/config/specials = shallow merge, events/bindings = replace.

输入参数dry_runpage_id必填updates必填allow_shrink

update_page_source

Directly update the full page source JSON. IMPORTANT: Before calling this tool, you MUST: 1. Read existing source with get_page_source first 2. Show the user what will change and get explicit confirmation 3. NEVER call without user approval — this replaces the ENTIRE page source Safeguarded: blocks if new source is <50% of existing size.

输入参数sourcepage_id必填native_gapcustom_codeallow_shrink

list_collections

List all database collections (tables) for the site. Returns collection names, table names, and field counts. Use get_collection for full schema details

输入参数pagetermlimit

get_collection

Get a specific collection's details including full schema (field names, types, constraints, references) and records

输入参数id必填

query_collection_records

Query records from a collection (custom data table) by table name. Supports paging + an optional `where` filter and `order_by` sort. (Uses the CMS api-key auth the records endpoint requires.)

输入参数pagelimitwhereorder_bytable_name必填

create_collection

Create a new collection (custom data TABLE). It starts with the system columns (id/inserted_at/updated_at/creator_id); pass `columns` to add custom fields. NOTE: to WRITE records into it, use an HTTP function (webcake-data: db.model(table).create({...})) — the dashboard has no direct record-insert API. See get_http_function for the SDK guide.

输入参数name必填columnstable_name

update_collection_columns

Add or change a collection's custom columns. Reads the current schema, then PATCHes it with the system columns + your custom columns (the PATCH replaces the whole schema, so omitting a column drops it).

输入参数columns必填collection_id必填

delete_collection

Delete a collection (table) and all its records by id. Irreversible.

输入参数collection_id必填

list_articles

List blog articles (metadata only, without HTML content). Use get_article for the full content. Pass term to search by title/slug. Pass category_id to list the posts filed under one blog category — that view is the public one, so hidden posts and posts scheduled in the future are left out.

输入参数pagetermlimitcategory_id

get_article

Get article details by ID (includes the full HTML content)

输入参数id必填

create_article

Create a blog article so blog/post pages (post-list, grid-blog, post-overlay) have content. Built via the dashboard command pipeline: title + optional summary, HTML content, image URLs, and category linkage. Pass category_ids from create_blog_category / list articles' categories so the post shows up under those categories (it is also auto-filed under the default category). Image URLs must be hosted (search_images / upload_images). The backend generates the id and slug. SEO: set it afterwards with update_article({ id, seo }).

输入参数name必填imagescontentsummarycategory_ids

update_article

Update a blog article. Only the fields you pass are changed — each one becomes a command in the same dashboard pipeline create_article uses. NOTE: renaming regenerates the slug, so pass slug in the SAME call if you want a custom one (it is applied after the rename).

输入参数id必填seonameslugtagsimagescontentsummaryis_hiddencategory_idspublished_atremove_category_ids

delete_article

Delete blog articles (soft delete — they disappear from the site)

输入参数idids

list_customers

List/search the site's customers (browse or segment). Pass `term` to search by name/phone/email. Returns name, phone, email, order_count, purchased_amount, reward_point, tags, last_order_at. Use find_customer for an exact id/phone/email lookup.

输入参数pagetermlimit

find_customer

Find a customer by ID, phone number, or email

输入参数by必填value必填

list_products

List products of the site (metadata only: id, name, slug, price, image, status). Use get_product for full details

输入参数pagetermlimit

get_product

Get full product details by ID: name, description, price, variations, images, attributes, SEO, etc.

输入参数id必填

search_products

Search products by keyword. Returns matching products with basic info

输入参数pageterm必填limit

list_categories

List all product categories of the site

无需输入参数。

create_product

Create a product so the storefront has real merchandise (grid-product / slider-product bindings need this). Simple use: pass name + price (+ images, category_ids). One default variation with the price/stock is created for you. Advanced use: pass attributes (e.g. Color/Size) + variations for a multi-SKU product. Images must be HOSTED URLs — get them from search_images or upload_images first. The backend generates id, slug and publishes the product. SEO: set it afterwards with update_product({ product_id, seo }).

输入参数skuname必填pricestockimagesattributesvariationsdescriptioncategory_idsoriginal_priceshort_description

create_product_category

Create a product category (so grid-category / a category page has something to show, and products can be filed under it). Returns the new category id — pass it to create_product's category_ids. Image must be a hosted URL. SEO: set it afterwards with update_product_category({ id, seo }).

输入参数name必填imageparent_iddescription

create_blog_category

Create a blog/article category. Returns the new category id — pass it to create_article's category_id so posts are grouped (post-list / blog pages bind to it). Image must be a hosted URL. SEO: set it afterwards with update_blog_category({ id, seo }).

输入参数name必填imagedescription

update_blog_category

Update a blog/article category (name, description, image, slug, SEO). Pass id + fields to change.

输入参数id必填seonameslugimagedescription

update_product

Update an existing product. Pass product_id + only the fields to change. To change price/stock, pass variations (get_product first to see the existing variation shape). Images must be hosted CDN urls (search_images cdn_url / upload_images).

输入参数seonameimagesproduct_id必填variationsdescriptioncategory_idsis_published

set_product_published

Publish or unpublish one or more products quickly (without a full update).

输入参数product_ids必填is_published必填

delete_product

Delete one or more products by id.

输入参数product_ids必填

update_product_category

Update a product category (name, image, description, visibility, SEO). Pass id + fields to change.

输入参数id必填seonameimagehiddendescription

delete_product_category

Delete one or more product categories by id.

输入参数ids必填

list_orders

List orders of the site (metadata only). Use get_order for full details including items

输入参数pagelimitstatus

get_order

Get full order details by ID: customer info, items, payment, shipping, discounts, etc.

输入参数id必填

count_orders_by_status

Get order count grouped by status. Useful for dashboard overview

无需输入参数。

get_site_info

Get full site information: name, domain, settings (colors, typography, layout, language, payment methods, etc.) and preview_img — the latest homepage screenshots (1920_1080 desktop / 430_932 mobile), refreshed after publish_site.

无需输入参数。

list_themes

List all custom themes of the site. Returns theme name, colors, typographies, transitions, and which one is active

无需输入参数。

list_template_themes

Search/list the public Webcake template marketplace (api.storecake.io). Use to match customer brief against existing templates by keyword. Returns id, name, preview_url, thumbnail, categories

输入参数qlangpagelimit

semantic_search_themes

Semantic search across the theme marketplace using bge-m3 embeddings (cosine similarity). Use when the brief is a natural-language description of industry + features (e.g. 'website mỹ phẩm có popup minigame và loyalty'), not just keywords. Returns top matches with theme_id, score, name, preview_url, thumbnail, description_vi/en

输入参数limitquery必填

create_site_from_template

Create a NEW site from a marketplace TEMPLATE (the dedicated "use this template" API). Clones the template's pages, global sections, cart, popups, styles and fonts into a fresh site. Pick a template with semantic_search_themes / list_template_themes, then pass its theme_id here. Switches to the new site so you can immediately edit layout/content with update_page_element(s), colours/fonts via the site-style tools, then publish_site.

输入参数name必填slugtheme_id必填switch_to

list_apps

Which applications are installed / enabled on the site — and which are not — in ONE call. Returns installed[] (id, type, name, enabled) plus not_installed[] (app names). Do NOT call get_app per type to answer "which apps are on"; use get_app only for one app's settings. App type codes: 0=product_review, 1=articles_review, 2=automation, 3=telegram, 4=affiliates, 5=multilingual, 6=appointment, 7=send_email, 8=botcake, 9=sale_channel, 10=product_design, 11=auth_otp, 12=personal_product_design, 14=course, 15=zalo_mini_app, 16=cms, 17=recaptcha, 18=pwa.

无需输入参数。

get_app

Get one installed app by its type code (returns null if not installed). App type codes: 0=product_review, 1=articles_review, 2=automation, 3=telegram, 4=affiliates, 5=multilingual, 6=appointment, 7=send_email, 8=botcake, 9=sale_channel, 10=product_design, 11=auth_otp, 12=personal_product_design, 14=course, 15=zalo_mini_app, 16=cms, 17=recaptcha, 18=pwa. You may pass the number or the name.

输入参数type必填

install_app

Install (register) an application on the current site so its features become usable. For example, automations need the "automation" app installed first. App types: 0=product_review, 1=articles_review, 2=automation, 3=telegram, 4=affiliates, 5=multilingual, 6=appointment, 7=send_email, 8=botcake, 9=sale_channel, 10=product_design, 11=auth_otp, 12=personal_product_design, 14=course, 15=zalo_mini_app, 16=cms, 17=recaptcha, 18=pwa.

输入参数app必填is_active

uninstall_app

Uninstall (remove) an installed application from the current site. Pass the app's subscription id — get it from list_apps (the `id` field) or get_app.

输入参数id必填

update_app

Update an installed app's configuration. Pass the app subscription id and an `attrs` object that is merged onto the subscription — usually `{ settings: {...} }`, optionally `{ status }`. For the product-review app, prefer update_app_review (it also propagates shop_info).

输入参数id必填attrs必填

update_app_review

Update the product-review app's settings (e.g. shop_info, auto-approve, display options). Pass the review app's subscription id (get_app with type "product_review") and the full `settings` object.

输入参数id必填settings必填

list_promotions

List ALL promotions/discounts of the site (every page is fetched for you). Each row has id, name, type, is_activated, pos_id (non-null = linked/synced with POS), start/end time. The summary answers "how many promotions / how many synced with POS / how many active" in ONE call — do not call get_promotion per row for that. Use get_promotion only for one promotion's full rules.

输入参数include_guide

get_promotion

Get full promotion details by ID: name, type, schedule, discount rules, coupon settings, items, bonus products, etc.

输入参数id必填

get_promotion_items

Get products/variations/categories attached to a promotion. Returns items with discount details (fixed_prices, level_info, coupon_item_info)

输入参数id必填pagelimit

get_active_promotions

Get all currently active promotions (is_activated=true and within start_time/end_time range)

无需输入参数。

search_promotions

Search/filter ALL promotions (every page): by keyword, type, time status (coming_soon/in_progress/finished), active flag. Rows carry pos_id (non-null = synced with POS)

输入参数termtypestatusis_activated

list_combos

List all combo/bundle products of the site. Use get_combo_items for combo composition details

输入参数pagetermlimitinclude_guide

get_combo_items

Get items (products/variations) and bonus products that compose a combo. Returns combo_items (required items with count) and bonus_items (free gifts)

输入参数combo_product_id必填is_variation_bonus

list_global_sources

List global sources (cart, popup, etc.). Returns compact summary per source. Always provide component to filter by type — the API may not return all types without a filter.

输入参数component

get_source_cart

Get all cart global sources with compact tree view. Shows full element hierarchy — no need to call get_global_source_detail separately.

无需输入参数。

get_global_source_detail

Get full detail of a global source — compact tree view showing all elements. Each line: ID [type] "text" .class [events] [bindings] (children_count). Provide component for faster lookup; omit if you already called list_global_sources.

输入参数componentglobal_source_id必填

search_global_source_elements

Search/filter elements within a global source. No component param needed. Examples: - Find all buttons: type="button" - Find by class: custom_class="hero" - Find text: text="subscribe" - Data-bound only: has_bind=true - With events: has_events=true - With custom class: has_custom_class=true

输入参数idtexttypelimithas_bindcomponenthas_eventscustom_classglobal_source_id必填has_custom_class

get_global_source_element

Get full detail of a single element (style, config, specials, events, bindings, responsive, children).

输入参数componentelement_id必填global_source_id必填

update_global_source_element

Update a single element within a global source. Two-step process: STEP 1: Call with dry_run=true (default) → returns diff of what will change. STEP 2: Show the diff to the user and ask for confirmation. NEVER proceed without explicit user approval. STEP 3: Only after user confirms, call again with dry_run=false to apply. IMPORTANT: You MUST show the diff to the user and get explicit "yes/ok/confirm" before calling with dry_run=false. Skipping confirmation risks data loss. Merge rules: style/config/specials = shallow merge, responsive = merge by bp key. events/bindings = REPLACE the whole array — pass the COMPLETE list (read it first); entries are auto-normalized (id + eventName filled in).

输入参数styleconfigeventsdry_runbindingsspecialscomponentelement_id必填responsiveallow_shrinkglobal_source_id必填

update_global_source_elements

Batch update multiple elements in one global source. Two-step process: STEP 1: Call with dry_run=true (default) → returns per-element diff. STEP 2: Show all diffs to the user and ask for confirmation. NEVER proceed without explicit user approval. STEP 3: Only after user confirms, call again with dry_run=false to apply. IMPORTANT: You MUST show the diff to the user and get explicit "yes/ok/confirm" before calling with dry_run=false. Skipping confirmation risks data loss. Same merge rules: style/config/specials = shallow merge, events/bindings = replace.

输入参数dry_runupdates必填componentallow_shrinkglobal_source_id必填

create_global_source

Create a new global source component. Component types: "cart-droppable" (cart), "popup", or any custom type.

输入参数typesourcecomponent必填

update_global_source

Replace full source of a global source. IMPORTANT: Before calling this tool, you MUST: 1. Read existing source with get_global_source_detail first 2. Show the user what will change and get explicit confirmation 3. NEVER call without user approval — this replaces the ENTIRE source Safeguarded: blocks if new source is <50% of existing size. For element-level changes, prefer update_global_source_element instead.

输入参数sourceallow_shrinkglobal_source_id必填

delete_global_source

Delete a global source and its published version

输入参数global_source_id必填

get_global_source_contents

Get multilingual contents for global sources by component type

输入参数component必填

update_global_source_contents

Update multilingual contents (upsert). Each entry: global_source_id, language_code, content. IMPORTANT: Before calling, you MUST read existing contents with get_global_source_contents first, then show the user what will change and get explicit confirmation. NEVER update without user approval.

输入参数contents必填

list_global_sections

List reusable global sections (Header, Footer, shared content blocks) — SLIM summary only. Each entry: id, name, slot (header/footer/block), element count + type histogram + custom classes. The full element tree is large, so it is NOT returned here — drill in with get_global_section (compact tree), search_global_section_elements, or get_global_section_element.

无需输入参数。

get_global_section

Get one global section as a COMPACT tree (3-5x fewer tokens than raw JSON). Each line: ID [type] "text" .class [Nbind] [Nev] (children_count). Use this to learn how a real Header/Footer/block is composed before building your own.

输入参数rawglobal_section_id必填

search_global_section_elements

Search/filter elements within a global section (Header/Footer/block) without dumping the whole tree. Filter by type, id substring, custom_class, text, or has_bind / has_events / has_custom_class.

输入参数idtexttypelimithas_bindhas_eventscustom_classhas_custom_classglobal_section_id必填

get_global_section_element

Get full detail (style, config, specials, events, bindings, responsive bp1..bp4, children IDs) of a single element inside a global section.

输入参数element_id必填global_section_id必填

create_global_section

Create a reusable global section (Header / Footer / shared block) the way the builder does: persists a global_section record AND embeds the same section node into page sources so it actually renders across the site (header → top of every page, footer → bottom). Build the section first with new_section (give it a real bg/padding + logo/menu/links), then pass it here. Two-step safety: dry_run=true (default) previews which pages change; dry_run=false performs the atomic save.

输入参数name必填type必填dry_runsectionpage_ids

delete_global_section

Delete a global section (Header/Footer/block) and remove its node from every page source. Two-step safety: dry_run=true (default) shows which pages would change; dry_run=false performs the atomic save.

输入参数dry_runsection_id必填

read_cached_result

Read a slice of a large cached result produced by another tool (look for "cached":true + a cache_id in its output). Page through with offset/length; the response reports next_offset + remaining_chars until done.

输入参数lengthoffsetcache_id必填

list_cached_results

List the large results currently held in the session cache (id, label, size, age).

无需输入参数。

get_build_guide

Get the BuilderX page authoring guide: page shape, the grid layout model, styling, breakpoints, forms/data, and the build workflow. Read this before building or heavily editing a page.

无需输入参数。

get_page_schema

Get the authoritative JSON Schema (Draft 2020-12) for a page source `{ sections: [...] }` — the structural contract for every node (id/type/specials/runtime{style,config}/children/events/bindings) in the CSS-grid model. Use it as the shape to emit; validate_page enforces the semantic rules.

无需输入参数。

list_elements

List all BuilderX element/component types you can place on a page, grouped by category with a one-line summary and whether each is a container.

无需输入参数。

get_element

Get the full detail of an element type: category, container flag, summary, an ATTRIBUTES reference (the meaningful specials/config keys + their purpose/allowed values, events, and dataset binding targets), and a live skeleton node (the authoritative default shape) you can copy and edit. Read this before authoring/editing an element so you set the right keys.

输入参数type必填

list_events

List every interaction EVENT you can attach to a node: the triggers (eventName: click/hover/success/submit/…) and the actions (open_page, scroll_to, toggle, open_popup, add_to_cart, buy_now, phone_call, open_link, …) with the exact extra fields each action needs. Attach via new_element/new_section opts.events (ids are auto-minted, e.g. opts.events=[{ action:'add_to_cart', open_page:'cart' }]).

无需输入参数。

list_bindings

List every dynamic-data BINDING target: the datasets (product, cart_item, order, order_item, post, category, customer, customer_address, …) and their exact field names ('product::product_price', …), which page type each needs (store/member/blog), and how repeater children (grid-product, cart-items, post-list) bind per-item. Attach via new_element opts.bindings (ids auto-minted, e.g. opts.bindings=[{ target:'product::product_price' }]).

无需输入参数。

new_element

Build a single structurally-valid element node from the real builder factory. Returns the node — edit its specials/style, then place it in a section's children.

输入参数optstype必填

new_section

Build a complete section node with children laid out in the builder's vertical grid. Pass an array of element specs; each child is stacked top-to-bottom. Nest containers via the child's own 'children'. Example children: [{ "type":"text", "opts":{"text":"Welcome","style":{"fontSize":"40px"}} }, { "type":"button", "opts":{"text":"Shop now"} }]

输入参数childrensection_opts

new_row

Build a multi-column ROW container: children laid out SIDE BY SIDE (not stacked). This is how real pages build feature cards, category tiles, footer columns, a 2-col hero, etc. The row is RESPONSIVE — it auto-collapses to fewer columns on tablet/mobile (default tablet 2, mobile 1) so cards never become cramped slivers. Place the returned node as a child inside a section (section children still stack vertically; nest a row for horizontal layout). Example children: [{ "type":"container", "children":[{"type":"image","opts":{...}},{"type":"text","opts":{...}}] }, { ... }, { ... }]

输入参数row_gapchildrencollapsecol_widthscolumn_gapcontainer_opts

new_page_skeleton

Return an empty but valid page source: { sections: [] }. Add sections built with new_section, then save with build_page.

无需输入参数。

validate_page

Validate a page source ({ sections: [...] }). Returns errors (block saving: duplicate/missing ids, missing types) and warnings (unknown types, form fields without field_name, dangling event targets) plus stats. Always run this before build_page.

输入参数source

build_page

Create a brand-new page AND set its full content source in one step. Two-step safety: call with dry_run=true (default) to validate and preview, then dry_run=false to actually create + save. The source must be { sections: [...] } — build sections with new_section. Validation errors block the real save. ONE page per site for type main (homepage) / error / maintain, and slugs are unique per site: a duplicate is refused (dry_run reports blocked:true) and you get the existing page_id to edit instead. Only 'custom' pages can be created over and over.

输入参数seoname必填slug必填typesourcedry_runis_homepage

list_section_templates

Browse the designer-made section library (the editor's template picker): ready, styled blocks (hero, product showcase, testimonials, footer…) to start from instead of composing from scratch. No args → categories. With category_id and/or term → templates { id, name, thumbnail, kind }. Look at a thumbnail with invoke_tool('read_image', { url }), then insert a kind:"section" template with add_section({ page_id, template:{ category_id, id } }) and restyle it to the brand.

输入参数pagetermlimitcategory_id

add_section

Append a section to an EXISTING page's source. Reads the current source, appends your section, validates, and (when dry_run=false) saves. The section is re-id'd to avoid collisions. Pass a section built with new_section, OR template:{ category_id, id } to insert a library section (list_section_templates). Two-step safety: dry_run=true (default) previews; dry_run=false saves.

输入参数dry_runpage_id必填sectiontemplate

search_images

Search stock photos (Pexels) for a page/product. IMPORTANT: the storefront only renders images served from the WebCake CDN (image domains are whitelisted) — raw Pexels URLs will NOT display. By default this re-hosts each result on the WebCake CDN and returns a ready-to-use cdn_url (cached, so repeats are free). Use cdn_url for image src / product images. Requires the PEXELS_API_KEY environment variable.

输入参数query必填uploadper_pageorientation

upload_images

Convert external image URLs, data: URIs, or LOCAL FILE PATHS into site-hosted CDN URLs by reading/downloading each image and re-uploading it to the WebCake backend. Use this whenever the user supplies their OWN images (their URLs or files from their machine), or a page is built from a reference HTML/URL. The returned CDN URLs go straight into an image element's specials.src / runtime.config.src, or a product/category image. This is REQUIRED for any external image (incl. Pexels search results) because the storefront only renders whitelisted WebCake-CDN image domains. Results are cached per site, so re-uploading the same source is free. Processes up to 20 entries per call in parallel; non jpeg/png/webp inputs are converted to JPEG. UPLOADS BY DEFAULT (dry_run defaults to FALSE — this touches no account data): returns an "images" map (original source → hosted URL). Pass dry_run:true to only preview the entries that WOULD be processed (local paths report whether the file exists + its size) without any network/filesystem upload. Local file paths are only permitted when the MCP server runs locally (stdio); on the remote HTTP transport they are rejected per-entry.

输入参数urls必填dry_run

publish_site

Publish the whole site live — snapshots all current page sources into the live (published) version. Note: BuilderX publishes at the SITE level, not per page; publishing makes every saved page go live. Two-step safety: dry_run=true (default) describes what will happen; dry_run=false actually publishes.

输入参数dry_run

ingest_html

Parse reference HTML (e.g. a Google Stitch / Figma / Codex export) into a structural blueprint (title, headings, paragraphs, images, buttons, colour palette) you can rebuild as native BuilderX sections with new_section. Not a 1:1 clone. Rebuild every part native elements can do; use an embed only for a piece no element can (third-party widget, custom animation) — never paste the whole HTML into one (sandboxed iframe: no SEO, broken links, dead forms; rejected on save).

输入参数html必填

ingest_url

Fetch a public URL and parse it into a structural blueprint (see ingest_html). Note: client-rendered (React/Vue) pages may return little content.

输入参数url必填

start_page_draft

Start a page draft (no network). Build a multi-section page safely: cache each section with add_draft_section, then commit_page_draft persists it to the backend INCREMENTALLY (resumable on timeout). Use this instead of build_page for large/multi-section pages. The draft cache is DISPOSABLE (Redis on the remote server when REDIS_URL is set, in-memory otherwise; sliding ~2h TTL) — if a draft is ever lost, just re-send the sections, never a failure. ONE page per site for type main (homepage) / error / maintain, and slugs are unique per site: the draft is refused up-front with the existing page_id to edit instead. Only 'custom' pages can be created over and over.

输入参数seoname必填slug必填typeis_homepage

add_draft_section

Append ONE section to a local page draft (NO network — this is the durable per-section cache step that can't time out). The section is re-id'd to avoid collisions and quick-validated; warnings are surfaced but never block. Build the section with new_section.

输入参数sectiondraft_id必填

get_page_draft

Inspect a local page draft: its meta, the section ids, total section count, and (if a commit is in progress) the page_id + committed_count.

输入参数draft_id必填

list_page_drafts

List local page drafts for the current site (summaries only: id, name, slug, type, section count, commit progress, updated_at).

无需输入参数。

commit_page_draft

Persist a local page draft to the backend INCREMENTALLY (one section per request, 120s timeout each) so no single huge request can time out. dry_run=true (default) validates the assembled page and previews stats. dry_run=false creates the page then appends sections one at a time, saving progress after each. RESUMABLE: if a request fails mid-commit, the draft keeps its page_id + committed_count — just call commit_page_draft again to continue from where it stopped.

输入参数dry_rundraft_id必填

clear_page_draft

Delete a local page draft (does NOT delete any backend page already created from it).

输入参数draft_id必填

list_tool_groups

List every WebCake tool group, how many tools it has, and whether it is loaded natively or reached on-demand via search_tools + invoke_tool.

无需输入参数。

search_tools

Find WebCake tools by keyword across the FULL catalog — including capabilities NOT loaded natively (marketing/CRM, translations, media, appointments, affiliate, reviews, domains/SEO/shipping, brands/tags/ribbons, courses, sale channels, automation…). Returns name, group, description and JSON input schema. Then run one with invoke_read_tool (read-only) or invoke_tool.

输入参数grouplimitquery必填

invoke_read_tool

Run a READ-ONLY WebCake tool (list_*/get_*/search_*/count_*… — annotations.readOnlyHint in search_tools) by exact name with its arguments. Prefer this over invoke_tool for lookups. Refuses tools that change data.

输入参数name必填arguments

invoke_tool

Run any WebCake tool by exact name with its arguments (discover names + schemas via search_tools). Arguments are validated before running. For read-only tools prefer invoke_read_tool.

输入参数name必填arguments

版本历史

8
  1. v1.38.0最新Nov 5, 2026
  2. v1.37.0Nov 4, 2026
  3. v1.36.2Oct 29, 2026
  4. v1.36.0Oct 22, 2026
  5. v1.34.1Oct 14, 2026
  6. v1.32.0Oct 14, 2026
  7. v1.31.13Oct 9, 2026
  8. v1.31.11Sep 16, 2026

评分

已满足适用检查项的 100%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分