npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

sbuilder-mcp

v0.91.0

Published

MCP server that designs and operates a Store Builder site — pages, data, theme and publish — through the platform's own API and live-edit protocol.

Readme

sbuilder-mcp

Máy chủ MCP chạy trên stdio, cho phép một AI agent vận hành trọn vẹn một site Store Builder — thiết kế trang, đổ dữ liệu thật vào, tự nhìn kết quả rồi xuất bản — mà không cần người bấm gì.

English

Cài đặt

Một lệnh ghi server này vào mọi agent client trên máy bạn:

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

Nó biết Claude Code, Claude Desktop, Cursor, Windsurf, VS Code và Codex, và cài vào những cái nó tìm thấy. Chỉ định bằng --client cursor,codex, hoặc diễn thử với --dry-run. Một tuỳ chọn nó không biết sẽ bị từ chối, không phải bỏ qua — một cờ âm thầm không làm gì còn tệ hơn một cờ không tồn tại.

--site là tuỳ chọn nhưng nên truyền: một khoá chỉ thuộc đúng một site, nên nó được ghi thành SB_SITE và mọi tool sau đó mặc định dùng site đó. Không có nó thì model phải mang theo id suốt phiên, mà cách duy nhất để lấy là liệt kê trang rồi đọc ngược ra.

--site-name "Tên Cửa Hàng" đi kèm, được ghi thành SB_SITE_NAME. Nó là một nhãn, không phải địa chỉ — không có gì phân giải theo nó — nhưng nhờ nó agent gọi được tên cửa hàng thay vì đọc lại một id 32 ký tự bạn không đặt. Màn hình Apps → AI agent tự thêm nó khi cửa hàng có tên.

Nó gộp: các server đã có trong file được giữ nguyên, thứ nó thay thế được chép sang <file>.sbuilder-backup, và một config nó không đọc được thì bị từ chối chứ không ghi đè — một file thừa dấu phẩy khả dĩ hơn nhiều một file đáng vứt, và đó chính là thứ bạn cần để sửa.

Màn hình Apps → AI agent của cửa hàng đưa sẵn lệnh này kèm khoá.

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

Lấy khoá ở đâu

Mở cửa hàng của bạn, vào Apps → AI agent, bấm Tạo khoá. Màn hình đó đưa luôn khối cấu hình cho client bạn dùng, khoá đã điền sẵn — cả mục này chỉ để bạn khỏi phải đọc.

Một khoá là đủ. Nó với tới cả bề mặt đối tác (/api/v1) lẫn private site API, gồm tài liệu trang và socket live-edit, và bị chặn ba lớp ở mỗi request: scope của chính nó, role sống của thành viên đã tạo ra nó, và đúng một cửa hàng nó thuộc về.

SB_EMAIL + SB_PASSWORD vẫn tuỳ chọn, và mua đúng một thứ: các lệnh cấp tài khoản — liệt kê site, quản lý thành viên và role — mà khoá cố ý không làm được, vì những thứ đó nghĩa là "tài khoản của người này".

SB_API mặc định http://localhost:8080. Bí mật chỉ đọc từ biến môi trường.

