WebCake Storefront MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| WEBCAKE_ENV | No | Environment preset: local, staging, or prod (default). | prod |
| WEBCAKE_TOKEN | Yes | Bearer JWT token for authentication. | |
| PEXELS_API_KEY | No | Optional Pexels API key for image search. | |
| WEBCAKE_API_URL | No | Override the API base URL. | |
| WEBCAKE_APP_URL | No | Override the app base URL (for login). | |
| WEBCAKE_SESSION_ID | Yes | Session ID sent as x-session-id header. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_intake_guideA | 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_contextA | 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_sitesA | List all sites accessible by the current account. Use this to find a site_id before switching |
| create_siteA | 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). |
| switch_siteA | 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 |
| update_authA | 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 |
| toggle_confirm_modeA | Toggle update confirmation mode. Controls whether update tools ask for user confirmation before saving.
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" |
| list_cms_filesA | List all CMS files (HTTP functions, cron jobs, ...) for the site |
| create_cms_fileA | Create a new CMS file. Types: "http_function", "jobs_config", "default" |
| update_cms_fileC | Update the code content of an existing CMS file |
| get_http_functionA | Get the main HTTP function file. Choose the right mode for your task:
|
| get_http_function_snippetA | Read specific function(s) by name. Much more token-efficient than reading the full file |
| edit_http_functionA | 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:
|
| update_http_functionA | 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 |
| run_functionA | Run a deployed HTTP function. function_name excludes method prefix. Example: "get_Products" → function_name="Products", method="GET" |
| debug_functionA | Run JS code in debug mode (without deploying). Returns execution result and console logs |
| save_file_versionA | Save a version snapshot of a CMS file for rollback |
| get_file_versionsA | 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. |
| restore_file_versionA | 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. |
| toggle_debug_renderB | Toggle debug render mode for a CMS file |
| list_pagesA | List all pages of the site (metadata only, without source) |
| get_page_sourceA | 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 |
| search_page_elementsA | Search/filter elements within a page source. Returns matching elements with full detail (id, type, style, text, classes, etc.). Examples:
|
| create_pageA | 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. |
| update_pageC | Update page properties (name, slug, settings, custom code) |
| get_site_custom_codeA | Get custom code of the site (CSS/JS). Two modes:
|
| update_site_custom_codeA | Update custom code (CSS/JS) for the entire site. Only sends fields you specify — others remain unchanged. 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.
|
| append_site_custom_codeA | Append or prepend code to a custom code field WITHOUT reading the existing content first. Use this when you need to ADD new CSS rules, JS code, or script tags — no need to read first. For full rewrites, use update_site_custom_code instead. |
| delete_pageB | Delete a page |
| get_page_versionsB | View version history of a page |
| list_page_contentsC | List multi-language contents of a page |
| update_page_contentA | 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. |
| get_page_elementA | 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 |
| update_page_elementA | 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 }). |
| update_page_elementsA | 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. |
| update_page_sourceA | Directly update the full page source JSON. IMPORTANT: Before calling this tool, you MUST:
|
| list_collectionsA | List all database collections (tables) for the site. Returns collection names, table names, and field counts. Use get_collection for full schema details |
| get_collectionA | Get a specific collection's details including full schema (field names, types, constraints, references) and records |
| query_collection_recordsA | Query records from a collection (custom data table) by table name. Supports paging + an optional |
| create_collectionA | Create a new collection (custom data TABLE). It starts with the system columns (id/inserted_at/updated_at/creator_id); pass |
| update_collection_columnsA | 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). |
| delete_collectionA | Delete a collection (table) and all its records by id. Irreversible. |
| list_articlesA | List blog articles (metadata only, without HTML content). Use get_article to get full content |
| get_articleB | Get article details by ID |
| create_articleA | 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. |
| update_articleC | Update a blog article |
| delete_articleB | Delete a blog article |
| list_customersA | List/search the site's customers (browse or segment). Pass |
| find_customerA | Find a customer by ID, phone number, or email |
| list_productsA | List products of the site (metadata only: id, name, slug, price, image, status). Use get_product for full details |
| get_productA | Get full product details by ID: name, description, price, variations, images, attributes, SEO, etc. |
| search_productsB | Search products by keyword. Returns matching products with basic info |
| list_categoriesA | List all product categories of the site |
| create_productA | 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. |
| create_product_categoryA | 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. |
| create_blog_categoryA | 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. |
| update_productA | 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). |
| set_product_publishedA | Publish or unpublish one or more products quickly (without a full update). |
| delete_productB | Delete one or more products by id. |
| update_product_categoryA | Update a product category (name, image, description, or visibility). Pass id + fields to change. |
| delete_product_categoryB | Delete one or more product categories by id. |
| list_ordersA | List orders of the site (metadata only). Use get_order for full details including items |
| get_orderA | Get full order details by ID: customer info, items, payment, shipping, discounts, etc. |
| count_orders_by_statusA | Get order count grouped by status. Useful for dashboard overview |
| get_site_infoA | Get full site information: name, domain, settings (colors, typography, layout, language, payment methods, etc.) |
| list_themesA | List all custom themes of the site. Returns theme name, colors, typographies, transitions, and which one is active |
| list_template_themesA | 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 |
| semantic_search_themesA | 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 |
| create_site_from_templateA | 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. |
| list_appsA | List the site's installed applications (type, status, 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_appA | 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. |
| install_appA | 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. |
| uninstall_appA | Uninstall (remove) an installed application from the current site.
Pass the app's subscription id — get it from list_apps (the |
| update_appA | Update an installed app's configuration. Pass the app subscription id and an |
| update_app_reviewA | 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 |
| list_promotionsA | List all promotions/discounts of the site (metadata only). Use get_promotion for full details |
| get_promotionA | Get full promotion details by ID: name, type, schedule, discount rules, coupon settings, items, bonus products, etc. |
| get_promotion_itemsA | Get products/variations/categories attached to a promotion. Returns items with discount details (fixed_prices, level_info, coupon_item_info) |
| get_active_promotionsA | Get all currently active promotions (is_activated=true and within start_time/end_time range) |
| search_promotionsC | Search/filter promotions with advanced filters: by type, status (coming_soon/in_progress/finished), keyword, date range |
| list_combosA | List all combo/bundle products of the site. Use get_combo_items for combo composition details |
| get_combo_itemsA | Get items (products/variations) and bonus products that compose a combo. Returns combo_items (required items with count) and bonus_items (free gifts) |
| list_global_sourcesA | 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. |
| get_source_cartA | 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_detailA | 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. |
| search_global_source_elementsA | Search/filter elements within a global source. No component param needed. Examples:
|
| get_global_source_elementA | Get full detail of a single element (style, config, specials, events, bindings, responsive, children). |
| update_global_source_elementA | 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). |
| update_global_source_elementsA | 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. |
| create_global_sourceB | Create a new global source component. Component types: "cart-droppable" (cart), "popup", or any custom type. |
| update_global_sourceA | Replace full source of a global source. IMPORTANT: Before calling this tool, you MUST:
|
| delete_global_sourceA | Delete a global source and its published version |
| get_global_source_contentsB | Get multilingual contents for global sources by component type |
| update_global_source_contentsA | 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. |
| list_global_sectionsA | 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_sectionA | 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. |
| search_global_section_elementsA | 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. |
| get_global_section_elementA | Get full detail (style, config, specials, events, bindings, responsive bp1..bp4, children IDs) of a single element inside a global section. |
| create_global_sectionA | 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. |
| delete_global_sectionA | 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. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/vuluu2k/webcake-storefront-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server