mcpField
S
Store Builder

Store Builder

Local
github.comBusiness & Marketing1Updated 2w ago

About Store Builder

Store Builder is a stdio MCP server for AI agents to edit pages on a Store Builder site, bind real store data, preview results, and publish. Its tools span page building, media, themes, and store flows, while an API-operation index provides access to platform operations.

Key features

  1. 01Create and edit page structures
  2. 02Bind content to store data
  3. 03Render pages and inspect screenshots and defects
  4. 04Manage media, themes, and translations
  5. 05Publish pages and verify live results
  6. 06Access platform operations through an API index

Use cases

  1. 01Build product pages from store catalog data
  2. 02Review page layouts and fix visible defects
  3. 03Update a theme and publish pages
  4. 04Import site structure into draft pages

MCP support

As a stdio MCP server, it exposes 38 tools for AI agents to operate Store Builder sites. The tools cover page design, data binding, previews, and publishing.

Configuration

Local server config is the same for every client. Copy it into your client’s MCP config file.

mcp.json · Universal config
{
"mcpServers": {
"vuluu2k-sbuilder": {
"command": "npx",
"args": [
"-y",
"sbuilder-mcp"
],
"env": {
"SB_API": "<SB_API>",
"SB_TOKEN": "<SB_TOKEN>",
"SB_EMAIL": "<SB_EMAIL>",
"SB_PASSWORD": "<SB_PASSWORD>"
}
}
}
}
Run commandnpx -y sbuilder-mcp
Environment variables to set
SB_APIBase URL of the Store Builder API. Defaults to http://localhost:8080.
SB_TOKENSecretAn API key from the store's Agent app (Apps → AI agent → Create key). Opens both the partner API and the private site API for that one store.
SB_EMAILOptional. A platform account, only for account-level calls a key cannot make (listing sites, members, roles).
SB_PASSWORDSecretOptional. That account's password.

Local servers need a runtime on your machine (e.g. Node.js 18+). Config file locations differ by client; see your client’s docs.

Packages
npmsbuilder-mcp0.104.0

Tools

37

Saved tool list · updated 2w ago

ParameterTypeRequiredDescription
emailstringNo
passwordstringNo

Details

From the project README

sbuilder-mcp

An MCP stdio server that lets an AI agent operate a Store Builder site end to end — design its pages, fill them with real data, look at the result, and publish it — with no human clicking anything.

Tiếng Việt

Install

One command writes this server into every agent client on your machine:

npx -y sbuilder-mcp install --token wbk_… --api https://your-host --site site_…

It knows Claude Code, Claude Desktop, Cursor, Windsurf, VS Code and Codex, and installs into the ones it finds. Name them with --client cursor,codex, or rehearse with --dry-run. An option it does not know is refused, not ignored — a flag that silently does nothing is worse than one that does not exist.

--site is optional and worth passing: a key belongs to exactly one site, so it is written as SB_SITE and every tool then defaults to it. Without it the model has to carry the id through the session, which it can only get by listing pages and reading one back.

--site-name "Your Store" rides alongside it as SB_SITE_NAME. It is a label, never an address — nothing resolves by it — but it lets the agent say the store's name back to you instead of a 32-character id you did not choose. The Apps → AI agent screen appends it whenever the store has a name.

It merges: the servers already in those files stay, whatever it replaces is copied to <file>.sbuilder-backup, and a config it cannot parse is refused rather than overwritten — a file with a trailing comma is far likelier than one worth discarding, and it is what you need to fix it.

The store's Apps → AI agent screen hands you this command with the key already in it.

Or configure a client by hand
{
  "mcpServers": {
    "sbuilder": {
      "command": "npx",
      "args": ["-y", "sbuilder-mcp"],
      "env": { "SB_API": "https://api.your-host", "SB_TOKEN": "wbk_…", "SB_SITE": "site_…" }
    }
  }
}

Getting the key

Open your store, go to Apps → AI agent, and press Create key. That screen hands you the config block for your client with the key already in it — this whole section is what it saves you reading.

One key is all you need. It reaches both the partner surface (/api/v1) and the private site API, including the page document and the live-edit socket, and it is bounded three ways on every request: its own scopes, the live role of the member who created it, and the single store it belongs to.

SB_EMAIL + SB_PASSWORD remain optional, and buy exactly one thing: account-level calls — listing your sites, managing members and roles — which a key deliberately cannot make, because those mean "this person's account".

SB_API defaults to http://localhost:8080. Secrets are read from the environment only.

