sbuilder-mcp 0.59.3 → 0.60.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -6,6 +6,14 @@ All notable changes to this project are documented in this file.
6
6
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
7
7
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
8
8
 
9
+ ## [0.60.0] - 2026-09-16
10
+
11
+ ### Added
12
+ - `sb_page_list` now returns a `page_types` table naming every one of the platform's twelve page types and the address or role each is served at, generated from the platform's own page-type metadata, since `sb_page_create` previously only described six of them (page, checkout, product, category, post, course) in its argument text, leaving search, account, blog, complete, error, and maintain pages undiscoverable to an agent that only read the tool.
13
+
14
+ ### Changed
15
+ - `sb_page_create`'s `type` argument now points to `sb_page_list` for the full set of page types instead of naming a partial list inline.
16
+
9
17
  ## [0.59.3] - 2026-09-15
10
18
 
11
19
  ### Changed
package/CHANGELOG.vi.md CHANGED
@@ -6,6 +6,14 @@ Mọi thay đổi đáng chú ý của dự án được ghi lại trong file n
6
6
  Định dạng dựa trên [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
7
7
  và dự án tuân theo [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
8
8
 
9
+ ## [0.60.0] - 2026-09-16
10
+
11
+ ### Added
12
+ - `sb_page_list` giờ trả về bảng `page_types` nêu tên cả mười hai loại trang của nền tảng cùng địa chỉ hoặc vai trò mà mỗi loại được phục vụ, sinh ra từ chính metadata loại trang của nền tảng, vì trước đó `sb_page_create` chỉ mô tả sáu trong số đó (page, checkout, product, category, post, course) trong phần mô tả tham số, khiến các trang search, account, blog, complete, error và maintain không thể được khám phá bởi một agent chỉ đọc mô tả của tool.
13
+
14
+ ### Changed
15
+ - Tham số `type` của `sb_page_create` giờ trỏ tới `sb_page_list` để xem đầy đủ các loại trang thay vì liệt kê một danh sách không đầy đủ ngay trong mô tả.
16
+
9
17
  ## [0.59.3] - 2026-09-15
10
18
 
11
19
  ### Changed
package/README.md CHANGED
@@ -112,7 +112,7 @@ in this client: one would put the very key the platform exists to hold back into
112
112
  | `sb_store` | Run a store flow that must happen in a fixed order — the four writes that make a working checkout, or any of the platform's 17 form templates (login, register, forgot, contact, subscribe …) with its own field document |
113
113
  | `sb_undo` | Put back what a PUT replaced. The SECOND answer for a page, not the only one: the platform has versions, history and restore (`sb_api_find` "page versions"), which outlive this process — reach for those first and use this for every other shaped PUT |
114
114
 
115
- Twenty-eight tools, **525 API operations** (176 of the 235 writes carrying a body shape read
115
+ Twenty-eight tools, **527 API operations** (177 of the 236 writes carrying a body shape read
116
116
  off the handler), 113 elements, 79 binding sources. `sb_api_find`
117
117
  is an index rather than a tool per endpoint, so the tool list stays short while everything
118
118
  the platform can do stays reachable — and operations added to the platform arrive with the
package/README.vi.md CHANGED
@@ -109,7 +109,7 @@ nhét ngược lại vào mọi bản cài.
109
109
  | `sb_store` | Chạy một luồng cửa hàng bắt buộc đúng thứ tự — bốn lệnh ghi tạo nên trang thanh toán, hoặc gieo bất kỳ template nào trong 17 form của nền tảng (login, register, forgot, contact, subscribe …) kèm field document của nó |
110
110
  | `sb_undo` | Trả lại thứ mà một lệnh PUT đã ghi đè. Với TRANG thì đây là đường về thứ hai chứ không phải duy nhất: nền tảng có version, history và restore (`sb_api_find` "page versions"), và chúng sống lâu hơn tiến trình này — hãy dùng chúng trước, còn tool này cho mọi PUT có hình dạng khác |
111
111
 
112
- Hai mươi tám tool, **525 operation API** (176 trong 235 lệnh ghi có hình dạng body đọc thẳng
112
+ Hai mươi tám tool, **527 operation API** (177 trong 236 lệnh ghi có hình dạng body đọc thẳng
113
113
  từ handler), 113 element, 79 nguồn binding. `sb_api_find` là
114
114
  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
115
115
  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
@@ -1,8 +1,8 @@
1
1
  export const SWAGGER_SOURCE = {
2
- "operations": 525,
2
+ "operations": 527,
3
3
  "definitions": 107,
4
- "bodyCarrying": 193,
5
- "bodyUndescribed": 74,
4
+ "bodyCarrying": 195,
5
+ "bodyUndescribed": 76,
6
6
  "generatedFrom": "server/docs/swagger.json"
7
7
  };
8
8
  export const API_OPERATIONS = [
@@ -3356,6 +3356,62 @@ export const API_OPERATIONS = [
3356
3356
  "bodyRef": null,
3357
3357
  "credential": "siteScoped"
3358
3358
  },
3359
+ {
3360
+ "id": "get:/api/sites/{siteId}/ai/settings",
3361
+ "method": "GET",
3362
+ "path": "/api/sites/{siteId}/ai/settings",
3363
+ "tags": [
3364
+ "sites"
3365
+ ],
3366
+ "summary": "Read or replace this site's own AI credentials",
3367
+ "params": [
3368
+ {
3369
+ "name": "siteId",
3370
+ "in": "path",
3371
+ "required": true,
3372
+ "type": "string",
3373
+ "description": "Site ID"
3374
+ },
3375
+ {
3376
+ "name": "settings",
3377
+ "in": "body",
3378
+ "required": false,
3379
+ "type": "object",
3380
+ "description": "provider, model, baseUrl and apiKey (PUT only; omit apiKey to keep the stored one, send \\"
3381
+ }
3382
+ ],
3383
+ "bodyDescribed": false,
3384
+ "bodyRef": null,
3385
+ "credential": "siteScoped"
3386
+ },
3387
+ {
3388
+ "id": "put:/api/sites/{siteId}/ai/settings",
3389
+ "method": "PUT",
3390
+ "path": "/api/sites/{siteId}/ai/settings",
3391
+ "tags": [
3392
+ "sites"
3393
+ ],
3394
+ "summary": "Read or replace this site's own AI credentials",
3395
+ "params": [
3396
+ {
3397
+ "name": "siteId",
3398
+ "in": "path",
3399
+ "required": true,
3400
+ "type": "string",
3401
+ "description": "Site ID"
3402
+ },
3403
+ {
3404
+ "name": "settings",
3405
+ "in": "body",
3406
+ "required": false,
3407
+ "type": "object",
3408
+ "description": "provider, model, baseUrl and apiKey (PUT only; omit apiKey to keep the stored one, send \\"
3409
+ }
3410
+ ],
3411
+ "bodyDescribed": false,
3412
+ "bodyRef": null,
3413
+ "credential": "siteScoped"
3414
+ },
3359
3415
  {
3360
3416
  "id": "get:/api/sites/{siteId}/api-keys",
3361
3417
  "method": "GET",
@@ -1,6 +1,6 @@
1
1
  export const DEAD_KEY_SOURCE = {
2
- "files": 4023,
3
- "identifiers": 77197,
2
+ "files": 4026,
3
+ "identifiers": 77258,
4
4
  "seededKeys": 384,
5
5
  "dead": 0
6
6
  };
@@ -1,10 +1,10 @@
1
1
  export const SHAPE_SOURCE = {
2
- "writeOperations": 235,
3
- "shaped": 176,
4
- "fromHandlers": 176,
2
+ "writeOperations": 236,
3
+ "shaped": 177,
4
+ "fromHandlers": 177,
5
5
  "fromSwaggerOnly": 0,
6
6
  "withReadOnly": 26,
7
- "structsRead": 1697
7
+ "structsRead": 1701
8
8
  };
9
9
  export const REQUEST_SHAPES = {
10
10
  "post:/api/sites/{siteId}/api-keys": {
@@ -3018,6 +3018,28 @@ export const REQUEST_SHAPES = {
3018
3018
  "source": "go",
3019
3019
  "goType": "(inline)"
3020
3020
  },
3021
+ "put:/api/sites/{siteId}/ai/settings": {
3022
+ "fields": [
3023
+ {
3024
+ "name": "provider",
3025
+ "type": "string"
3026
+ },
3027
+ {
3028
+ "name": "model",
3029
+ "type": "string"
3030
+ },
3031
+ {
3032
+ "name": "apiKey",
3033
+ "type": "string | null"
3034
+ },
3035
+ {
3036
+ "name": "baseUrl",
3037
+ "type": "string"
3038
+ }
3039
+ ],
3040
+ "source": "go",
3041
+ "goType": "editoragent.SettingsInput"
3042
+ },
3021
3043
  "post:/api/sites/{siteId}/fonts": {
3022
3044
  "fields": [
3023
3045
  {
@@ -1133,6 +1133,89 @@ export const PAGE_LAYOUT_SEEDS = {
1133
1133
  }
1134
1134
  }
1135
1135
  };
1136
+ /**
1137
+ * EVERY page type the platform has, and what each one is FOR.
1138
+ *
1139
+ * A storefront is not one page: most of these are TEMPLATES, and a missing one
1140
+ * means a whole family of addresses serves nothing. `routePattern` is where the
1141
+ * type is served (absent = the author names the address), `ownSlug` says whether
1142
+ * the author names it, `servedRole` marks the two that are served by ROLE rather
1143
+ * than by address, and `app` names the builtin app a type needs installed.
1144
+ */
1145
+ export const PAGE_TYPES = [
1146
+ {
1147
+ "type": "page",
1148
+ "group": "main",
1149
+ "ownSlug": true
1150
+ },
1151
+ {
1152
+ "type": "product",
1153
+ "group": "store",
1154
+ "ownSlug": false,
1155
+ "routePattern": "/products/{slug}"
1156
+ },
1157
+ {
1158
+ "type": "category",
1159
+ "group": "store",
1160
+ "ownSlug": false,
1161
+ "routePattern": "/collections/{slug}"
1162
+ },
1163
+ {
1164
+ "type": "course",
1165
+ "group": "store",
1166
+ "ownSlug": false,
1167
+ "routePattern": "/courses/{slug}",
1168
+ "app": "courses"
1169
+ },
1170
+ {
1171
+ "type": "search",
1172
+ "group": "main",
1173
+ "ownSlug": false,
1174
+ "routePattern": "/search"
1175
+ },
1176
+ {
1177
+ "type": "checkout",
1178
+ "group": "store",
1179
+ "ownSlug": false,
1180
+ "routePattern": "/checkout"
1181
+ },
1182
+ {
1183
+ "type": "complete",
1184
+ "group": "store",
1185
+ "ownSlug": false,
1186
+ "routePattern": "/checkout/complete"
1187
+ },
1188
+ {
1189
+ "type": "account",
1190
+ "group": "main",
1191
+ "ownSlug": false,
1192
+ "routePattern": "/account"
1193
+ },
1194
+ {
1195
+ "type": "blog",
1196
+ "group": "blog",
1197
+ "ownSlug": false,
1198
+ "routePattern": "/blog-categories/{slug}"
1199
+ },
1200
+ {
1201
+ "type": "post",
1202
+ "group": "blog",
1203
+ "ownSlug": false,
1204
+ "routePattern": "/blog/{slug}"
1205
+ },
1206
+ {
1207
+ "type": "error",
1208
+ "group": "error",
1209
+ "ownSlug": false,
1210
+ "servedRole": "notFound"
1211
+ },
1212
+ {
1213
+ "type": "maintain",
1214
+ "group": "maintain",
1215
+ "ownSlug": false,
1216
+ "servedRole": "maintenance"
1217
+ }
1218
+ ];
1136
1219
  /**
1137
1220
  * The document an ordinary page opens with for a chosen LAYOUT.
1138
1221
  *
@@ -1,4 +1,4 @@
1
- import { COMPLETION_HEADLINE, COMPLETION_HEADLINE_SENTINEL, PAGE_LAYOUT_SEEDS, STORE_PAGE_SEEDS, } from '../../catalog/storepages.generated.js';
1
+ import { COMPLETION_HEADLINE, COMPLETION_HEADLINE_SENTINEL, PAGE_LAYOUT_SEEDS, STORE_PAGE_SEEDS } from '../../catalog/storepages.generated.js';
2
2
  /**
3
3
  * WHAT A NEW STORE PAGE OPENS WITH — for an agent, as for a merchant.
4
4
  *
@@ -7,7 +7,8 @@ import { addSubtree, setMany, baseOnlyKeys, moveNode, removeNode, duplicateNode,
7
7
  import { baseOnlyNote } from '../domains/site/baseonly.js';
8
8
  import { detachNote, presetIdOf, presetLayer } from '../domains/site/theme.js';
9
9
  import { inertHintsFor } from '../domains/site/inert.js';
10
- import { hasSeed, layoutDocument, seedDocument, seedSummary, seededTypes } from '../domains/site/storepage.js';
10
+ import { hasSeed, layoutDocument, seedDocument, seedSummary, seededTypes, } from '../domains/site/storepage.js';
11
+ import { PAGE_TYPES } from '../catalog/storepages.generated.js';
11
12
  import { animationNote, deadKeyNote, unknownValueNote, unknownWriteNote, } from '../domains/site/vocabulary.js';
12
13
  import { skinLevelNote } from '../domains/site/fieldskin.js';
13
14
  import { siteTheme } from '../domains/site/theme-fetch.js';
@@ -1177,6 +1178,21 @@ export function registerPageTools(server, ctx) {
1177
1178
  const missing = missingUsualPages(raw.pages ?? null);
1178
1179
  return text({
1179
1180
  ...projectList(raw, 'pages', PAGE_FIELDS),
1181
+ // EVERY TYPE THE PLATFORM HAS, and the address each one answers at.
1182
+ //
1183
+ // Here rather than in `sb_page_create`'s argument description, because
1184
+ // that string rides in `tools/list` and the token budget caps it — the
1185
+ // table put the payload over twice while being trimmed. It is also the
1186
+ // better home: an agent reads this while ORIENTING, before it has
1187
+ // decided what to build, and a type it has never heard of is exactly
1188
+ // what it cannot ask for. `sb_page_create` used to name six of twelve
1189
+ // from a hand-typed string, so search, account, blog, complete, error
1190
+ // and maintain were unreachable to anyone who only read the tool.
1191
+ page_types: Object.fromEntries(PAGE_TYPES.map((t) => [
1192
+ t.type,
1193
+ t.routePattern ??
1194
+ (t.servedRole ? `served as the site's ${t.servedRole}` : 'an address you choose'),
1195
+ ])),
1180
1196
  ...(missing.length
1181
1197
  ? {
1182
1198
  usually_also: Object.fromEntries(missing.map((m) => [m.key, m.why])),
@@ -1195,7 +1211,10 @@ export function registerPageTools(server, ctx) {
1195
1211
  inputSchema: {
1196
1212
  site_id: z.string().optional(),
1197
1213
  name: z.string(),
1198
- type: z.string().optional().describe('page (default), checkout, product, category, post, course'),
1214
+ type: z
1215
+ .string()
1216
+ .optional()
1217
+ .describe('page (default); sb_page_list lists every type and where each is served'),
1199
1218
  slug: z.string().optional(),
1200
1219
  is_homepage: z.boolean().optional(),
1201
1220
  settings: z.record(z.unknown()).optional(),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sbuilder-mcp",
3
- "version": "0.59.3",
3
+ "version": "0.60.0",
4
4
  "description": "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.",
5
5
  "mcpName": "io.github.vuluu2k/sbuilder-mcp",
6
6
  "type": "module",