Skip to main content
Glama
brilliantdirectories

brilliant-directories-mcp

Official

updateWebPage

Idempotent

Update an existing web page by ID—edit content, SEO meta, layout, hero, and access settings; cache refreshes automatically.

Instructions

Update a page - Update an existing list_seo page by seo_id. PATCH semantics - omitted fields untouched.

Cache refresh is automatic. Every successful updateWebPage / createWebPage triggers refreshCache(scope=web_pages) server-side; the response includes auto_cache_refreshed: true. Do not call refreshSiteCache manually after — it's already done. If auto_cache_refreshed: false appears in the response, the write succeeded but cache flush failed; check auto_cache_refresh_error and retry refreshSiteCache once.

Required fields: seo_id. When changing seo_type to data_category, linked_post_type is also required (auto-validated at runtime).

Disambiguation: apply Rule: Resource disambiguation when the user names a page by title or partial filename rather than by seo_id. "Edit my [X] page" is layer-ambiguous — could be a seo_type=content WebPage, a post type's code group, or a category landing.

Common edits:

  • Copy/content: content, h1, h2, seo_text, content_footer (access gate, not HTML)

  • SEO meta: title, meta_desc, meta_keywords

  • Social (Open Graph): facebook_title, facebook_desc, facebook_image

  • Layout: content_layout, hide_header, hide_footer, hide_top_right, hide_header_links

  • Hero: enable_hero_section + hero_* + h1_*/h2_*

Misnamed fields (BD repurposed these columns - name is misleading):

  • show_form -> Apply NoIndex,NoFollow. NOT a contact-form toggle. 1=add <meta name="robots" content="noindex,nofollow">.

  • content_footer -> page access gate enum: "" (public) / "members_only" / "digital_products". NOT footer HTML.

  • form_name -> sidebar name. NOT a contact-form slug.

  • seo_text -> Wildcard URL Rewrite (catch-all routing). NOT SEO copy.

Template tokens supported in title, meta_desc, meta_keywords, h1, h2: %%%website_name%%%, %industry%, %profession%. Expanded at render time.

Changing filename (URL slug) breaks inbound links - call createRedirect to create a 301 from old slug -> new slug, preserve SEO. Pre-check new slug for duplicate before renaming - listWebPages property=filename property_value=<new-slug> property_operator==. BD does NOT enforce unique filename; renaming to an existing slug silently creates two records at the same URL, render order undefined.

Asset field routing (Froala strips mismatched content silently):

  • content - body HTML only. No <style>/<script> tags. Supports [widget=Name] + %%%token%%%.

  • content_css - raw CSS, no <style> wrapper, scope to a unique page class. Never target .container/.froala-table/.image-placeholder. Never @import (causes FOUC/CLS - use content_head <link> tag instead).

  • content_footer_html - JavaScript + script embeds (<script> tags OK). IIFE-wrap + scope.

  • content_head - head-only deps (<link>, <meta>, JSON-LD, external stylesheets, fonts).

  • content_footer - MISLEADING NAME. Access gate enum only: ""/"members_only"/"digital_products". NOT HTML.

  • SVG/canvas prohibited in content - Froala strips. Charts/diagrams -> custom Widget via [widget=Name].

All asset fields accept raw content verbatim. No CDATA, no <parameter>/<invoke>/<function_calls> scaffolding, no entity-escaped HTML — forbidden anywhere in the value, not just as wrappers. Server strips these as a safety net; do not rely on it.

EAV-stored fields — auto-routed by the wrapper, no special handling. BD's list_seo table mixes direct columns with EAV-stored fields in users_meta. BD's REST API itself silently ignores EAV fields on update, but the wrapper auto-detects fields like hero_*, h1_*, h2_*, linked_post_category, disable_* and routes them through users_meta automatically. Pass any field on updateWebPage directly — the response includes an eav_results array confirming which EAV fields were written. Reads merge automatically via getWebPage / listWebPages. Do NOT call updateUserMeta directly for these. If a field doesn't persist after updateWebPage, file as a wrapper bug (the wrapper's EAV routing table needs the field added) rather than working around with manual updateUserMeta.

Hero section — which hero does the user mean? Read the page's current enable_hero_section first. 1/2 = the user means this programmatic hero: change the relevant hero_* field to restyle, or set enable_hero_section=0 to remove it — do NOT rewrite content to remove a programmatic hero. 0 = no programmatic hero is rendering, so a hero the user references lives in content — edit content. If hero markup is also in content, or the user is ADDING a hero, ask which they mean.

