Skip to main content
Glama
brilliantdirectories

brilliant-directories-mcp

Official

updateWebPage

Idempotent

Update an existing web page's content, SEO, layout, hero section, and settings. Omitted fields remain unchanged. Automatic cache refresh on success.

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 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
seo_idYesPage primary key (required to identify record)
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)
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
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%%%
meta_keywordsNo**Meta Keywords** - Supports template tokens (comma-separated). Meta keywords - supports template tokens
meta_descNo**Meta Description** - Supports template tokens. ~150-160 chars recommended for search snippets. Meta description - supports template tokens
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.
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
breadcrumbNo**OMIT** — BD auto-generates the breadcrumb trail. Never set this yourself; a manual value overrides BD's generated trail and breaks the page.
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.
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.
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.
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_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_menuNoMenu section this page belongs to
content_orderNoSort order within menu/section
content_groupNoAdmin-panel grouping label
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.
content_sidebarNoSidebar configuration or widget shortcode
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`).
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`.
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).
hide_header_linksNo**Hide Main Menu** - 1 = hides the main navigation menu on this page.
hide_headerNo**Hide Header** - 1 = hides the full site header on this page.
hide_footerNo**Hide Footer** - 1 = hides the site footer on this page.
hide_top_rightNo**Hide Top Header Menu** - 1 = hides the top-right nav cluster (account/login links).
facebook_titleNo**Social Media Title (Open Graph)** - Title shown when the page is shared on Facebook/LinkedIn/etc. Open Graph title for social sharing
facebook_descNo**Social Media Description (Open Graph)** - Description shown on social shares. Open Graph description
facebook_imageNo**Social Media Shared Image** - URL/filename of the OG image. BD recommends at least 200×200px. Open Graph image URL
org_templateNo**OMIT** — internal layout reference. No public lookup endpoint; setting an arbitrary value can render the page against a nonexistent layout.
allowed_productsNoComma-separated plan/product IDs (empty = all plans)
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.
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_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.
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 — 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 **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.
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.
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**).
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_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**).
hero_alignmentNoHorizontal alignment of the hero title/subtitle/content text block within its column. Default `center`.
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**).
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.
h1_font_weightNoMain title (H1) font weight. `300`=Light, `400`=Normal (default), `600`=Bold, `800`=Extra Bold.
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**).
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.
h2_font_weightNoSub-title (H2) font weight. `300`=Light, `400`=Normal, `600`=Bold (default), `800`=Extra Bold.
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_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_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.
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://`.
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.
hero_link_target_blankNoWhen `1`, opens the CTA link in a new tab (`target="_blank"`). `0` (default) opens in the same tab.
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_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.
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`.
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)`.
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.
private_page_selectNoAccess control setting
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.
_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"]`.
Behavior5/5

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

Annotations already indicate idempotentHint=true and openWorldHint=true. The description adds critical behavioral details: PATCH semantics, auto cache refresh with error handling, EAV routing, misnamed field behaviors, hero bundle auto-fill, and homepage benign behavior—all beyond what annotations provide.

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 and includes extensive details that could be streamlined. However, it is well-structured with clear headings (Disambiguation, Common edits, Misnamed fields, etc.) and front-loads the core purpose. Some redundancy exists, making it less concise than ideal.

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 64 parameters, no output schema, and high complexity, the description covers every aspect: hero sections, EAV routing, asset field routing, template tokens, misnamed fields, SEO content for search results, deleted orphan cleanup, and return format. It leaves no significant gaps for an AI agent to interpret correct usage.

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 substantial meaning for many parameters: explains misnamed fields (show_form→noindex, content_footer→access gate), template token support, validation rules (RGB only for colors, required fields on seo_type change), and EAV auto-routing. It clarifies nuances like hero bundle autofill and orphan cleanup instructions.

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 'Update a page - Update an existing `list_seo` page by `seo_id`' with PATCH semantics. It distinguishes from createWebPage and deleteWebPage via 'See also' section and explicit disambiguation rules, making sibling differentiation clear.

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?

Extensive usage guidance includes when to use (update by seo_id), when not to (avoid manual refreshSiteCache after update, omit seo_type on non-intentional changes), and explicit alternatives like createWebPage, deleteWebPage, createRedirect. It also provides disambiguation rules for page identification.

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