@bettercms-ai/mcp 0.73.2 → 0.75.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/dist/index.js +183 -26
- package/dist/index.js.map +1 -1
- package/dist/kit-catalog.json +1362 -0
- package/dist/skills/bettercms/SKILL.md +11 -3
- package/dist/skills/bettercms/references/componentize.md +3 -0
- package/dist/skills/bettercms/references/content-modeling.md +5 -0
- package/dist/skills/bettercms/references/detection.md +15 -0
- package/dist/skills/bettercms/references/finish-site.md +5 -1
- package/dist/skills/bettercms/references/getting-started.md +2 -0
- package/dist/skills/bettercms/references/kit-catalog.md +3259 -0
- package/dist/skills/bettercms/references/kit-scenarios.md +712 -0
- package/dist/skills/bettercms/references/worked-examples.md +146 -1
- package/package.json +2 -2
|
@@ -15,6 +15,7 @@ that only show up in code. Read doctrine from the MCP, never from memory:
|
|
|
15
15
|
|
|
16
16
|
- Schema, sections, variants, publish order: resource `bettercms://playbook/schema` (§1–§14).
|
|
17
17
|
- Content sidebar organisation: resource `bettercms://playbook/structure`.
|
|
18
|
+
- Section patterns (149 worked kit entries by category and edge tag): resource `bettercms://kit`.
|
|
18
19
|
- Guided flows: the `studio` prompt routes to the rest (`convert_site` prompt,
|
|
19
20
|
`build_site` prompt, `componentize_site` prompt, `propose_schema` prompt, `new_page` prompt,
|
|
20
21
|
`new_component` prompt, `new_form` prompt, `seo_optimize` prompt, `import-site` prompt,
|
|
@@ -42,7 +43,12 @@ Listing tools needs no sign-in; the first tool **call** does.
|
|
|
42
43
|
4. **A refusal for access: call `whoami` first.** It names the principal, the workspace, the
|
|
43
44
|
scope (project or workspace) and, where visible, the grants (publish, code and deploy,
|
|
44
45
|
sidebar schema), so you can tell the user which one is missing.
|
|
45
|
-
5. **
|
|
46
|
+
5. **"Invalid tool parameters" is the client, not BetterCMS.** A client with tool search (Claude
|
|
47
|
+
Code) lists most of the 150 tools by name and loads a schema on demand; a call to a tool whose
|
|
48
|
+
schema it has not loaded is refused before it is sent. Load the tool with the client's tool
|
|
49
|
+
search, every tool the step needs in one search, then make the same call again. Never change
|
|
50
|
+
the arguments because of it. The tools a setup starts with are always loaded.
|
|
51
|
+
6. **Unsure how a feature works: `search_docs` before guessing.** A tool that fails oddly, a
|
|
46
52
|
capability you needed and did not have, or docs that misled you: `give_feedback`, and tell the
|
|
47
53
|
user you sent it.
|
|
48
54
|
|
|
@@ -122,13 +128,15 @@ resources: `bettercms://skill/bettercms` for this file, and each reference under
|
|
|
122
128
|
| Move content out of another CMS (Cosmic, Contentful, Sanity, Strapi, Prismic, WordPress…) | [external-content.md](references/external-content.md) | a CMS SDK in package.json; `envWarning` on import; pages that render empty without a third-party key | Contentful, Sanity, Strapi, envWarning, missing key, empty pages |
|
|
123
129
|
| Read a source site before modelling it | [detection.md](references/detection.md) | converting from a URL or built HTML; deciding what a band, a repeat or a value is | detect, classify, section, repeat, global, carousel clone, hidden state |
|
|
124
130
|
| Pages vs collections, folders, fields, schema changes | [content-modeling.md](references/content-modeling.md) | modelling a route family; a model write returns 409 | schema, model, collection, field, folder, rename, remove field, listing, filter, locked field |
|
|
125
|
-
| Dock layout: groups, rows, tabs, icons, item names, showIf order | [editor-chrome.md](references/editor-chrome.md) | `
|
|
131
|
+
| Dock layout: groups, rows, tabs, icons, item names, showIf order | [editor-chrome.md](references/editor-chrome.md) | after any import, convert, componentize or extract (the gate's `dock` row); a `dock-*` rule; the `field-ui` prompt | dock, fieldset, tab, group, itemLabel, showIf, field-ui |
|
|
126
132
|
| A custom input for one field in the dock: when, the user's approval, the contract | [dock-input.md](references/dock-input.md) | `get_next_steps` lists `dock-input-candidate`; a 409 `input_needs_confirmation` | custom input, ui.input, dock input, confirmed, swatch |
|
|
127
133
|
| What the server does and does not check on a write | [write-limits.md](references/write-limits.md) | before relying on a limit; reading a refused write; a bulk load or re-run | validation, maxLength, unique, 400, refused write, dry run, externalKey, upsert, re-run |
|
|
128
134
|
| Plan a site by business type | [site-blueprints.md](references/site-blueprints.md) | the IA of a known site type, with its collections, forms and structured data | new site, IA, portfolio, agency, corporate, SaaS, ecommerce, directory, blog, docs, restaurant, events, course, jobs, real estate, nonprofit, multi-brand |
|
|
129
135
|
| Components, props, variants, component publish codes | [components.md](references/components.md) | creating, swapping, publishing or validating a component | component, prop, variant, sectionType, publish component |
|
|
130
|
-
|
|
|
136
|
+
| Which kit pattern fits a section, and its shape and pitfalls, by category and edge tag | [kit-scenarios.md](references/kit-scenarios.md) | before designing any section's fields or props; a band detection.md classified | kit, pattern, scenario, edge tag, events, locations, calculator, map, chart, docs, team, bento, slots, personalization, localized |
|
|
137
|
+
| One section, source HTML to bound template: hero, feature grid, pricing table, testimonials, FAQ, bento | [worked-examples.md](references/worked-examples.md) | you want the whole path for one section in production shapes | example, hero, pricing, FAQ, testimonial, source to schema |
|
|
131
138
|
| The same for an article entry, navigation in the Global Layout, tabs holding columns | [worked-examples-advanced.md](references/worked-examples-advanced.md) | a collection entry with a body, site chrome, or nested blocks | example, blog post, document body, mega menu, tabs, columns |
|
|
139
|
+
| The modelled section closest to the one you are building: schema, HTML signals, mcp steps, pitfalls | [kit-catalog.md](references/kit-catalog.md) | before designing a section or its props; matching source HTML to a known pattern | kit, catalogue, edge tag, section pattern, bento, localized, personalization, a11y, responsive |
|
|
132
140
|
| Componentize a derived site | [componentize.md](references/componentize.md) | `get_site_composition` shows pages made of fields only | componentize, sections, fields-only, get_componentize_plan, BcmsSections, --sections |
|
|
133
141
|
| Click-to-edit attributes, addresses, declared mode | [bindings.md](references/bindings.md) | `grep -rl "data-bcms-" src` finds files; a value the editor cannot select | data-bcms-field, click to edit, binding report, stega, declared |
|
|
134
142
|
| Animated sites: GSAP, ScrollTrigger, split text, Motion, Lenis, Locomotive, three.js and WebGL, marquees, carousels, Lottie, hydrated islands, and what must stand down in the editor's canvas (`inEditor()`) | [animation.md](references/animation.md) | `package.json` lists `gsap`, `lenis`, `locomotive-scroll`, `framer-motion` or `motion`, `three`, `swiper` or a text splitter; a publish refused with `SPLIT_PATTERN_UNKNOWN` or `ISLAND_PROPS_UNMATCHED`; a `client-only-island` gate exception | animation, GSAP, ScrollTrigger, SplitText, Lenis, Framer Motion, marquee, Swiper, Lottie, island, client:only, data-bcms-split |
|
|
@@ -75,6 +75,9 @@ Never let a component contain itself, directly or through a child.
|
|
|
75
75
|
`set_component_source` per component is needed. Deploy. A page whose bands could not be
|
|
76
76
|
lifted is wrapped where it stands instead (§5).
|
|
77
77
|
7. Output validation, from step 3 of §6.
|
|
78
|
+
8. Editor chrome, last and not optional: the components this lane made have bare props. Load
|
|
79
|
+
[editor-chrome.md](editor-chrome.md) and run step 8 of the repair order in
|
|
80
|
+
[finish-site.md](finish-site.md) for each one; `extract_component` ends the same way.
|
|
78
81
|
|
|
79
82
|
## 3. Names and groups
|
|
80
83
|
|
|
@@ -108,6 +108,11 @@ sitemap), RSS (dated by `publishedAt`), `llms.txt` (one link per published item)
|
|
|
108
108
|
|
|
109
109
|
## 4. Field decisions
|
|
110
110
|
|
|
111
|
+
Before designing a section's fields, find the closest component-kit entry: the chooser by
|
|
112
|
+
category and edge tag is [kit-scenarios.md](kit-scenarios.md), the full list is the
|
|
113
|
+
`bettercms://kit` resource and [kit-catalog.md](kit-catalog.md). The entry's notes are the
|
|
114
|
+
field mapping and its pitfalls the review list; the rules below still decide the storage.
|
|
115
|
+
|
|
111
116
|
- **Model each visual band as a `group` field (or a repeater), or a component instance.** The
|
|
112
117
|
schema's shape decides whether the site can ever be componentized. The componentize lane finds
|
|
113
118
|
a section in a `group`, a repeater, or two or more top-level keys sharing a prefix before `-` or
|
|
@@ -177,6 +177,11 @@ For each band, find the row whose strong signals all match. One match: classify.
|
|
|
177
177
|
None: §9. The class picks the component family (`sectionType`) and the fields; it is never a
|
|
178
178
|
field itself.
|
|
179
179
|
|
|
180
|
+
Every group below is a category of the component kit. Once a band is classified, open the
|
|
181
|
+
closest kit entry (the chooser in [kit-scenarios.md](kit-scenarios.md), the full list in the
|
|
182
|
+
`bettercms://kit` resource or [kit-catalog.md](kit-catalog.md)), map it by that entry's notes and
|
|
183
|
+
check its pitfalls before you write.
|
|
184
|
+
|
|
180
185
|
| Confidence | Evidence | Action |
|
|
181
186
|
|---|---|---|
|
|
182
187
|
| High | A unique structural or vendor signal: `<form action="/cart/add">`, `role="tablist"`, JSON-LD of the right type | Model it |
|
|
@@ -229,7 +234,17 @@ field itself.
|
|
|
229
234
|
| Long-form | Blog post | `<article>` with one `h1`, a byline, a hero image, a rich body |
|
|
230
235
|
| Long-form | Docs page | Left nav tree, article, right "On this page" anchors, prev and next |
|
|
231
236
|
| Long-form | Recipe, job, event detail | JSON-LD of that type, or the matching plugin classes |
|
|
237
|
+
| Long-form | Help article | "Was this article helpful?" at the end, a Help Center breadcrumb, numbered steps with screenshots |
|
|
238
|
+
| Long-form | Glossary or curriculum | An A–Z letter bar over `<dl>` terms; or "Module 1" accordions of lesson rows with durations |
|
|
232
239
|
| Company | Team or leadership | Headshots with name and role; leadership adds C-level titles, bio modals, Board headings |
|
|
240
|
+
| Company | Careers or job | Job rows under department headings linking to a hiring board; or "What you'll do", a salary range, JobPosting JSON-LD |
|
|
241
|
+
| Company | Values or press kit | Three to eight headed value blocks and a perks grid; or logo tiles with SVG and PNG downloads |
|
|
242
|
+
| Events | Events list | Rows led by a big day and short month (12 NOV), Upcoming and Past tabs, "Get tickets" per row |
|
|
243
|
+
| Events | Webinar | A date with a time zone, a registration form beside speakers, "Watch on demand" |
|
|
244
|
+
| Places | Locations or location page | A map beside an address list, hours rows per day, `data-lat`; or one address with `tel:` and Restaurant JSON-LD |
|
|
245
|
+
| Places | Menu | Section headings with dish and price per line, dietary letter codes and a key, "MP" |
|
|
246
|
+
| Data | Calculator or configurator | Range and number inputs with listeners and an `<output>`, no submit; or "Step 1 of 3" option cards with "+$60" |
|
|
247
|
+
| Data | Countdown or poll | Digits as dd:hh:mm:ss with `data-end`; or one question with radio inputs and a Vote button |
|
|
233
248
|
| Data | Table | `<table>` with `<th scope="col">`, more than two rows, a `<caption>` |
|
|
234
249
|
| Data | Chart or map | An `<svg>` with axis ticks or a chart library global; a Leaflet, Mapbox or Google container |
|
|
235
250
|
| Data | Embed or code | A third-party `<iframe>` or script widget; `<pre><code class="language-*">` |
|
|
@@ -69,6 +69,7 @@ line), which is what a script waiting on the setup reads.
|
|
|
69
69
|
| `buttons` | every button field is one of the site's live Button looks, the Button family is the looks setup measured on this build (the same looks, not the same count), and no look is named by a number or a build's class | `blocking.rows`, `route: null` |
|
|
70
70
|
| `components` | the authoring question is answered, and no section is left that a componentize run would place | `blocking.rows`, `route: null` |
|
|
71
71
|
| `forms` | every form of the customer's has an address to notify; a form setup ignored (sign-in, add to basket) is not counted | `blocking.rows`, `route: null` |
|
|
72
|
+
| `dock` | every component with props has at least one prop carrying V2 `ui`, and every list prop (`table`, `array`, `multi-reference`) titles its rows with `ui.preview.title` or `ui.itemLabel`; one row per component, Button looks not counted | `blocking.rows`, `route: null`, the component and its props in `detail` |
|
|
72
73
|
|
|
73
74
|
`pages` counts routes built, created and published. `coverage` sums `editable` of `total` across
|
|
74
75
|
the site, `svg`, `number` and `attribute` included, and `open` counts the rows still open per
|
|
@@ -106,6 +107,7 @@ The other rows name their fix the same way:
|
|
|
106
107
|
| `derive-buttons` | `editor_setup { force: true }` mints a Button for each look the build draws, retires one it no longer draws and maps each button to its look; rename a look with `update_component` ([components.md](components.md)) |
|
|
107
108
|
| `componentize` | `set_authoring_preference` when nobody answered, then `get_componentize_plan` and `componentize_sections` ([componentize.md](componentize.md)) |
|
|
108
109
|
| `set-form-recipient` | ask the user where the form's submissions go, then `update_form` with `notifyEmails`; `update_form { ignored: true }` when it is not one of their forms |
|
|
110
|
+
| `set-dock-ui` | the last step of the repair order below: `get_component`, then `update_component` with `propUi` and `propTab` for the props the row names ([editor-chrome.md](editor-chrome.md)) |
|
|
109
111
|
|
|
110
112
|
A row nothing measured reads `unmeasured: true` with `run-setup`, and `gate.unmeasured` lists the
|
|
111
113
|
checks that have one: a release older than a count, or a project set up before setup recorded
|
|
@@ -207,8 +209,9 @@ in a sentence a person can verify. `reason: null` withdraws one.
|
|
|
207
209
|
| `decorative` | `text`, `image`, `svg` |
|
|
208
210
|
| `duplicate-track` | `text`, `image`, `link`, `svg`, `number`, `attribute` (the cloned track of a marquee or slider) |
|
|
209
211
|
| `client-only-island` | nothing: it lists an island the build cannot show, and the route still meets the bar outside it |
|
|
210
|
-
| `user-declined` | `page`, `published`, `text`, `image`, `link`, `svg`, `number`, `attribute`, `seo`, `structuredData`, `collections`, and only with the user's own words quoted in `note` (`User: "leave pricing in code"`) |
|
|
212
|
+
| `user-declined` | `page`, `published`, `text`, `image`, `link`, `svg`, `number`, `attribute`, `seo`, `structuredData`, `collections`, `dock`, and only with the user's own words quoted in `note` (`User: "leave pricing in code"`) |
|
|
211
213
|
| `document-body` | `sections`, and only on a route that places no section at all: a page that is one document (a markdown post, a legal page) |
|
|
214
|
+
| `default-controls` | `dock`, on `route: "component/<slug>"`: a component whose props read right with the dock's default controls (one short heading, a toggle); `note` says why |
|
|
212
215
|
|
|
213
216
|
Nothing else excuses `sections`, and nothing excuses `style`, `twin`, `names`, `buttons`,
|
|
214
217
|
`components` or `forms`: not the user's decision either. A name is fixed by renaming, and a form
|
|
@@ -284,6 +287,7 @@ and add the new result. Update the file as each row moves, so a reset loses at m
|
|
|
284
287
|
| 5 | Bindings: the site reads BetterCMS data and each intended leaf or attribute is bound; build, preview and runtime agree | [bindings.md](bindings.md), [frameworks.md](frameworks.md) |
|
|
285
288
|
| 6 | Behaviour: forms, links, menus, accordions, modals, consent, custom code | [forms-and-interactions.md](forms-and-interactions.md) |
|
|
286
289
|
| 7 | Discoverability: native SEO, structured data, robots and sitemap, redirects, internal links | [seo.md](seo.md) |
|
|
290
|
+
| 8 | Editor chrome, MANDATORY and last, after any import, convert, componentize or extract: load the reference, and for every component set the V2 `ui` of each prop (control, tab, group, collapsed, layout, preview, itemLabel, icon, and `propHelpText`) by playbook §14 and the nearest `bettercms://kit` entry. The gate's `dock` row stays open until it is done | [editor-chrome.md](editor-chrome.md) |
|
|
287
291
|
|
|
288
292
|
Load the step's reference when the step starts, and let it go when the step's rows are verified.
|
|
289
293
|
|
|
@@ -87,6 +87,8 @@ and `get_componentize_plan` proposes nothing more.
|
|
|
87
87
|
5. Work the rest through [finish-site.md](finish-site.md) (gap ledger, repair order, proof loop).
|
|
88
88
|
The gate's `sections` and `style` rows are part of it: a setup whose pages cannot take a new
|
|
89
89
|
section, a new order or spacing is not finished.
|
|
90
|
+
6. End Phase 3 on the editor chrome of every component (step 8 of finish-site.md's repair order,
|
|
91
|
+
[editor-chrome.md](editor-chrome.md)): the gate's `dock` row blocks until each has its V2 `ui`.
|
|
90
92
|
|
|
91
93
|
### Phase 4 — Publish and verify
|
|
92
94
|
|