**Hero section edits - when enable_hero_section toggles from 0/unset to 1 or 2, apply Rule: Hero readability bundle (atomic — all listed values must be sent together unless user overrides). Notes:

  • All color fields RGB ONLY, hex rejected.

  • h1_*/h2_* fields style hero; text comes from record's top-level h1/h2.

  • Hero image: Pexels stock; see Rule: Image URLs (imported field — bare URL, no query string). Never picsum.photos/lorempixel/placekitten.

  • Hero gap-fix CSS (seo_type=content ONLY): add .hero_section_container + div.clearfix-lg {display:none} to content_css (closes BD's 40px clearfix gap). Never add this rule on any other seo_type - on profile_search_results / data_category the clearfix provides needed spacing before live search-results.

  • Hero is cache-gated but updateWebPage/createWebPage auto-refresh handles it; no separate call needed.

  • Homepage hero is BENIGN: seo_id=1 stores hero fields but homepage template does NOT render them. Skip hero fields on homepage unless user explicitly asks.

Do NOT re-apply hero defaults on updates that don't touch enable_hero_section - respect the user's existing color/overlay/padding values; only change what they asked about.

H1/H2 double-render trap: when hero is enabled (enable_hero_section=1 or 2), the record's top-level h1/h2 text renders inside the hero banner. If content ALSO contains <h1>/<h2>, BOTH render -> duplicate headings (bad for SEO). Rule: either put headings in record's h1/h2 fields (leave them out of content), OR put them in content (leave h1/h2 fields empty). Never both.

profile_search_results updates - all create-time rules apply:

  • filename must be a real dynamic slug BD's router recognizes — see Rule: Member search SEO pages for the slug hierarchy (country/state/city/top_cat/sub_cat) and the live-lookup endpoints. Arbitrary slugs render 404. Country-only slug does NOT render for profile_search_results. For arbitrary-URL pages use seo_type=content.

  • Required defaults on every write: custom_html_placement=4 (Below Body Content), form_name="Member Search Result" (sidebar - Master Default; NOT "Member Profile Page"), menu_layout=3 (Left Slim).

  • custom_html_placement is only meaningful on profile_search_results (and data_category). Ignored on content pages.

  • Auto-generate SEO meta for the specific combo - don't leave blank:

    • title - 50-60 chars ideal, <=70 max. Pattern: "[Category] in [City], [State] | [Site Name]".

    • meta_desc - 150-160 chars ideal, <=170 max. 1-2 sentences with location + CTA.

    • meta_keywords - ~200 chars, comma-separated (no spaces).

    • facebook_title - 55-60 chars, differ from title (more conversational).

    • facebook_desc - 110-125 chars, punchier than meta_desc.

    • Do NOT auto-set facebook_image (needs uploaded asset).

  • No max-width wrappers in content or content_css - BD's layout already provides the outer container; max-width: 960px; margin: auto double-constrains to a narrow strip. Let content flow at natural width.

SEO content for categories: route to updateWebPage seo_type=profile_search_results (NOT updateTopCategory.desc / updateSubCategory.desc - those are internal labels, not rendered).

seo_type enum: content, home, profile_search_results, data_category, custom_widget_page, password_retrieval_page, unsubscribed. OMIT on update unless intentionally changing it — most changes are destructive. home appears in the enum only so existing-record round-trips pass validation; never convert another page TO home (only one homepage per site).

On deleteWebPage: BD does NOT cascade-delete users_meta rows. After deleting, run the orphan cleanup per Rule: users_meta orphans - listUserMeta filtered by database=list_seo + database_id=<deleted seo_id>, then deleteUserMeta each match. Exception: for seo_type=data_category pages the wrapper auto-strips linked_post_type / linked_post_category rows on transition AWAY from data_category, AND auto-cascade-deletes the placeholder-slug 301 redirect on deleteWebPage (annotations: _data_category_orphans_stripped, _data_category_redirect_retired, _data_category_redirect_deleted). Hero / layout EAV rows still need manual cleanup.

See also: createWebPage (new page), deleteWebPage (remove + orphan users_meta cleanup), createRedirect (slug-change preservation).

Returns: { status: "success", message: {...updatedRecord}, auto_cache_refreshed: true|false, auto_cache_refresh_error?: "...", _admin_edit_url: "..." }. auto_cache_refreshed reports whether the automatic cache flush succeeded; if false, auto_cache_refresh_error explains why and the agent should retry refreshSiteCache manually once. _admin_edit_url is a centralized-admin deep-link to the WebPage editor for this seo_id — surface it to the user so they can jump straight to the admin edit screen for the page just updated.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
h1No**H1 Heading** - Supports template tokens. Rendered as the page's main heading. H1 heading - supports template tokens
h2No**H2 Heading** - Supports template tokens. H2 heading - supports template tokens
titleNo**Page Meta Title** - Supports template tokens: `%%%website_name%%%`, `%industry%`, `%profession%`, etc. ~30-60 chars recommended. HTML title tag - supports template tokens like %%%website_name%%%
seo_idYesPage primary key (required to identify record)
contentNoMain page body - Froala rich-text editor. **Shortcodes:** `[form=<form_name>]` embeds a BD form; `[widget=<widget_name>]` embeds a widget; `%%%template_tokens%%%` for site vars. **HTML only** - Froala strips `<style>`, `<script>`, `<form>`, `<input>`, `<select>`, `<textarea>`, `contenteditable=`, AND inline `style="..."` attributes on save. Route all non-body assets to their dedicated fields: CSS -> `content_css` (target classes, not inline styles), JS -> `content_footer_html`, head deps (`<link>`, fonts, `<meta>`, JSON-LD) -> `content_head`. SVG/canvas also stripped; for charts/diagrams use a custom Widget embedded via `[widget=Name]` shortcode.
filenameNoURL slug (e.g. home, about-us). Renaming to a slug already used by any web page, top category, sub category, plan public URL, or member profile slug is auto-rejected — pick a different slug or rename the conflict first.
nicknameNoHuman-readable label shown in admin panel
seo_textNo**Wildcard URL Rewrite.** `1` = any URL within this directory routes to this web page (catch-all behavior). Misnamed field - NOT SEO copy; SEO copy goes in `content` + meta fields.
seo_typeNoPage type identifier. On update, safest to OMIT this field unless intentionally changing it (most seo_type changes are destructive). Values: content = Single Web Page (generic static/landing page) data_category = Post Search Results profile_search_results = Member Search Results custom_widget_page = Custom Widget as Web Page password_retrieval_page = Password Retrieval Page unsubscribed = Unsubscribed Page home = Homepage (system-seeded; included here so an update round-trip of the existing homepage record passes the enum check)
form_nameNo**SIDEBAR name** for this page - BD's field is misnamed; controls sidebar slot, NOT a contact form. NOT for rendering forms on this page — to embed a form in the body, use `[form=<form_name>]` inside `content`. Pass exact sidebar `name` string. `""` = no sidebar. Valid values: a Master Default Sidebar OR a custom sidebar `name` from `listSidebars`. See **Rule: Sidebars** for the canonical Master Default list and selection workflow. `menu_layout` controls position when `form_name` is set. **Default on `profile_search_results` pages:** `Member Search Result` (NOT `Member Profile Page` - that's for profile/detail pages, not search results).
meta_descNo**Meta Description** - Supports template tokens. ~150-160 chars recommended for search snippets. Meta description - supports template tokens
show_formNo**Apply NoIndex,NoFollow.** `1` = adds `<meta name="robots" content="noindex,nofollow">` to the page. Auto-applied to protected pages. **NOT a form-render toggle** despite the field name — BD repurposed this column. To render a form in the body, use `[form=<form_name>]` inside `content`.
breadcrumbNo**OMIT** — BD auto-generates the breadcrumb trail. Never set this yourself; a manual value overrides BD's generated trail and breaks the page.
hero_imageNoHero background image. Accepts BD-hosted relative path (`/images/bg202.webp`) OR external URL (`https://cdn.example.com/banner.jpg`) — external URLs render hotlinked on WebPages, no `auto_image_import` needed. **LANDSCAPE only — verify orientation via `getImageDimensions` per **Rule: Image dimensions** before commit; bare URL, no `?query`, must end in `.jpg`/`.jpeg`/`.png` (WebP/GIF/AVIF skipped pre-tool per the same rule) — see **Rule: Image URLs**.** Query strings get truncated/mangled in BD's form-urlencoded parsing and the stored URL becomes invalid. Recommended dimensions: 1800 × 600 px.
content_cssNoCustom CSS for this page. Paste raw CSS rules directly - NO `<style>` wrapper. Renders in page `<head>` at load. Scope every selector to a unique page class/ID (e.g. `.my-about-page h2 { ... }`) - bare `body`/`h1`/`p` affect the whole site. Never target reserved BD classes: `.container`, `.froala-table`, `.image-placeholder`. Never `@import` (FOUC/CLS) - load external stylesheets/fonts via `<link>` tag in `content_head`. **Admin Froala editor gotcha** - editor applies `content_css` but does NOT run `content_footer_html` JS. Hide-by-default CSS (scroll reveals, tab panels, accordion collapsed, modal hidden, slider non-active slides) will permanently hide content in the editor. Gate such rules behind a `.js-ready` class that `content_footer_html` JS adds on load: `.my-page.js-ready .reveal { opacity:0 }` NOT `.my-page .reveal { opacity:0 }`. The paired JS rule lives in the `content_footer_html` field.
hide_footerNo**Hide Footer** - 1 = hides the site footer on this page.
hide_headerNo**Hide Header** - 1 = hides the full site header on this page.
menu_layoutNoSidebar position + width (integer). Only effective when the page has a sidebar set via `form_name` - ignored without sidebar. NOT a navigation menu layout despite the field name. - `1` = Left Wide (BD default when unspecified) - `2` = Right Wide - `3` = Left Slim - `4` = Right Slim Ordering is NOT sequential by side - left positions are `1` and `3`, right are `2` and `4`. **Default on `profile_search_results` pages:** `3` (Left Slim). On `content` pages, omit unless user specifies (BD defaults to `1`).
content_headNoPage-scoped `<head>` dependencies - rendered inside `<head>`. Use for: `<link>` tags (external stylesheets, preconnect hints, canonical overrides, Google Fonts), `<meta>` tags beyond standard SEO fields, verification tags, JSON-LD structured data (`<script type="application/ld+json">`), head-required third-party scripts (rare - prefer `content_footer_html` for most JS).
content_menuNoMenu section this page belongs to
h1_font_sizeNoMain title (H1) font size in pixels. Accepts integer values from `30` to `80`. OMIT to inherit BD's per-`seo_type` default.
h2_font_sizeNoSub-title (H2) font size in pixels. Accepts integer values from `20` to `60`. OMIT to inherit BD's per-`seo_type` default.
org_templateNo**OMIT** — internal layout reference. No public lookup endpoint; setting an arbitrary value can render the page against a nonexistent layout.
_clear_fieldsNoColumn names to clear to empty string. Available on every `update*` operation. Works on base columns AND EAV/`users_meta` rows (rows preserved with `value=""`). To actually clear a field you MUST use this parameter — sending the field with `""` alone is a no-op (BD drops empty values). To remove a `users_meta` row entirely, use `deleteUserMeta`. See **Rule: Clearing fields**. Example: `_clear_fields: ["h2", "hero_link_url"]`.
content_groupNoAdmin-panel grouping label
content_orderNoSort order within menu/section
facebook_descNo**Social Media Description (Open Graph)** - Description shown on social shares. Open Graph description
h1_font_colorNoMain title (H1) font color in the hero. RGB format ONLY - e.g. `rgb(255, 255, 255)`. The H1 text itself comes from the page's `h1` field - these `h1_*` fields control ONLY the hero's H1 styling. Wrapper auto-fills `rgb(255, 255, 255)` on hero off→on transition (part of **Rule: Hero readability bundle**).
h2_font_colorNoSub-title (H2) font color in the hero. RGB format ONLY - e.g. `rgb(255, 255, 255)`. The H2 text itself comes from the page's `h2` field. Wrapper auto-fills `rgb(255, 255, 255)` on hero off→on transition (part of **Rule: Hero readability bundle**).
hero_link_urlNoHero call-to-action (CTA) button link URL. If empty, no CTA button is rendered. For internal links, a relative path is fine (e.g. `/signup`); for external, full URL with `http://` or `https://`.
meta_keywordsNo**Meta Keywords** - Supports template tokens (comma-separated). Meta keywords - supports template tokens
content_footerNo**MISLEADING NAME - NOT page footer HTML.** Misnamed relic column; BD repurposed as the **page-access gate**: - `""` (default) = Public For Everyone - `"members_only"` = Logged-in members only (non-members hit login/signup wall) - `"digital_products"` = Only buyers of digital-product items Finer rules (which members, which plans) live in other fields. Do NOT put HTML here. Page body -> `content`; scripts -> `content_footer_html`. No dedicated "below-body HTML" field - put below-body markup inside `content` itself.
content_layoutNo**Full Screen Page Width override.** OMIT for normal pages (BD's default container width). Set to `1` for full-bleed pages — individual sections in `content` can then break edge-to-edge (background bands, hero strips, viewport-wide images). **For full-bleed sections, set `content_layout=1` FIRST.** Do NOT fake full-bleed with negative-margin/9999px-padding tricks in `content_css` — breaks horizontal scroll, fights `overflow: hidden` parents, prevents future layout changes. Anti-pattern. Pattern with `content_layout=1`: scoped CSS in `content_css` gives each section its own edge-to-edge background; inner `<div class="container">` (or page-scoped max-width wrapper) keeps readable copy centered.
facebook_imageNo**Social Media Shared Image** - URL/filename of the OG image. BD recommends at least 200×200px. Open Graph image URL
facebook_titleNo**Social Media Title (Open Graph)** - Title shown when the page is shared on Facebook/LinkedIn/etc. Open Graph title for social sharing
h1_font_weightNoMain title (H1) font weight. `300`=Light, `400`=Normal (default), `600`=Bold, `800`=Extra Bold.
h2_font_weightNoSub-title (H2) font weight. `300`=Light, `400`=Normal, `600`=Bold (default), `800`=Extra Bold.
hero_alignmentNoHorizontal alignment of the hero title/subtitle/content text block within its column. Default `center`.
hero_link_sizeNoCTA button size. MUST be exactly one of: `""` (empty = Normal), `btn-lg` (Large), `btn-xl` (Extra Large). Any other value (e.g. a font-size number like `16`) is stored verbatim and rendered as a broken class — BD does not validate server-side.
hero_link_textNoHero CTA button label. Required (non-empty) for the button to render - `hero_link_url` alone without text will not produce a button.
hide_top_rightNo**Hide Top Header Menu** - 1 = hides the top-right nav cluster (account/login links).
content_sidebarNoSidebar configuration or widget shortcode
hero_link_colorNoCTA button color variant — attention level, not literal color. MUST be exactly one of: `primary`, `info`, `success`, `warning`, `danger`, `default`, `secondary`. Any other value (e.g. a hex `#ffffff`) is stored verbatim and rendered as a broken class like `btn-#ffffff` — BD does not validate server-side. Choose by attention level needed: `primary` (main CTA), `danger` (urgent/can't-miss), `warning` (attention), `success` (positive action), `info` (neutral-blue), `secondary` (theme secondary), `default` (low-emphasis gray). Actual rendered color comes from the site's theme palette.
allowed_productsNoComma-separated plan/product IDs (empty = all plans)
hero_top_paddingNoTop padding inside the hero banner, in pixels. Accepts multiples of 10 from `0` to `200`. BD field default `70` — wrapper auto-fills `100` on hero off→on transition (part of **Rule: Hero readability bundle**).
linked_post_typeNoPost type's `data_id` (from `listPostTypes`). REQUIRED when `seo_type=data_category`; ignored on other seo_types. See **Rule: Resource disambiguation** when the user names a post type by description rather than `data_id`.
hero_column_widthNoHero text-content column width as Bootstrap 12-col span. `3`=25%, `4`=30%, `5`=40%, `6`=50%, `7`=60%, `8`=70%, `9`=75%, `10`=80%, `11`=90%, `12`=100%. Narrower = more side padding around the text block. BD field default `8` — wrapper auto-fills `5` on hero off→on transition (part of **Rule: Hero readability bundle**).
hide_header_linksNo**Hide Main Menu** - 1 = hides the main navigation menu on this page.
page_render_widgetNo**OMIT** — internal widget reference for `seo_type=custom_widget_page` only. No public widget-ID lookup; setting on other page types breaks rendering.
content_footer_htmlNoPage-scoped JavaScript + script embeds - rendered before `</body>`. `<script>` tags accepted here (unlike `content`). jQuery loaded globally. Wrap JS in an IIFE `(function($){ ... })(jQuery);` and scope selectors to a unique page class. Also for third-party script embeds (analytics pixels, chat widgets, schema markup). NOT for extra body HTML - `content` is the body field. **If `content_css` uses a `.js-ready` gate for hide-by-default effects** (scroll reveals, tab panels, accordion collapse, modal hidden, slider non-active), JS MUST add that class to the page wrapper as the FIRST line (before any other init code): `document.querySelector('.my-page')?.classList.add('js-ready');`. The admin Froala editor applies CSS but does NOT run this field's JS, so without the gate, hide-rules make content permanently invisible in the editor.
enable_hero_sectionNoHero banner master switch: - `0` = disabled (all other `hero_*`/`h1_font_*`/`h2_font_*` ignored at render; stored values preserved for later toggle-back) - `1` = enabled all devices - `2` = enabled desktop, hidden mobile **On hero off→on transition (`0`/unset → `1`/`2`), wrapper auto-fills the hero readability bundle** — `hero_top_padding=100`, `hero_bottom_padding=100`, `hero_column_width=5`, `hero_content_overlay_color=rgb(0, 0, 0)`, `hero_content_overlay_opacity=0.5`, `hero_content_font_color=rgb(255, 255, 255)`, `hero_content_font_size=18`, `h1_font_color=rgb(255, 255, 255)`, `h2_font_color=rgb(255, 255, 255)` — for any of those 9 fields you OMITTED. BD's per-field defaults render an unreadable hero (10px content text on a 0.4-opacity overlay, default top/bottom padding 70/60 — visually too cramped for most banner imagery); the bundle is the canonical readable recipe. User-supplied values pass through untouched. Filled fields are echoed in `_hero_bundle_autofilled`. **`hero_image` is required** on transition — wrapper rejects if missing (no safe default; walk the image-sourcing ladder). On no-transition updates (hero already on), no auto-fill fires. **Homepage benign** - `seo_type=home` ignores hero fields entirely regardless of value. BD stores but never renders on homepage; skip all `hero_*` fields on homepage updates.
hero_bottom_paddingNoBottom padding inside the hero banner, in pixels. Accepts multiples of 10 from `0` to `200`. BD field default `60` — wrapper auto-fills `100` on hero off→on transition (part of **Rule: Hero readability bundle**).
hero_hide_banner_adNoWhen `1`, suppresses the site-wide "Below Header Banner Ad" on THIS page only (useful when the hero visually replaces that slot). `0` (default) keeps the banner ad in its normal position.
private_page_selectNoAccess control setting
hero_section_contentNoAdditional text / HTML / widget shortcode rendered BELOW H1 and H2 in the hero section. Supports `[widget=Name]` shortcodes. EAV-routed by the wrapper — pass on `createWebPage` / `updateWebPage` directly, no manual `updateUserMeta` needed.
linked_post_categoryNoEither the literal `post_main_page` (pins to the post type's main search-results page) OR an exact category name from the linked post type's `feature_categories` (e.g. `"Category 1"`, case-sensitive). Optional on `seo_type=data_category` — wrapper auto-defaults to `post_main_page` when omitted on a fresh data_category create or content→data_category switch. Ignored on other seo_types. Wrapper enforces pair-uniqueness on `(linked_post_type, linked_post_category)`.
custom_html_placementNoRender position of `content` HTML relative to dynamic search results. Only meaningful on `seo_type=profile_search_results` (and `data_category`); ignored on `content` pages. - `0` = Inside Tab (content + members in separate nav tabs) - `1` = Above Member Results (within results container, sidebar-width) - `2` = Below Member Results (within results container) - `3` = Above Body Content (full page width, spans sidebar+results) - `4` = Below Body Content (full page width, below sidebar+results) <- **recommended default for AI-generated SEO pages** For boilerplate SEO intro/FAQ/local copy bolstering thin pages, `4` renders full-width below the live results without disrupting member-facing UX.
hero_content_font_sizeNoFont size in pixels for the additional hero content block (`hero_section_content`). Accepts integer values from `10` to `30`. BD field default `10` is too small for hero paragraph copy — wrapper auto-fills `18` on hero off→on transition (part of **Rule: Hero readability bundle**).
hero_link_target_blankNoWhen `1`, opens the CTA link in a new tab (`target="_blank"`). `0` (default) opens in the same tab.
disable_css_stylesheetsNoDisable BD's site stylesheets on this page (frontend only). `1` = page renders without BD's global CSS (use when embedding a fully self-styled custom page or iframe target). `0` (default) = normal BD styling. EAV-stored — agent passes directly; wrapper handles routing on update.
hero_content_font_colorNoFont color for the additional hero content block rendered below H1/H2 (the `hero_section_content` field). RGB format ONLY - e.g. `rgb(0, 0, 0)`. Wrapper auto-fills `rgb(255, 255, 255)` on hero off→on transition (part of **Rule: Hero readability bundle**).
hero_background_image_sizeNoControls how the hero background image scales/crops across devices. `mobile-ready` (recommended) = responsive behavior tuned for mobile, `standard` = fixed-ratio behavior.
hero_content_overlay_colorNoSemi-transparent color layer between hero background image and text, for legibility over busy images. **RGB format ONLY** - `rgb(0, 0, 0)` or `rgb(255, 255, 255)`. Hex (`#000000`) NOT accepted. Combine with `hero_content_overlay_opacity` to control strength. Wrapper auto-fills `rgb(0, 0, 0)` on hero off→on transition (part of **Rule: Hero readability bundle**).
hero_content_overlay_opacityNoOpacity of `hero_content_overlay_color` layer, 0.1 increments from `0.0` (transparent) to `1` (opaque). Admin UI labels 0-10. BD field default `0.4` is too transparent — wrapper auto-fills `0.5` on hero off→on transition (part of **Rule: Hero readability bundle**). EAV-routed by the wrapper — pass on `updateWebPage` directly, no manual `updateUserMeta` needed.

Schema Changelog

Changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. Addedv6.55.39
  2. Removedv6.55.19
  3. Addedv6.49.4
  4. Removedv6.48.1
  5. Addedv6.0.19
  6. Removedv6.0.18
  7. Changed6 schema fields changedv6.0.16
    • changedInput schema / properties / breadcrumb / description
      Previous value: -"OMIT — BD auto-generates the breadcrumb trail. Never set this yourself; a manual value overrides BD's generated trail and breaks the page."New value: +"**OMIT** — BD auto-generates the breadcrumb trail. Never set this yourself; a manual value overrides BD's generated trail and breaks the page."
    • removedInput schema / properties / date_updated
      Removed value: -{
      -  "description": "Last-update timestamp driving admin-UI \"Last Update\" display. Format: `YYYYMMDDHHmmss` (14-digit, no separators - e.g. `20260214232533`).\n\n**Required on every `createWebPage` / `updateWebPage` call** - always set to CURRENT timestamp at call time (unless backfilling historical migration data). BD does NOT auto-populate; omitting it leaves the admin UI showing blank/stale.",
      -  "type": "string"
      -}
    • changedInput schema / properties / hero_image / description
      Previous value: -"Hero background image. Accepts BD-hosted relative path (`/images/bg202.webp`) OR external URL (`https://cdn.example.com/banner.jpg`) — external URLs render hotlinked on WebPages, no `auto_image_import` needed. **LANDSCAPE only — never portrait/vertical. Bare URL — no `?query`, must end in `.jpg`/`.jpeg`/`.png`/`.webp`.** Query strings get truncated/mangled in BD's form-urlencoded parsing and the stored URL becomes invalid. Recommended dimensions: 1800 × 600 px."New value: +"Hero background image. Accepts BD-hosted relative path (`/images/bg202.webp`) OR external URL (`https://cdn.example.com/banner.jpg`) — external URLs render hotlinked on WebPages, no `auto_image_import` needed. **LANDSCAPE only — never portrait/vertical; source via `https://www.pexels.com/search/<term>/?orientation=landscape`; bare URL, no `?query`, must end in `.jpg`/`.jpeg`/`.png`/`.webp` — see image URL rule.** Query strings get truncated/mangled in BD's form-urlencoded parsing and the stored URL becomes invalid. Recommended dimensions: 1800 × 600 px."
    • changedInput schema / properties / org_template / description
      Previous value: -"OMIT — internal layout reference. No public lookup endpoint; setting an arbitrary value can render the page against a nonexistent layout."New value: +"**OMIT** — internal layout reference. No public lookup endpoint; setting an arbitrary value can render the page against a nonexistent layout."
    • changedInput schema / properties / page_render_widget / description
      Previous value: -"OMIT — internal widget reference for `seo_type=custom_widget_page` only. No public widget-ID lookup; setting on other page types breaks rendering."New value: +"**OMIT** — internal widget reference for `seo_type=custom_widget_page` only. No public widget-ID lookup; setting on other page types breaks rendering."
    • changedInput schema / required
      Previous value: -[
      -  "seo_id",
      -  "date_updated"
      -]New value: +[
      +  "seo_id"
      +]
  8. Changed11 schema fields changedv6.0.15
    • changedInput schema / properties / enable_hero_section / description
      Previous value: -"Hero banner master switch:\n\n- `0` = disabled (all other `hero_*`/`h1_font_*`/`h2_font_*` ignored at render; stored values preserved for later toggle-back)\n\n- `1` = enabled all devices\n\n- `2` = enabled desktop, hidden mobile\n\n**Homepage benign** - `seo_type=home` ignores hero fields entirely regardless of value. BD stores but never renders on homepage; skip all `hero_*` fields on homepage updates."New value: +"Hero banner master switch:\n\n- `0` = disabled (all other `hero_*`/`h1_font_*`/`h2_font_*` ignored at render; stored values preserved for later toggle-back)\n\n- `1` = enabled all devices\n\n- `2` = enabled desktop, hidden mobile\n\n**On hero off→on transition (`0`/unset → `1`/`2`), wrapper auto-fills the hero readability bundle** — `hero_top_padding=100`, `hero_bottom_padding=100`, `hero_column_width=5`, `hero_content_overlay_color=rgb(0, 0, 0)`, `hero_content_overlay_opacity=0.5`, `hero_content_font_color=rgb(255, 255, 255)`, `hero_content_font_size=18`, `h1_font_color=rgb(255, 255, 255)`, `h2_font_color=rgb(255, 255, 255)` — for any of those 9 fields you OMITTED. BD's per-field defaults render an unreadable hero (10px text, 0.4 transparent overlay, 0px padding); the bundle is the canonical readable recipe. User-supplied values pass through untouched. Filled fields are echoed in `_hero_bundle_autofilled`. **`hero_image` is required** on transition — wrapper rejects if missing (no safe default; walk the image-sourcing ladder). On no-transition updates (hero already on), no auto-fill fires.\n\n**Homepage benign** - `seo_type=home` ignores hero fields entirely regardless of value. BD stores but never renders on homepage; skip all `hero_*` fields on homepage updates."
    • changedInput schema / properties / form_name / description
      Previous value: -"**SIDEBAR name** for this page - BD's field is misnamed; controls sidebar slot, NOT a contact form. Pass exact sidebar `name` string. `\"\"` = no sidebar.\n\n**Master Default Sidebars** (always available, NOT in `listSidebars` - hardcoded in BD core): `Global Website Search`, `Member Profile Page`, `Member Search Result`, `Personal Post Feed`, `Post Search Result`, `Post Single Page`. Custom sidebars via `listSidebars` (returns site-local only). Unknown name -> no sidebar rendered; ask user to pick from available.\n\n`menu_layout` controls position when `form_name` is set. **Default on `profile_search_results` pages:** `Member Search Result` (NOT `Member Profile Page` - that's for profile/detail pages, not search results)."New value: +"**SIDEBAR name** for this page - BD's field is misnamed; controls sidebar slot, NOT a contact form. Pass exact sidebar `name` string. `\"\"` = no sidebar. Valid values: a Master Default Sidebar OR a custom sidebar `name` from `listSidebars`. See the **Sidebars** rule in the corpus for the canonical Master Default list and selection workflow.\n\n`menu_layout` controls position when `form_name` is set. **Default on `profile_search_results` pages:** `Member Search Result` (NOT `Member Profile Page` - that's for profile/detail pages, not search results)."
    • changedInput schema / properties / h1_font_color / description
      Previous value: -"Main title (H1) font color in the hero. RGB format ONLY - e.g. `rgb(255,255,255)`. The H1 text itself comes from the page's `h1` field - these `h1_*` fields control ONLY the hero's H1 styling."New value: +"Main title (H1) font color in the hero. RGB format ONLY - e.g. `rgb(255,255,255)`. The H1 text itself comes from the page's `h1` field - these `h1_*` fields control ONLY the hero's H1 styling. Wrapper auto-fills `rgb(255, 255, 255)` on hero off→on transition (part of the hero readability bundle — see `enable_hero_section`)."
    • changedInput schema / properties / h2_font_color / description
      Previous value: -"Sub-title (H2) font color in the hero. RGB format ONLY - e.g. `rgb(255,255,255)`. The H2 text itself comes from the page's `h2` field."New value: +"Sub-title (H2) font color in the hero. RGB format ONLY - e.g. `rgb(255,255,255)`. The H2 text itself comes from the page's `h2` field. Wrapper auto-fills `rgb(255, 255, 255)` on hero off→on transition (part of the hero readability bundle — see `enable_hero_section`)."
    • changedInput schema / properties / hero_bottom_padding / description
      Previous value: -"Bottom padding inside the hero banner, in pixels. Accepts multiples of 10 from `0` to `200`. Default `60`."New value: +"Bottom padding inside the hero banner, in pixels. Accepts multiples of 10 from `0` to `200`. BD field default `60` — wrapper auto-fills `100` on hero off→on transition (part of the hero readability bundle — see `enable_hero_section`)."
    • changedInput schema / properties / hero_column_width / description
      Previous value: -"Hero text-content column width as Bootstrap 12-col span. `3`=25%, `4`=30%, `5`=40%, `6`=50%, `7`=60%, `8`=70% (default), `9`=75%, `10`=80%, `11`=90%, `12`=100%. Narrower = more side padding around the text block."New value: +"Hero text-content column width as Bootstrap 12-col span. `3`=25%, `4`=30%, `5`=40%, `6`=50%, `7`=60%, `8`=70%, `9`=75%, `10`=80%, `11`=90%, `12`=100%. Narrower = more side padding around the text block. BD field default `8` — wrapper auto-fills `5` on hero off→on transition (part of the hero readability bundle — see `enable_hero_section`)."
    • changedInput schema / properties / hero_content_font_color / description
      Previous value: -"Font color for the additional hero content block rendered below H1/H2 (the `hero_section_content` field). RGB format ONLY - e.g. `rgb(0,0,0)`."New value: +"Font color for the additional hero content block rendered below H1/H2 (the `hero_section_content` field). RGB format ONLY - e.g. `rgb(0,0,0)`. Wrapper auto-fills `rgb(255, 255, 255)` on hero off→on transition (part of the hero readability bundle — see `enable_hero_section`)."
    • changedInput schema / properties / hero_content_font_size / description
      Previous value: -"Font size in pixels for the additional hero content block (`hero_section_content`). Accepts integer values from `10` to `30`. `10` is BD's default but renders too small for hero paragraph copy; use `15`-`18`."New value: +"Font size in pixels for the additional hero content block (`hero_section_content`). Accepts integer values from `10` to `30`. BD field default `10` is too small for hero paragraph copy — wrapper auto-fills `18` on hero off→on transition (part of the hero readability bundle — see `enable_hero_section`)."
    • changedInput schema / properties / hero_content_overlay_color / description
      Previous value: -"Semi-transparent color layer between hero background image and text, for legibility over busy images. **RGB format ONLY** - `rgb(0,0,0)` or `rgb(255,255,255)`. Hex (`#000000`) NOT accepted. Combine with `hero_content_overlay_opacity` to control strength."New value: +"Semi-transparent color layer between hero background image and text, for legibility over busy images. **RGB format ONLY** - `rgb(0,0,0)` or `rgb(255,255,255)`. Hex (`#000000`) NOT accepted. Combine with `hero_content_overlay_opacity` to control strength. Wrapper auto-fills `rgb(0, 0, 0)` on hero off→on transition (part of the hero readability bundle — see `enable_hero_section`)."
    • changedInput schema / properties / hero_content_overlay_opacity / description
      Previous value: -"Opacity of `hero_content_overlay_color` layer, 0.1 increments from `0.0` (transparent) to `1` (opaque). Admin UI labels 0-10. Default `0.4`. EAV-routed by the wrapper — pass on `updateWebPage` directly, no manual `updateUserMeta` needed."New value: +"Opacity of `hero_content_overlay_color` layer, 0.1 increments from `0.0` (transparent) to `1` (opaque). Admin UI labels 0-10. BD field default `0.4` is too transparent — wrapper auto-fills `0.5` on hero off→on transition (part of the hero readability bundle — see `enable_hero_section`). EAV-routed by the wrapper — pass on `updateWebPage` directly, no manual `updateUserMeta` needed."
    • changedInput schema / properties / hero_top_padding / description
      Previous value: -"Top padding inside the hero banner, in pixels. Accepts multiples of 10 from `0` to `200` (i.e. `0`, `10`, `20`, ..., `200`). Default `70`."New value: +"Top padding inside the hero banner, in pixels. Accepts multiples of 10 from `0` to `200`. BD field default `70` — wrapper auto-fills `100` on hero off→on transition (part of the hero readability bundle — see `enable_hero_section`)."
  9. Changed12 schema fields changedv6.0.14
    • changedInput schema / properties / breadcrumb / description
      Previous value: -"OMIT — do not set unless user explicitly requests it. BD auto-generates the breadcrumb trail; manual override locks it to a static string that breaks when page context changes."New value: +"OMIT — BD auto-generates the breadcrumb trail. Never set this yourself; a manual value overrides BD's generated trail and breaks the page."
    • removedInput schema / properties / content_active
      Removed value: -{
      -  "description": "1 = active, 0 = hidden",
      -  "enum": [
      -    0,
      -    1
      -  ],
      -  "type": "integer"
      -}
    • changedInput schema / properties / content_layout / description
      Previous value: -"**Full Screen Page Width.** `0` (default) = content stays inside BD's normal max-width container. `1` = full-screen width; individual sections in `content` can break edge-to-edge (full-bleed background bands, hero-style strips, viewport-wide images).\n\n**For full-bleed sections, set `content_layout=1` FIRST.** Do NOT fake it with negative-margin/9999px-padding tricks in `content_css` - breaks horizontal scroll, fights `overflow: hidden` parents, prevents future layout changes. Anti-pattern.\n\nPattern with `content_layout=1`: scoped CSS in `content_css` gives each section its own edge-to-edge background; inner `<div class=\"container\">` (or page-scoped max-width wrapper) keeps readable copy centered. Only use when the page has sections DESIGNED edge-to-edge; plain content pages don't need it."New value: +"**Full Screen Page Width override.** OMIT for normal pages (BD's default container width). Set to `1` for full-bleed pages — individual sections in `content` can then break edge-to-edge (background bands, hero strips, viewport-wide images).\n\n**For full-bleed sections, set `content_layout=1` FIRST.** Do NOT fake full-bleed with negative-margin/9999px-padding tricks in `content_css` — breaks horizontal scroll, fights `overflow: hidden` parents, prevents future layout changes. Anti-pattern.\n\nPattern with `content_layout=1`: scoped CSS in `content_css` gives each section its own edge-to-edge background; inner `<div class=\"container\">` (or page-scoped max-width wrapper) keeps readable copy centered."
    • changedInput schema / properties / content_layout / enum
      Previous value: -[
      -  0,
      -  1
      -]New value: +[
      +  1
      +]
    • changedInput schema / properties / filename / description
      Previous value: -"URL slug (e.g. home, about-us)"New value: +"URL slug (e.g. home, about-us). Renaming to a slug already used by any web page, top category, sub category, or plan public URL is auto-rejected — pick a different slug or rename the conflict first."
    • changedInput schema / properties / h1_font_size / description
      Previous value: -"Main title (H1) font size in pixels. Accepts integer values from `30` to `80`. Default `30`."New value: +"Main title (H1) font size in pixels. Accepts integer values from `30` to `80`. OMIT to inherit BD's per-`seo_type` default."
    • changedInput schema / properties / h2_font_size / description
      Previous value: -"Sub-title (H2) font size in pixels. Accepts integer values from `20` to `60`. Default `56`."New value: +"Sub-title (H2) font size in pixels. Accepts integer values from `20` to `60`. OMIT to inherit BD's per-`seo_type` default."
    • changedInput schema / properties / hero_content_font_size / description
      Previous value: -"Font size in pixels for the additional hero content block (`hero_section_content`). Accepts integer values from `10` to `30`. Default `10`."New value: +"Font size in pixels for the additional hero content block (`hero_section_content`). Accepts integer values from `10` to `30`. `10` is BD's default but renders too small for hero paragraph copy; use `15`-`18`."
    • changedInput schema / properties / hero_content_overlay_opacity / description
      Previous value: -"Opacity of `hero_content_overlay_color` layer, 0.1 increments from `0.0` (transparent) to `1` (opaque). Admin UI labels 0-10. Default `0.4`.\n\n**EAV-STORED** (one of 18 `list_seo` fields stored in `users_meta`, not a direct column) - `createWebPage` writes correctly, but `updateWebPage` silently drops. On updates, write via `updateUserMeta`/`createUserMeta` with `database=list_seo`, `database_id=<seo_id>`, `key=hero_content_overlay_opacity`, then `refreshSiteCache`. Per top-level users_meta compound-identity rule, all meta calls require `database` + `database_id` together."New value: +"Opacity of `hero_content_overlay_color` layer, 0.1 increments from `0.0` (transparent) to `1` (opaque). Admin UI labels 0-10. Default `0.4`. EAV-routed by the wrapper — pass on `updateWebPage` directly, no manual `updateUserMeta` needed."
    • changedInput schema / properties / hero_section_content / description
      Previous value: -"Additional text / HTML / widget shortcode rendered BELOW H1 and H2 in the hero section. Supports `[widget=Name]` shortcodes.\n\n**EAV-stored** - `createWebPage` seeds correctly, `updateWebPage` silently drops. On update, write via `updateUserMeta` with `database=list_seo`."New value: +"Additional text / HTML / widget shortcode rendered BELOW H1 and H2 in the hero section. Supports `[widget=Name]` shortcodes. EAV-routed by the wrapper — pass on `createWebPage` / `updateWebPage` directly, no manual `updateUserMeta` needed."
    • changedInput schema / properties / org_template / description
      Previous value: -"Template/layout ID"New value: +"OMIT — internal layout reference. No public lookup endpoint; setting an arbitrary value can render the page against a nonexistent layout."
    • changedInput schema / properties / page_render_widget / description
      Previous value: -"Widget ID to render as page content"New value: +"OMIT — internal widget reference for `seo_type=custom_widget_page` only. No public widget-ID lookup; setting on other page types breaks rendering."
  10. Changed4 schema fields changedv6.0.13
    • changedInput schema / properties / breadcrumb / description
      Previous value: -"Breadcrumb label"New value: +"OMIT — do not set unless user explicitly requests it. BD auto-generates the breadcrumb trail; manual override locks it to a static string that breaks when page context changes."
    • changedInput schema / properties / hero_image / description
      Previous value: -"Hero background image. Accepts BD-hosted relative path (`/images/bg202.webp`) OR external URL (`https://cdn.example.com/banner.jpg`) - external URLs work natively on WebPages, no `auto_image_import` needed. Recommended dimensions: 1800 × 600 px."New value: +"Hero background image. Accepts BD-hosted relative path (`/images/bg202.webp`) OR external URL (`https://cdn.example.com/banner.jpg`) — external URLs render hotlinked on WebPages, no `auto_image_import` needed. **LANDSCAPE only — never portrait/vertical. Bare URL — no `?query`, must end in `.jpg`/`.jpeg`/`.png`/`.webp`.** Query strings get truncated/mangled in BD's form-urlencoded parsing and the stored URL becomes invalid. Recommended dimensions: 1800 × 600 px."
    • changedInput schema / properties / hero_link_color / description
      Previous value: -"CTA button color variant. Maps to Bootstrap button classes, rendered per the site's theme palette (not literal colors):\n\n- `primary` (default theme color)\n\n- `info` (blue)\n\n- `success` (green)\n\n- `warning` (yellow)\n\n- `danger` (red)\n\n- `default` (neutral gray)\n\n- `secondary` (theme secondary)"New value: +"CTA button color variant — attention level, not literal color. MUST be exactly one of: `primary`, `info`, `success`, `warning`, `danger`, `default`, `secondary`. Any other value (e.g. a hex `#ffffff`) is stored verbatim and rendered as a broken class like `btn-#ffffff` — BD does not validate server-side.\n\nChoose by attention level needed: `primary` (main CTA), `danger` (urgent/can't-miss), `warning` (attention), `success` (positive action), `info` (neutral-blue), `secondary` (theme secondary), `default` (low-emphasis gray). Actual rendered color comes from the site's theme palette."
    • changedInput schema / properties / hero_link_size / description
      Previous value: -"CTA button size. `\"\"` (empty string, default) = Normal, `btn-lg` = Large, `btn-xl` = Extra Large. These are Bootstrap button-size classes applied verbatim."New value: +"CTA button size. MUST be exactly one of: `\"\"` (empty = Normal), `btn-lg` (Large), `btn-xl` (Extra Large). Any other value (e.g. a font-size number like `16`) is stored verbatim and rendered as a broken class — BD does not validate server-side."
  11. Changed37 schema fields changed
    • changedInput schema / properties / content / description
      Previous value: -"Main page body — rendered by a Froala rich text editor. **HTML only, no `<style>` or `<script>` tags** (Froala strips them). Also strips `<form>`, `<input>`, `<select>`, `<textarea>`, and `contenteditable` attributes. **Do NOT put CSS or JS here** — route them to the dedicated fields: CSS → `content_css`, JS/scripts → `content_footer_html`, head-only dependencies → `content_head`. For one-off styling, inline `style=\"...\"` attributes on elements work fine. Supports `[widget=Name]` / `[form=Name]` shortcodes and `%%%template_tokens%%%`. Pass raw HTML — do NOT wrap in `<![CDATA[...]]>`, do NOT escape as `&lt;` / `&gt;`. BD stores the value verbatim."New value: +"Main page body - Froala rich-text editor. **HTML only** - Froala strips `<style>`, `<script>`, `<form>`, `<input>`, `<select>`, `<textarea>`, `contenteditable=`, AND inline `style=\"...\"` attributes on save.\n\nRoute all non-body assets to their dedicated fields: CSS -> `content_css` (target classes, not inline styles), JS -> `content_footer_html`, head deps (`<link>`, fonts, `<meta>`, JSON-LD) -> `content_head`. SVG/canvas also stripped; for charts/diagrams use a custom Widget embedded via `[widget=Name]` shortcode.\n\nSupports `[widget=Name]` / `[form=Name]` shortcodes and `%%%template_tokens%%%`."
    • changedInput schema / properties / content_css / description
      Previous value: -"Custom CSS for this page. **Paste raw CSS rules directly — do NOT wrap in `<style>` tags.** Renders in the page `<head>` at load time. **Scope every selector** under a unique page-specific class or ID (e.g. `.my-about-page h2 { ... }`) — unscoped selectors like `body`, `h1`, `p` affect the entire site. Never target reserved platform classes: `.container`, `.froala-table`, `.image-placeholder` — these are BD utilities, not styling targets.\n\n**⚠️ Admin Froala editor gotcha** — the admin editor applies `content_css` but does NOT execute `content_footer_html` scripts. Any hide-by-default rule that JS is meant to un-hide (scroll reveals, tab panels, accordion collapsed, modal hidden, slider non-active slides) will permanently hide that content in the admin editor, making it un-editable. Gate such rules behind a `.js-ready` class on a page-scoped wrapper that your `content_footer_html` script adds on load — e.g. `.my-page.js-ready .reveal { opacity:0 }` NOT `.my-page .reveal { opacity:0 }`. See `content_footer_html`."New value: +"Custom CSS for this page. Paste raw CSS rules directly - NO `<style>` wrapper. Renders in page `<head>` at load. Scope every selector to a unique page class/ID (e.g. `.my-about-page h2 { ... }`) - bare `body`/`h1`/`p` affect the whole site. Never target reserved BD classes: `.container`, `.froala-table`, `.image-placeholder`. Never `@import` (FOUC/CLS) - load external stylesheets/fonts via `<link>` tag in `content_head`.\n\n**Admin Froala editor gotcha** - editor applies `content_css` but does NOT run `content_footer_html` JS. Hide-by-default CSS (scroll reveals, tab panels, accordion collapsed, modal hidden, slider non-active slides) will permanently hide content in the editor. Gate such rules behind a `.js-ready` class that `content_footer_html` JS adds on load: `.my-page.js-ready .reveal { opacity:0 }` NOT `.my-page .reveal { opacity:0 }`. See `content_footer_html` for the paired JS rule."
    • changedInput schema / properties / content_footer / description
      Previous value: -"⚠️ **MISLEADING NAME — this is NOT page footer HTML.** Misnamed relic column; BD repurposed it as the **page-access gate**. Controls who can view the rendered public URL:\n- `\"\"` (empty, default) — **Public For Everyone**\n- `\"members_only\"` — **Only Allow Members** (logged-in members only; non-members hit a login/signup wall)\n- `\"digital_products\"` — **Only Allow Digital Products Buyers** (only buyers of digital-product items on the site)\n\nFiner-grained rules (which members, which plans, etc.) are handled by other related fields BD exposes separately; this column is just the top-level gate. Do NOT put HTML in this field — for page body use `content`, for scripts/JS use `content_footer_html`, there is no dedicated 'extra HTML below the body' field — put below-body markup inside `content` itself (the body field)."New value: +"**MISLEADING NAME - NOT page footer HTML.** Misnamed relic column; BD repurposed as the **page-access gate**:\n\n- `\"\"` (default) = Public For Everyone\n\n- `\"members_only\"` = Logged-in members only (non-members hit login/signup wall)\n\n- `\"digital_products\"` = Only buyers of digital-product items\n\nFiner rules (which members, which plans) live in other fields. Do NOT put HTML here. Page body -> `content`; scripts -> `content_footer_html`. No dedicated \"below-body HTML\" field - put below-body markup inside `content` itself."
    • changedInput schema / properties / content_footer_html / description
      Previous value: -"Page-scoped **JavaScript and other scripts** — rendered just before the closing `</body>` tag. Wrap JS in `<script>` tags here (unlike `content`, this field accepts them). jQuery is already loaded globally on BD sites. Best practice: wrap custom JS in an IIFE `(function($){ /* ... */ })(jQuery);` and scope all selectors to a unique page class so JS doesn't leak to other pages. Also the right place for third-party script embeds scoped to this page only (analytics pixels, chat widgets, schema, etc.). **Not for extra body HTML** — `content` is the body. This field is strictly for script / dependency tags.\n\n**⚠️ If your `content_css` uses a `.js-ready` gate for hide-by-default effects** (scroll reveals, tab panels, accordion collapse, modal hidden, slider non-active) — the JS MUST add that class to the page wrapper as its first line: `document.querySelector('.my-page')?.classList.add('js-ready');`. This makes the hide-CSS activate only on the live site (where JS runs), not in the admin Froala editor (where `content_footer_html` does not execute), so the admin can still edit the content. See `content_css`."New value: +"Page-scoped JavaScript + script embeds - rendered before `</body>`. `<script>` tags accepted here (unlike `content`). jQuery loaded globally. Wrap JS in an IIFE `(function($){ ... })(jQuery);` and scope selectors to a unique page class. Also for third-party script embeds (analytics pixels, chat widgets, schema markup). NOT for extra body HTML - `content` is the body field.\n\n**If `content_css` uses a `.js-ready` gate for hide-by-default effects** (scroll reveals, tab panels, accordion collapse, modal hidden, slider non-active), JS MUST add that class to the page wrapper as the FIRST line (before any other init code): `document.querySelector('.my-page')?.classList.add('js-ready');`. The admin Froala editor applies CSS but does NOT run this field's JS, so without the gate, hide-rules make content permanently invisible in the editor."
    • changedInput schema / properties / content_head / description
      Previous value: -"Page-scoped `<head>` dependencies — rendered inside the `<head>` tag. Use for `<link>` tags (external stylesheets, preconnect hints, canonical overrides), `<meta>` tags beyond what the standard SEO fields cover, verification tags, structured-data `<script type=\"application/ld+json\">`, and third-party `<script>` tags that MUST load in the head (rare — prefer `content_footer_html` for most JS)."New value: +"Page-scoped `<head>` dependencies - rendered inside `<head>`. Use for: `<link>` tags (external stylesheets, preconnect hints, canonical overrides, Google Fonts), `<meta>` tags beyond standard SEO fields, verification tags, JSON-LD structured data (`<script type=\"application/ld+json\">`), head-required third-party scripts (rare - prefer `content_footer_html` for most JS)."
    • changedInput schema / properties / content_layout / description
      Previous value: -"**Full Screen Page Width** — layout flag that enables edge-to-edge sections on this page. `0` (default) = content stays inside the site's normal max-width container (the contained layout used for most static pages). `1` = full-screen width, so individual rows/sections inside `content` can break out to the browser edges (useful for full-bleed background colors, hero-style bands, or image backgrounds that need to span the viewport). **When a user wants full-bleed sections, set `content_layout=1` FIRST — do NOT fake it with negative-margin / 9999px-padding CSS tricks in `content_css` (anti-pattern: breaks horizontal scroll, fights `overflow: hidden` parents, prevents future layout changes).** With `content_layout=1`, give each section its own background via a scoped CSS rule in `content_css`, and wrap the readable text in a `<div class=\"container\">` or a page-scoped inner wrapper with a `max-width` so copy stays centered while the background goes edge-to-edge. Only set to `1` if the page HAS sections designed to go edge-to-edge; plain text/content pages don't need it."New value: +"**Full Screen Page Width.** `0` (default) = content stays inside BD's normal max-width container. `1` = full-screen width; individual sections in `content` can break edge-to-edge (full-bleed background bands, hero-style strips, viewport-wide images).\n\n**For full-bleed sections, set `content_layout=1` FIRST.** Do NOT fake it with negative-margin/9999px-padding tricks in `content_css` - breaks horizontal scroll, fights `overflow: hidden` parents, prevents future layout changes. Anti-pattern.\n\nPattern with `content_layout=1`: scoped CSS in `content_css` gives each section its own edge-to-edge background; inner `<div class=\"container\">` (or page-scoped max-width wrapper) keeps readable copy centered. Only use when the page has sections DESIGNED edge-to-edge; plain content pages don't need it."
    • changedInput schema / properties / custom_html_placement / description
      Previous value: -"Where to render the page's custom SEO content (`content` HTML) in relation to the dynamic search results, on `seo_type=profile_search_results` pages. Only meaningful for search-result static pages (and later `seo_type=data_category`) — ignored on regular `content` pages.\n  0 = Inside Tab                (content + member results render in separate nav tabs)\n  1 = Above Member Results      (within the results container; respects sidebar width)\n  2 = Below Member Results      (within the results container)\n  3 = Above Body Content        (full page container width — spans above sidebar + results)\n  4 = Below Body Content        (full page container width — below sidebar + results) ← **recommended default for AI-generated SEO pages**\nFor boilerplate SEO intro paragraphs / FAQ / local copy aimed at bolstering thin pages, `4` is the safest default because it renders full-width below the live results without disrupting the primary member-facing UX."New value: +"Render position of `content` HTML relative to dynamic search results. Only meaningful on `seo_type=profile_search_results` (and `data_category`); ignored on `content` pages.\n\n- `0` = Inside Tab (content + members in separate nav tabs)\n\n- `1` = Above Member Results (within results container, sidebar-width)\n\n- `2` = Below Member Results (within results container)\n\n- `3` = Above Body Content (full page width, spans sidebar+results)\n\n- `4` = Below Body Content (full page width, below sidebar+results) <- **recommended default for AI-generated SEO pages**\n\nFor boilerplate SEO intro/FAQ/local copy bolstering thin pages, `4` renders full-width below the live results without disrupting member-facing UX."
    • changedInput schema / properties / date_updated / description
      Previous value: -"Last-update timestamp on the page record (drives the admin-UI \"Last Update\" display). Format: `YYYYMMDDHHmmss` (14-digit, no separators — e.g. `20260214232533`). **Required on every `createWebPage` and `updateWebPage` call** — always set to the CURRENT timestamp at call time (unless backfilling historical data from a migration, in which case pass the historical value). BD does NOT auto-populate this field; if you omit it, the admin UI shows a blank/stale date."New value: +"Last-update timestamp driving admin-UI \"Last Update\" display. Format: `YYYYMMDDHHmmss` (14-digit, no separators - e.g. `20260214232533`).\n\n**Required on every `createWebPage` / `updateWebPage` call** - always set to CURRENT timestamp at call time (unless backfilling historical migration data). BD does NOT auto-populate; omitting it leaves the admin UI showing blank/stale."
    • changedInput schema / properties / enable_hero_section / description
      Previous value: -"Master switch for the page's hero banner (the full-width header section rendered ABOVE the main page content). `0` = disabled (no hero renders, regardless of other hero_* values), `1` = enabled on all devices, `2` = enabled on desktop but hidden on mobile. When `0`, all other `hero_*` / `h1_font_*` / `h2_font_*` fields are ignored at render time but their stored values are preserved — toggling back to `1` or `2` restores the previous config without having to re-enter it. Does NOT apply to the homepage (`seo_type=home`) — the homepage template ignores hero fields entirely. BD stores the values but never renders them on the homepage; skip all `hero_*` fields when updating seo_type=home."New value: +"Hero banner master switch:\n\n- `0` = disabled (all other `hero_*`/`h1_font_*`/`h2_font_*` ignored at render; stored values preserved for later toggle-back)\n\n- `1` = enabled all devices\n\n- `2` = enabled desktop, hidden mobile\n\n**Homepage benign** - `seo_type=home` ignores hero fields entirely regardless of value. BD stores but never renders on homepage; skip all `hero_*` fields on homepage updates."
    • changedInput schema / properties / facebook_desc / description
      Previous value: -"**Social Media Description (Open Graph)** — Description shown on social shares. Open Graph description"New value: +"**Social Media Description (Open Graph)** - Description shown on social shares. Open Graph description"
    • changedInput schema / properties / facebook_image / description
      Previous value: -"**Social Media Shared Image** — URL/filename of the OG image. BD recommends at least 200×200px. Open Graph image URL"New value: +"**Social Media Shared Image** - URL/filename of the OG image. BD recommends at least 200×200px. Open Graph image URL"
    • changedInput schema / properties / facebook_title / description
      Previous value: -"**Social Media Title (Open Graph)** — Title shown when the page is shared on Facebook/LinkedIn/etc. Open Graph title for social sharing"New value: +"**Social Media Title (Open Graph)** - Title shown when the page is shared on Facebook/LinkedIn/etc. Open Graph title for social sharing"
    • changedInput schema / properties / form_name / description
      Previous value: -"**SIDEBAR name** for this page — BD's field is misnamed (it controls the sidebar slot, NOT a contact form). Pass the exact sidebar `name` string. Empty string `\"\"` = no sidebar. Six **Master Default Sidebars** are always available on every site (not returned by `listSidebars` — hardcoded in BD core): `Global Website Search`, `Member Profile Page`, `Member Search Result`, `Personal Post Feed`, `Post Search Result`, `Post Single Page`. Custom sidebars are discoverable via `listSidebars` (returns only site-local customs). If a user names a sidebar that's in NEITHER list → ask them to pick from what's available; don't send an unknown name (BD renders no sidebar). When `form_name` is set, `menu_layout` controls position. **Default on create for `profile_search_results` pages:** `Member Search Result` (NOT `Member Profile Page` — that's for member profile/detail pages, not search-results pages)."New value: +"**SIDEBAR name** for this page - BD's field is misnamed; controls sidebar slot, NOT a contact form. Pass exact sidebar `name` string. `\"\"` = no sidebar.\n\n**Master Default Sidebars** (always available, NOT in `listSidebars` - hardcoded in BD core): `Global Website Search`, `Member Profile Page`, `Member Search Result`, `Personal Post Feed`, `Post Search Result`, `Post Single Page`. Custom sidebars via `listSidebars` (returns site-local only). Unknown name -> no sidebar rendered; ask user to pick from available.\n\n`menu_layout` controls position when `form_name` is set. **Default on `profile_search_results` pages:** `Member Search Result` (NOT `Member Profile Page` - that's for profile/detail pages, not search results)."
    • changedInput schema / properties / h1 / description
      Previous value: -"**H1 Heading** — Supports template tokens. Rendered as the page's main heading. H1 heading — supports template tokens"New value: +"**H1 Heading** - Supports template tokens. Rendered as the page's main heading. H1 heading - supports template tokens"
    • changedInput schema / properties / h1_font_color / description
      Previous value: -"Main title (H1) font color in the hero. RGB format ONLY — e.g. `rgb(255,255,255)`. The H1 text itself comes from the page's `h1` field — these `h1_*` fields control ONLY the hero's H1 styling."New value: +"Main title (H1) font color in the hero. RGB format ONLY - e.g. `rgb(255,255,255)`. The H1 text itself comes from the page's `h1` field - these `h1_*` fields control ONLY the hero's H1 styling."
    • changedInput schema / properties / h2 / description
      Previous value: -"**H2 Heading** — Supports template tokens. H2 heading — supports template tokens"New value: +"**H2 Heading** - Supports template tokens. H2 heading - supports template tokens"
    • changedInput schema / properties / h2_font_color / description
      Previous value: -"Sub-title (H2) font color in the hero. RGB format ONLY — e.g. `rgb(255,255,255)`. The H2 text itself comes from the page's `h2` field."New value: +"Sub-title (H2) font color in the hero. RGB format ONLY - e.g. `rgb(255,255,255)`. The H2 text itself comes from the page's `h2` field."
    • changedInput schema / properties / hero_column_width / description
      Previous value: -"Width of the hero text-content column, expressed as a Bootstrap 12-col span. `3`=25%, `4`=30%, `5`=40%, `6`=50%, `7`=60%, `8`=70% (default), `9`=75%, `10`=80%, `11`=90%, `12`=100%. Narrower = more padding on the sides of the text block."New value: +"Hero text-content column width as Bootstrap 12-col span. `3`=25%, `4`=30%, `5`=40%, `6`=50%, `7`=60%, `8`=70% (default), `9`=75%, `10`=80%, `11`=90%, `12`=100%. Narrower = more side padding around the text block."
    • changedInput schema / properties / hero_content_font_color / description
      Previous value: -"Font color for the additional hero content block rendered below H1/H2 (the `hero_section_content` field). RGB format ONLY — e.g. `rgb(0,0,0)`."New value: +"Font color for the additional hero content block rendered below H1/H2 (the `hero_section_content` field). RGB format ONLY - e.g. `rgb(0,0,0)`."
    • changedInput schema / properties / hero_content_overlay_color / description
      Previous value: -"Semi-transparent color layer rendered between the hero background image and the text content, used to improve text legibility over busy images. RGB format ONLY — e.g. `rgb(0,0,0)` or `rgb(255,255,255)`. Hex (`#000000`) is NOT accepted. Combine with `hero_content_overlay_opacity` to control visibility."New value: +"Semi-transparent color layer between hero background image and text, for legibility over busy images. **RGB format ONLY** - `rgb(0,0,0)` or `rgb(255,255,255)`. Hex (`#000000`) NOT accepted. Combine with `hero_content_overlay_opacity` to control strength."
    • changedInput schema / properties / hero_content_overlay_opacity / description
      Previous value: -"Opacity of the `hero_content_overlay_color` layer, in 0.1 increments from `0.0` (fully transparent / invisible) to `1` (fully opaque). Admin UI labels these as 0–10 (10 = fully opaque). Default in admin-UI creation is `0.4`. **EAV-STORED FIELD (one of the 18 list_seo fields stored in `users_meta`, not as a direct column):** `createWebPage` seeds this correctly, but `updateWebPage` silently ignores it. To update on an existing page, call `updateUserMeta` (or `createUserMeta` if no row exists yet) with `database=list_seo`, `database_id=<seo_id>`, `key=hero_content_overlay_opacity`, `value=<new value>`, then `refreshSiteCache` to re-render. Every `updateUserMeta`/`deleteUserMeta` call must also carry `database` + `database_id` (the atomic compound identity rule — see `listUserMeta`)."New value: +"Opacity of `hero_content_overlay_color` layer, 0.1 increments from `0.0` (transparent) to `1` (opaque). Admin UI labels 0-10. Default `0.4`.\n\n**EAV-STORED** (one of 18 `list_seo` fields stored in `users_meta`, not a direct column) - `createWebPage` writes correctly, but `updateWebPage` silently drops. On updates, write via `updateUserMeta`/`createUserMeta` with `database=list_seo`, `database_id=<seo_id>`, `key=hero_content_overlay_opacity`, then `refreshSiteCache`. Per top-level users_meta compound-identity rule, all meta calls require `database` + `database_id` together."
    • changedInput schema / properties / hero_image / description
      Previous value: -"Hero background image. Accepts either a BD-hosted relative path (e.g. `/images/bg202.webp`, produced when uploaded via the BD admin file picker) OR an external URL (e.g. `https://cdn.example.com/banner.jpg`) — external URLs are supported natively, no `auto_image_import` needed for web pages. Recommended dimensions: 1800 × 600 px."New value: +"Hero background image. Accepts BD-hosted relative path (`/images/bg202.webp`) OR external URL (`https://cdn.example.com/banner.jpg`) - external URLs work natively on WebPages, no `auto_image_import` needed. Recommended dimensions: 1800 × 600 px."
    • changedInput schema / properties / hero_link_color / description
      Previous value: -"CTA button color variant. Maps to Bootstrap button classes: `primary` (default theme color), `info` (blue), `success` (green), `warning` (yellow), `danger` (red), `default` (neutral gray), `secondary` (theme secondary). Colors render per the site's theme palette, not literal colors."New value: +"CTA button color variant. Maps to Bootstrap button classes, rendered per the site's theme palette (not literal colors):\n\n- `primary` (default theme color)\n\n- `info` (blue)\n\n- `success` (green)\n\n- `warning` (yellow)\n\n- `danger` (red)\n\n- `default` (neutral gray)\n\n- `secondary` (theme secondary)"
    • changedInput schema / properties / hero_link_text / description
      Previous value: -"Hero CTA button label. Required (non-empty) for the button to render — `hero_link_url` alone without text will not produce a button."New value: +"Hero CTA button label. Required (non-empty) for the button to render - `hero_link_url` alone without text will not produce a button."
    • changedInput schema / properties / hero_section_content / description
      Previous value: -"Additional text/HTML/widget shortcode rendered BELOW the H1 and H2 in the hero section. Pass raw HTML — do NOT wrap in `<![CDATA[...]]>`, do NOT escape as `&lt;` / `&gt;`, and do NOT include tool-call scaffolding tags (e.g. `<parameter name=\"...\">...</parameter>`, `<invoke>`, `<function_calls>`). BD stores the field value verbatim; any wrapper / escape / scaffolding renders as literal visible text."New value: +"Additional text / HTML / widget shortcode rendered BELOW H1 and H2 in the hero section. Supports `[widget=Name]` shortcodes.\n\n**EAV-stored** - `createWebPage` seeds correctly, `updateWebPage` silently drops. On update, write via `updateUserMeta` with `database=list_seo`."
    • changedInput schema / properties / hide_footer / description
      Previous value: -"**Hide Footer** — 1 = hides the site footer on this page."New value: +"**Hide Footer** - 1 = hides the site footer on this page."
    • changedInput schema / properties / hide_header / description
      Previous value: -"**Hide Header** — 1 = hides the full site header on this page."New value: +"**Hide Header** - 1 = hides the full site header on this page."
    • changedInput schema / properties / hide_header_links / description
      Previous value: -"**Hide Main Menu** — 1 = hides the main navigation menu on this page."New value: +"**Hide Main Menu** - 1 = hides the main navigation menu on this page."
    • changedInput schema / properties / hide_top_right / description
      Previous value: -"**Hide Top Header Menu** — 1 = hides the top-right nav cluster (account/login links)."New value: +"**Hide Top Header Menu** - 1 = hides the top-right nav cluster (account/login links)."
    • changedInput schema / properties / menu_layout / description
      Previous value: -"Sidebar position and width (integer). Only has an effect when the page has a sidebar configured via `form_name` — ignored on pages without a sidebar.\n  1 = Left Wide    (sidebar on the left, wide column) — BD default when unspecified\n  2 = Right Wide   (sidebar on the right, wide column)\n  3 = Left Slim    (sidebar on the left, narrow column)\n  4 = Right Slim   (sidebar on the right, narrow column)\nNote the ordering is NOT sequential by side — left positions are 1 and 3, right positions are 2 and 4. Despite the field name, this is the SIDEBAR position setting, not a navigation menu layout.\n**Default on create for `profile_search_results` pages:** `3` (Left Slim). For regular `content` pages, omit unless user specifies — BD defaults to 1 (Left Wide)."New value: +"Sidebar position + width (integer). Only effective when the page has a sidebar set via `form_name` - ignored without sidebar. NOT a navigation menu layout despite the field name.\n\n- `1` = Left Wide (BD default when unspecified)\n\n- `2` = Right Wide\n\n- `3` = Left Slim\n\n- `4` = Right Slim\n\nOrdering is NOT sequential by side - left positions are `1` and `3`, right are `2` and `4`.\n\n**Default on `profile_search_results` pages:** `3` (Left Slim). On `content` pages, omit unless user specifies (BD defaults to `1`)."
    • changedInput schema / properties / meta_desc / description
      Previous value: -"**Meta Description** — Supports template tokens. ~150-160 chars recommended for search snippets. Meta description — supports template tokens"New value: +"**Meta Description** - Supports template tokens. ~150-160 chars recommended for search snippets. Meta description - supports template tokens"
    • changedInput schema / properties / meta_keywords / description
      Previous value: -"**Meta Keywords** — Supports template tokens (comma-separated). Meta keywords — supports template tokens"New value: +"**Meta Keywords** - Supports template tokens (comma-separated). Meta keywords - supports template tokens"
    • changedInput schema / properties / seo_text / description
      Previous value: -"**Wildcard URL Rewrite** — 1 = any URL within this directory routes to this web page (catch-all behavior). Pass raw HTML — do NOT wrap in `<![CDATA[...]]>`, do NOT escape as `&lt;` / `&gt;`, and do NOT include tool-call scaffolding tags (e.g. `<parameter name=\"...\">...</parameter>`, `<invoke>`, `<function_calls>`). BD stores the field value verbatim; any wrapper / escape / scaffolding renders as literal visible text."New value: +"**Wildcard URL Rewrite.** `1` = any URL within this directory routes to this web page (catch-all behavior). Misnamed field - NOT SEO copy; SEO copy goes in `content` + meta fields."
    • changedInput schema / properties / seo_type / description
      Previous value: -"Page type identifier. On update, safest to OMIT this field unless intentionally changing it (most seo_type changes are destructive). Values:\n  content                  = Single Web Page (generic static/landing page)\n  data_category            = Post Search Results\n  profile_search_results   = Member Search Results\n  custom_widget_page       = Custom Widget as Web Page\n  password_retrieval_page  = Password Retrieval Page\n  unsubscribed             = Unsubscribed Page\n  home                     = Homepage (system-seeded; included here so an update round-trip of the existing homepage record passes the enum check)"New value: +"Page type identifier. On update, safest to OMIT this field unless intentionally changing it (most seo_type changes are destructive). Values:\n  content = Single Web Page (generic static/landing page)\n  data_category = Post Search Results\n  profile_search_results = Member Search Results\n  custom_widget_page = Custom Widget as Web Page\n  password_retrieval_page = Password Retrieval Page\n  unsubscribed = Unsubscribed Page\n  home = Homepage (system-seeded; included here so an update round-trip of the existing homepage record passes the enum check)"
    • changedInput schema / properties / show_form / description
      Previous value: -"**Apply NoIndex, NoFollow** — 1 = adds `<meta name=\"robots\" content=\"noindex,nofollow\">` to the page. Auto-applied to protected pages. NOT a contact-form toggle (despite the field name — BD repurposed this column)."New value: +"**Apply NoIndex,NoFollow.** `1` = adds `<meta name=\"robots\" content=\"noindex,nofollow\">` to the page. Auto-applied to protected pages. **NOT a contact-form toggle** despite the field name - BD repurposed this column."
    • changedInput schema / properties / title / description
      Previous value: -"**Page Meta Title** — Supports template tokens: `%%%website_name%%%`, `%industry%`, `%profession%`, etc. ~30-60 chars recommended. HTML title tag — supports template tokens like %%%website_name%%%"New value: +"**Page Meta Title** - Supports template tokens: `%%%website_name%%%`, `%industry%`, `%profession%`, etc. ~30-60 chars recommended. HTML title tag - supports template tokens like %%%website_name%%%"
    • changedInput schema / properties / updated_by / description
      Previous value: -"Label shown in admin-UI \"Updated By\" column on the page record. Free-form string (e.g. `\"API\"`, `\"AI Agent\"`, an admin username). Recommended on create/update for audit traceability so admins can tell which edits came from the API vs. the UI."New value: +"Admin-UI \"Updated By\" column label. Free-form string (e.g. `\"API\"`, `\"AI Agent\"`, admin username). Recommended on create/update for audit traceability - tells admins which edits came from API vs. UI."
  12. Changed1 schema field changedv6.0.8
    • changedInput schema / properties / content_layout / description
      Previous value: -"**Full Screen Page Width** — layout flag that enables edge-to-edge sections on this page. `0` (default) = content stays inside the site's normal max-width container (the contained layout used for most static pages). `1` = full-screen width, so individual rows/sections inside `content` can break out to the browser edges (useful for full-bleed background colors, hero-style bands, or image backgrounds that need to span the viewport). Only set to `1` if the page's HTML has sections designed to go edge-to-edge; plain text/content pages don't need it."New value: +"**Full Screen Page Width** — layout flag that enables edge-to-edge sections on this page. `0` (default) = content stays inside the site's normal max-width container (the contained layout used for most static pages). `1` = full-screen width, so individual rows/sections inside `content` can break out to the browser edges (useful for full-bleed background colors, hero-style bands, or image backgrounds that need to span the viewport). **When a user wants full-bleed sections, set `content_layout=1` FIRST — do NOT fake it with negative-margin / 9999px-padding CSS tricks in `content_css` (anti-pattern: breaks horizontal scroll, fights `overflow: hidden` parents, prevents future layout changes).** With `content_layout=1`, give each section its own background via a scoped CSS rule in `content_css`, and wrap the readable text in a `<div class=\"container\">` or a page-scoped inner wrapper with a `max-width` so copy stays centered while the background goes edge-to-edge. Only set to `1` if the page HAS sections designed to go edge-to-edge; plain text/content pages don't need it."
  13. Addedv6.0.7
  14. Removed
  15. Addedv6.0.6

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate the tool is not read-only, not destructive, idempotent, and open-world. The description adds substantial behavioral context beyond these: automatic cache refresh, PATCH semantics (omitted fields untouched), hero bundle auto-fill on transition, EAV-routing behavior, and the fact that `seo_type` changes are destructive. It also documents misnamed fields (e.g., `show_form` for noindex). No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very long (multiple paragraphs). While comprehensive, it includes repeated details (e.g., hero bundle defaults mentioned in both the `enable_hero_section` field description and the dedicated hero section). The structure front-loads the purpose but then dives into deep details. For a tool with 64 parameters, some length is justified, but it could be more concise and better organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (64 parameters, no output schema), the description is remarkably complete. It covers edge cases (e.g., homepage hero benign, `profile_search_results` slug requirements, double-render trap for H1/H2), common edits, misnamed fields, asset field routing, EAV routing, and even post-deletion orphan cleanup. It also provides specific guidance for `seo_type` changes and hero transitions. No gaps identified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds crucial meaning beyond field descriptions. It explains misnamed fields (e.g., `content_footer` is an access gate, not HTML), template tokens, asset field routing rules, hero bundle defaults, and EAV auto-routing. For fields like `enable_hero_section`, it details the auto-fill behavior and required companion fields. This dramatically enhances comprehension.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('Update'), resource ('an existing `list_seo` page'), and identifier (`seo_id`). It also differentiates from sibling tools by mentioning PATCH semantics and explicitly referencing `createWebPage`, `deleteWebPage`, and `createRedirect` in the 'See also' section. This leaves no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides extensive guidance on when to use this tool versus alternatives. It includes a 'Disambiguation' section that warns about resource ambiguity when users refer to pages by title, and directs to a rule for clarifying. It also explicitly states conditions for using `createRedirect` (slug change), `deleteWebPage` (with orphan cleanup), and `refreshSiteCache` (when cache refresh fails). This is exemplary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

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/brilliantdirectories/brilliant-directories-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server