sb_media_upload's photo search needs no key here: it calls the platform's own GET /api/sites/{siteId}/images/search, which runs a rotated pool of provider keys behind the credential this server already holds. An operator enables it by setting PEXELS_API_KEYS on the SERVER (comma separated; free keys at https://www.pexels.com/api/). With none configured the search answers "unavailable" and tells the caller to find a photograph by its own means and pass the URL — which the platform then fetches server-side. There is deliberately no fallback provider in this client: one would put the very key the platform exists to hold back into every install.

Tools

ToolWhat it does
sb_connectLog in, list the sites this account can operate, report which credentials are present
sb_site_listList the sites this account can operate
sb_api_findFind API operations by intent — one line per match — then read one operation's call sheet by id: real parameter schemas, the credential it needs, and the body's fields read off the handler that decodes them, each carrying the trap its own doc comment records
sb_api_callExecute an operation, or any route by method+path; dry run by default. Field selection (dotted paths, on lists and single-object write answers) and local result pagination; merge for whole-record PUTs, If-Match, multipart file
sb_page_openOpen a page for editing and return its outline — or, with form_id, a form's field document (fields, defaults, dependent-field rules)
sb_outlineThe open page as a compressed tree — never a raw document dump; shared header/footer and overlays one line each unless chrome: true
sb_node_readOne node in full, with a warning if it is a shared global
sb_catalog_searchFind an element by what it should do, using the platform's own AI hints
sb_traits_forAn element's inspector — tabs, groups, controls and what each declared one writes — plus its AI hints, defaults and containment rules
sb_addAdd an element — or a whole nested subtree — in one call; a filter arrives with its option rows read from the catalogue
sb_setWrite style/config/specials. Per breakpoint by default
sb_moveMove a node to another parent
sb_removeRemove a node and its subtree
sb_duplicateCopy a node and its subtree under fresh ids, right after the original — or onto another page or site, as the editor's copy/paste does (assets copied, references that cannot travel listed)
sb_templatesThe store's saved section templates, plus the BUILT-IN layouts — hero, feature trio, stats, FAQ, CTA band, product shelf, category strip, brand wall, trust band — composed against the page's own tokens
sb_template_useAdd a section template to a page
sb_page_listEvery page on the site
sb_page_createCreate a page — a store type arrives with the editor's own starting document; type is the route for checkout, product, category, post, course
sb_page_updateEdit a page's name, slug, home flag, order, SEO (title, description, Open Graph, robots, meta tags, JSON-LD) and members-only flag — merged into settings, so the keys it does not name survive. On a template page: make it the type's default, or choose which products/categories/posts render through it
sb_page_versionA page's platform recovery points — list named versions and autosave history, snapshot the draft, restore one
sb_codeThe site's custom code files (tracking pixels, analytics, chat widgets, site CSS; html/css/js/scss/ts injected, json/text served at /_wb/code/<name>) for every page or one — list, create, merge-update, remove; scss/ts compile on write and report compile_error
sb_functionThe site's backend functions — server-side TypeScript/JavaScript served at /_wb/fn/<slug> with the site's sealed secrets, collections and fetch (a _ slug is an importable module) — list, read, create, merge-update, remove, test-run (counts toward the monthly quota), the run log, this month's usage, and write-only secrets; a failed build reports compile_error
sb_publishCompile the draft into the live page (cascades to shared globals), report which revision went live, and with verify check the origin is serving it; lists other pages with unpublished drafts and never-published pages (publish_drafts publishes both)
sb_page_stateWhich of a page's three copies is which — the DRAFT the editor canvas shows, the PUBLISHED row the storefront serves, and this session's — plus whether the editor will render the canvas BLANK, and where the recovery points are
sb_page_repairRename a page root that is not ROOT (left by older seeds) so every editor build draws it — one page or the whole site
sb_reviewEvery defect a visitor would see, each with its fix, plus the five gaps between this store and a paid order
sb_media_listThe site's media library
sb_media_uploadAdd an image and get its URL — a local path, a URL the platform fetches, or a SEARCH for real photographs you read and pick from, one or several at a time; paths uploads many local files in one call
sb_live_joinJoin the editor's live-edit room as a visible peer — edits then appear live
sb_lookSave, render, and return screenshots plus measured node boxes and layout defects measured on the render
sb_eventGive a node a click action — open the cart, go to a page, open a pop-up
sb_bindBind a node's content to real store data, or make a button add to the cart
sb_importRead a page from any public URL and add its structure and content to the open page as real elements, styled with THIS page's own tokens — a translation, not a clone
sb_import_siteRead a WHOLE site from one URL — its sitemap, or the links on that page — and give each page found its own draft page here, built from this site's tokens; the entry page's own colours and type scale also patch into this SITE'S theme, so it stops being purely a read
sb_themeRead or patch the site's palette and type scale — the layer every style preset resolves from, so one token repaints every page; per-breakpoint text-style overrides and element style presets; locale sets the site's language
sb_translateTranslate a site the way the editor's Multilingual panel does — enable languages, list a page's strings as missing / done / outdated, write or machine-fill them, approve machine rows
sb_storeRun a store flow that must happen in a fixed order — checkout (the four writes that make a working one), checkout_sync (the store's current payment and delivery methods into every existing order form, checkout page republished), form (any of the platform's 17 templates with its own field document), chrome (one shared header or footer on a real site menu — site name linked home, desktop menu, mobile drawer, search, cart and account icons), menu (a menu node bound to the site's menu, its links resolved), overlay_attach (a pop-up or quick view on the open page), cart (the site's cart drawer, when it has none; relocalize puts an existing one in the site's language) and app (a built-in app plus the pages it needs), global_attach / global_detach (put an EXISTING shared section on the open page, or take it off), global_promote (make a section on the page a NEW shared section) and template_save (save a section as a reusable template)
sb_undoUndo / redo this session's writes — page and form edits and sb_api_call PUTs, each named by tool and target, the open page's by default (all: true for every page); a page is refused if someone else saved it since. The platform's versions and history (sb_page_version) outlive this process

Thirty-eight tools, 949 API operations (354 of the 441 writes carrying a body shape read off the handler), 124 elements, 96 binding sources. sb_api_find is an index rather than a tool per endpoint, so the tool list stays short while everything the platform can do stays reachable — and operations added to the platform arrive with the next npm run codegen.

Every result is compact JSON, every directive is said once per process, and every tool carries MCP annotations — a client that honours them stops asking a person to confirm a read.

Full reference: docs/tools.md. What the builder supports natively, and where it stops: docs/capabilities.md.

How it stays in sync

The platform publishes two generated, committed artifacts. A build step reads them out of a checkout and emits the catalog:

WB_REPO=/path/to/web_builder npm run codegen

So this repository vendors no platform code — it depends on two data files with a maintained contract. src/catalog/api.generated.ts is committed, so npm install needs no checkout at all.

Development

npm run build     # tsc -> dist/
npm test          # vitest
npm run smoke     # offline self-test; must print ALL GOOD

Contributor guide: CLAUDE.md. Design rationale: docs/superpowers/specs/.

Release

A push to main that touches src/** releases on its own (.github/workflows/auto-release.yml): the gate runs (build, test, smoke), the version bump is read off the commit subject — feat is minor, BREAKING CHANGE or ! is major, anything else is patch — Claude writes the changelog entry in both languages, server.json is synced, the release is committed as chore(release): vX.Y.Z and tagged, then published to npm, as a GitHub Release, and to the MCP Registry through GitHub OIDC. workflow_dispatch runs the same flow with a bump you choose. A commit whose subject contains chore(release): or release: v is skipped, so a release never triggers another.

The workflow needs two repository secrets in the prod environment: NPM_ACCESS_TOKEN and CLAUDE_CODE_OAUTH_TOKEN. The registry step needs none.

npm run release (scripts/release.mjs) is the offline path — a machine with no CI, or a release cut while a secret is being rotated. It runs the same gate and writes the same ## [x.y.z] - date changelog heading, so the two never disagree.

Designing safely

Five platform rules fail silently if a client does not know them, so they are encoded here as tested code rather than advice:

  • Band order — ROOT's children must read [header][middle][footer], or the platform refuses every save.
  • Site overlays (the cart drawer, pop-ups) are composed onto ROOT on read and stripped on write; they are excluded from every ROOT-level rule and cannot be edited through the page tools.
  • Global sections are shared masters — editing one changes every page carrying it, and publishing cascades. Any result touching one says so.
  • Responsive by default — sb_set writes per breakpoint, because a design should respond. Base is the cascade's fallback layer, not a trap.
  • App blocks — a marketplace app's subtree is composed onto the page on read and reduced back to one reference node on save, so an edit inside it is lost without a word. Every write refuses the interior; the outline flags the block root app: true.

Status

All three phases shipped: authentication and full API reach; the page document, patch protocol, builder and the five traps; the live-edit socket, the yield rule, and the vision loop. Since then: a token diet across every result, and releases that cut themselves.

Requires Node ≥22 (the global WebSocket) and, for sb_look only, system Google Chrome — playwright-core bundles no browser, so installing downloads nothing.

MIT.

Comments

Markdown supported

New to MCP?

From what the protocol is to installing your first server, these answers cover most first questions.

An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.