Phần tìm ảnh của sb_media_upload không cần key ở đây: nó gọi route của chính nền tảng, GET /api/sites/{siteId}/images/search, nơi có một pool key xoay vòng nằm sau đúng credential mà server này đang cầm. Operator bật nó bằng cách đặt PEXELS_API_KEYS trên SERVER (ngăn cách bằng dấu phẩy; key miễn phí ở https://www.pexels.com/api/). Không cấu hình gì thì tìm kiếm trả lời "không khả dụng" và bảo người gọi tự tìm ảnh rồi đưa URL — nền tảng sẽ tự tải về. Client này cố ý không có nhà cung cấp dự phòng: có nó là đem đúng cái key mà nền tảng sinh ra để giữ, nhét ngược lại vào mọi bản cài.

Bộ tool

| Tool | Làm gì | | --- | --- | | sb_connect | Đăng nhập, liệt kê site tài khoản vận hành được, báo đang có credential nào | | sb_site_list | Liệt kê site tài khoản vận hành được | | sb_api_find | Tìm operation theo ý định — mỗi kết quả một dòng — rồi đọc call sheet của một operation theo id: schema tham số thật, credential cần dùng, và các trường body đọc thẳng từ handler decode chúng, mỗi trường mang theo cái bẫy doc comment của chính nó ghi lại | | sb_api_call | Chạy operation, hoặc bất kỳ route nào bằng method+path; mặc định chạy khô. Chọn field và phân trang kết quả phía MCP; merge cho PUT thay cả bản ghi, If-Match, file multipart | | sb_page_open | Mở một trang để sửa và trả về outline — hoặc, với form_id, tài liệu trường của biểu mẫu (trường, giá trị mặc định, quy tắc trường phụ thuộc) | | sb_outline | Trang đang mở dạng cây nén — không bao giờ dump tài liệu thô | | sb_node_read | Một node đầy đủ, kèm cảnh báo nếu nó là global dùng chung | | sb_catalog_search | Tìm element theo việc nó cần làm, dùng chính AI hints của nền tảng | | sb_traits_for | Inspector của element — tab, nhóm, control và mỗi control khai báo sẵn ghi vào đâu — kèm AI hints, default và luật chứa con | | sb_add | Thêm một element — hoặc cả cây con lồng nhau — trong một lần gọi | | sb_set | Ghi style/config/specials. Mặc định theo breakpoint | | sb_move | Chuyển node sang cha khác | | sb_remove | Xoá node và cả cây con | | sb_duplicate | Nhân bản một node và cả cây con dưới id mới, ngay sau bản gốc — hoặc sang trang/site khác như copy/paste của editor (ảnh được copy, tham chiếu không mang theo được sẽ được liệt kê) | | sb_templates | Section template đã lưu của cửa hàng, cộng bộ layout DỰNG SẴN — hero, ba lợi ích, số liệu, FAQ, dải kêu gọi, kệ sản phẩm, dải danh mục, dải logo, dải cam kết — soạn theo token của chính trang | | sb_template_use | Thả một template vào trang | | sb_page_list | Mọi trang của site | | sb_page_create | Tạo một trang — trang cửa hàng sinh ra đã có sẵn tài liệu như trong editor; type là đường đi cho checkout, product, category, post, course | | sb_page_update | Sửa tên, slug, cờ trang chủ, thứ tự, SEO (title, description, Open Graph, robots, meta tag, JSON-LD) và cờ chỉ-thành-viên của một trang — merge vào settings, nên các khoá không nhắc tới vẫn còn nguyên. Với trang template: đặt làm mặc định của loại, hoặc chọn sản phẩm/danh mục/bài viết nào hiển thị qua nó | | sb_page_version | Các điểm khôi phục của trang trên platform — liệt kê phiên bản có tên và lịch sử autosave, chụp draft, khôi phục | | sb_code | Các file mã tuỳ chỉnh của site (pixel theo dõi, analytics, widget chat, CSS toàn site) chèn vào mọi trang hoặc một trang — liệt kê, tạo, cập nhật gộp, xoá | | sb_publish | Biên dịch bản nháp thành trang live (lan sang global dùng chung), báo bản nào đã lên live, và với verify kiểm origin đã phục vụ đúng bản đó chưa; liệt kê các trang khác còn nháp chưa publish (publish_drafts publish luôn) | | sb_page_state | Ba bản sao của một trang, bản nào là bản nào — bản NHÁP canvas editor hiển thị, dòng PUBLISHED storefront phục vụ, và bản phiên này giữ — kèm dự báo editor có render canvas TRẮNG không, và các điểm phục hồi nằm ở đâu | | sb_page_repair | Đổi gốc trang khác ROOT (do seed cũ để lại) về ROOT để mọi bản editor vẽ được — một trang hoặc cả site | | sb_review | Mọi khiếm khuyết người xem sẽ thấy, kèm lệnh sửa từng cái, và năm khoảng trống chắn giữa cửa hàng với một đơn đã thanh toán | | sb_media_list | Thư viện ảnh của site | | sb_media_upload | Thêm ảnh và lấy URL — file trên máy, một URL để nền tảng tự tải, hoặc TÌM ảnh chụp thật để đọc mô tả rồi chọn, một hoặc nhiều tấm một lượt | | sb_live_join | Vào phòng live-edit của editor như một peer nhìn thấy được — sửa gì hiện ngay | | sb_look | Lưu, render, trả về ảnh chụp kèm box đo được của node và lỗi bố cục đo trên bản render | | sb_event | Gắn click action cho một node — mở giỏ, sang trang, mở pop-up | | sb_bind | Gắn nội dung một node vào dữ liệu cửa hàng thật, hoặc biến một nút thành nút thêm vào giỏ | | sb_import | Đọc một trang từ URL công khai bất kỳ và thêm cấu trúc + nội dung của nó vào trang đang mở dưới dạng element thật, mang token của CHÍNH trang này — là dịch lại, không phải sao chép | | sb_import_site | Đọc CẢ website từ một URL — sitemap của nó, hoặc các link trên trang đó — và tạo cho mỗi trang tìm được một trang nháp riêng ở đây, dựng bằng token của site này; màu và thang chữ của trang gốc cũng được vá vào THEME của site này, nên đây không còn thuần là đọc | | sb_theme | Đọc hoặc vá bảng màu và thang chữ của site — tầng mà mọi style preset phân giải từ đó, nên một token thay áo cho mọi trang; locale đặt ngôn ngữ của site | | sb_translate | Dịch site như bảng Đa ngôn ngữ của editor — bật ngôn ngữ, liệt kê chuỗi của một trang theo missing / done / outdated, ghi hoặc dịch máy, duyệt dòng do máy dịch | | sb_store | Chạy một luồng cửa hàng bắt buộc đúng thứ tự — checkout (bốn lệnh ghi tạo nên trang thanh toán), checkout_sync (đưa phương thức thanh toán và giao hàng hiện tại vào mọi form đặt hàng đã có, publish lại trang thanh toán), form (một trong 17 template của nền tảng kèm field document của nó), chrome (một header hoặc footer dùng chung trên menu thật của site — menu desktop, drawer mobile, icon giỏ hàng và tài khoản), menu (một node menu bind vào menu của site, link đã phân giải), overlay_attach (một pop-up hay quick view trên trang đang mở), cart (ngăn giỏ hàng của site, khi chưa có; relocalize đưa ngăn giỏ đã có về ngôn ngữ của site), app (một app dựng sẵn kèm những trang nó cần), và global_attach / global_detach (đặt một section dùng chung ĐÃ CÓ lên trang đang mở, hoặc gỡ ra), global_promote (biến một section trên trang thành section dùng chung MỚI) và template_save (lưu một section làm mẫu dùng lại) | | sb_undo | Hoàn tác / làm lại các thao tác ghi trong phiên — chỉnh sửa trang, form và PUT qua sb_api_call; trang bị từ chối nếu người khác đã lưu sau đó. Version và history của nền tảng (sb_page_version) sống lâu hơn process này |

Hai mươi tám tool, 919 operation API (344 trong 429 lệnh ghi có hình dạng body đọc thẳng từ handler), 123 element, 94 nguồn binding. sb_api_find là một chỉ mục chứ không phải mỗi endpoint một tool, nên danh sách tool vẫn ngắn trong khi mọi thứ nền tảng làm được vẫn với tới — và operation mới thêm bên nền tảng sẽ tự có sau lần npm run codegen kế tiếp.

Mọi kết quả đều là JSON nén, mọi directive chỉ nói một lần mỗi process, và mọi tool đều mang MCP annotation — client nào tôn trọng chúng sẽ thôi hỏi người dùng xác nhận một lần đọc.

Tra cứu đầy đủ: docs/tools.vi.md. Builder hỗ trợ native những gì, và dừng ở đâu: docs/capabilities.vi.md.

Cách nó không bị lệch

Nền tảng có sẵn hai artifact đã sinh và đã commit. Một bước build đọc chúng từ một checkout rồi sinh ra catalog:

WB_REPO=/duong/dan/web_builder npm run codegen

Nhờ vậy repo này không vendor dòng code nào của nền tảng — nó chỉ phụ thuộc vào hai file dữ liệu có hợp đồng được bảo trì. src/catalog/api.generated.ts được commit, nên npm install không cần checkout nào cả.

Phát triển

npm run build     # tsc -> dist/
npm test          # vitest
npm run smoke     # tự kiểm offline; phải in ALL GOOD

Hướng dẫn đóng góp: CLAUDE.md. Lý do thiết kế: docs/superpowers/specs/.

Phát hành

Một lần push lên main có đụng src/** sẽ tự phát hành (.github/workflows/auto-release.yml): cổng kiểm chạy (build, test, smoke), mức tăng phiên bản đọc từ tiêu đề commit — feat là minor, BREAKING CHANGE hoặc ! là major, còn lại là patch — Claude viết mục changelog bằng cả hai ngôn ngữ, server.json được đồng bộ, bản phát hành được commit là chore(release): vX.Y.Z và gắn tag, rồi publish lên npm, thành GitHub Release, và lên MCP Registry qua GitHub OIDC. workflow_dispatch chạy đúng luồng đó với mức tăng bạn chọn. Commit có tiêu đề chứa chore(release): hoặc release: v thì bị bỏ qua, nên một lần phát hành không bao giờ kích hoạt lần khác.

Workflow cần hai secret của repo trong environment prod: NPM_ACCESS_TOKEN và CLAUDE_CODE_OAUTH_TOKEN. Bước registry không cần secret nào.

npm run release (scripts/release.mjs) là đường offline — máy không có CI, hoặc phát hành đúng lúc đang xoay secret. Nó chạy cùng cổng kiểm và ghi cùng tiêu đề changelog ## [x.y.z] - date, nên hai bên không bao giờ lệch nhau.

Thiết kế an toàn

Năm luật của nền tảng hỏng im lặng nếu client không biết, nên chúng được viết thành code có test chứ không phải lời khuyên:

  • Thứ tự băng — con của ROOT phải đọc [header][middle][footer], sai là nền tảng từ chối mọi lần lưu.
  • Site overlay (cart drawer, pop-up) được ghép lên ROOT lúc đọc và bóc ra lúc ghi; nó bị loại khỏi mọi luật cấp ROOT và không sửa được qua bộ page tool.
  • Global section là master dùng chung — sửa một cái là đổi mọi trang mang nó, và publish thì lan. Mọi kết quả đụng tới nó đều nói rõ.
  • Mặc định responsive — sb_set ghi theo breakpoint, vì một thiết kế nên đáp ứng. Base là lớp dự phòng của cascade, không phải cái bẫy.
  • App block — cây con của một app trên marketplace được ghép vào trang lúc đọc và thu về một node tham chiếu lúc lưu, nên sửa gì bên trong là mất mà không một lời. Mọi lần ghi đều từ chối phần bên trong; outline cắm cờ app: true cho gốc block.

Trạng thái

Cả ba giai đoạn đã xong: xác thực và với tới toàn bộ API; tài liệu trang, giao thức patch, builder và năm cái bẫy; socket live-edit, luật nhường, và vòng lặp thị giác. Sau đó: một đợt ăn kiêng token trên mọi kết quả, và phát hành tự cắt.

Cần Node ≥22 (WebSocket toàn cục) và, chỉ với sb_look, Google Chrome của hệ thống — playwright-core không kèm trình duyệt nào nên lúc cài không tải gì.

MIT.