PendiumDocs

Build and publish site pages

List, read, create, edit, publish, and remove pages on the brand's site.

The brand's site is a public, AI-readable site served at /{username}. These tools cover the full lifecycle of its pages: authoring content, editing metadata, and taking pages live or offline.

When to use

Use these tools to manage the durable Pages on the site: the Profile, FAQ, homepage page, custom pages, and local service-area landing pages. For a site Pendium hosts, a published page is only publicly reachable if the site itself is public; turn the whole site on with set_site_public first (or check every surface with get_site_status). When Pendium hosts no site for the brand (get_site_status reports siteRenderer: none), there is no site to turn on and set_site_public refuses: published pages update the content feed, and siteState says where the brand's own site stands. Building new pages with AI (generate_service_area_pages, recreate_source_pages) draws on the monthly plan allowance.

Typical sequence

  1. list_site_pages — see what pages already exist and their generation status; pass a bulk tool's batchId to poll full-design outcomes.
  2. Author the page with create_site_page (you provide the content, no LLM). For local businesses, generate_service_area_pages creates one page per neighborhood × service.
  3. For a bulk full-design batch, pass its batchId to list_site_pages and poll until designBatch.terminal equals designBatch.total. A page someone started with AI from the page tools (the Pages view of the Content list) reports generating: true until its content lands.
  4. get_site_page to read the full body and section list; update_site_page to adjust title, slug, or meta description; edit_site_page_sections to add, remove, move or rewrite the sections of any page list_site_pages marks editableSections: true.

Pages edited section by section. Custom pages are made of sections. The Home, Profile, FAQ and Offerings pages are moving to the same model: once one of them is converted, its words are its own sections, edited like a custom page's (edit_site_page_sections, the page editor), and list_site_pages reports it with editableSections: true. It keeps its fixed address, its place in the site menu, and the live blocks Pendium fills in for it (the Offerings page's list of offering and location pages, the Profile page's rating, address, hours and contact details). Before a page is converted, the Profile page shows the company profile and the FAQ page shows the Business Info answers, so change those with update_company_profile instead. 5. publish_site_page to go live. On a site Pendium hosts, make sure the site itself is public via set_site_public; a brand Pendium hosts no site for has nothing to turn on. 6. unpublish_site_page to revert to draft, or delete_site_page to remove permanently.

Design generation is deduplicated: asking for a page design while one is already being generated for the same target does not start a second build — the request reports that a design is already in progress, and the original build continues. Wait for it to land, then request again if you want a fresh version.

When the Pages view of the Content list creates a homepage without authored copy, Pendium marks it as unwritten instead of saving sample text. Starting the homepage build writes grounded hero and section copy from the brand profile before design generation continues; an existing authored homepage is left unchanged. The approved homepage mockup controls composition, while the saved brand copy, real photos, and captured links control what the coded page may contain. Generated page bodies cannot include placeholder text or their own header/navigation/footer because every page is wrapped in the site's shared chrome.

In the in-app Design Agent, an Explore request for one custom page or the homepage can deliberately generate up to four distinct visual directions in sequence. The agent waits until every preview is ready, presents them together, and builds only the direction the user selects; the unselected previews are retired. Explore is not available for shared site chrome (the navbar, logo, header, or footer) or for a whole-site redesign.

The Resources index becomes a real page the moment it has content: publishing a brand's first resource custom page creates the typed Resources index (published, at its reserved slug) and enrolls it for a design of its own, grounded in the published resource pages it lists. Brands that never publish a resource page keep the lightweight virtual Resources listing. Unpublishing an index page that was previously published takes it offline like any other page — it does not fall back to the virtual listing.

Every designed page shares one site chrome. The navbar, logo, header, and footer are a single designed artifact generated once per brand from its style guide and real logo, and the renderer wraps each page's generated body in it — so navigation, branding, and headers are identical across the whole site, navigation links always reflect the current set of published pages, and the brand mark in the header links back to the site's home page. A page generated before the brand's chrome exists renders with the standard layout until the chrome is ready.

The post index and posts use a fixed layout styled by the design.

Page designs are shared by page shape. The first qualifying page of a shape — a services or resource index, a long-form page like the FAQ, or a landing page — generates a full-page design preview composed from that page's real content in the site's style. When a person asked for the page, the preview waits on the Pages view of the in-app Content list (/{syntheticId}/content?type=page) for an Approve or Regenerate decision; background flows (onboarding, bulk builds) accept their own previews and continue. Once a shape's design is approved, every later page of that shape reuses it directly with no new design generation. While a shape's preview is generating or awaiting approval, new design requests for that shape are declined with a pointer to the pending preview. A pending preview that never started, or has sat unfinished for ten minutes, counts as abandoned, and the next request starts a fresh one instead of waiting on it. Custom pages can opt out of the shared design with bespokeDesign.

After a homepage is first built or regenerated, Pendium can enroll up to 12 eligible published sibling pages that do not already have a ready or pending design. The batch builds those pages one at a time. The first page for each shape establishes its shared design; later siblings of that shape reuse it. Skipped, failed, and cancelled pages still count as terminal results, so check each page's designBatch status before publishing.

Free plan

Brands on the free plan. If the brand's owner is on the free plan (a teammate's brand you can reach), tools that make a new custom page (create_site_page with type: "custom", generate_service_area_pages, recreate_source_pages) return an error result with code: "OWNER_PLAN_UPGRADE_REQUIRED", an error message and an upgradeUrl, and change nothing. New posts and pages are on the Starter, Pro and Managed plans. Typed pages (homepage, profile, faq) and editing existing pages still work. Page designs don't run for a free-plan brand: a design request (a page-shape preview, bespokeDesign, or the sibling batch after a homepage build) starts nothing, and a direct request returns the plan message. Setup makes no pages for a free-plan brand; when its owner moves to Starter or Pro (a free trial counts), its Profile and FAQ are published.

Tools

list_site_pages

List all pages on the brand's site, with each page's structured-content generation status. A page with generating: true is still having its AI content filled in; generating: false means that content has landed. A page that's still generating cannot be published — publish_site_page rejects it until generating: false.

A design that never starts — because the work could not be queued — is reported as a failed outcome rather than staying pending, so a poll returns an answer instead of waiting for the attempt to time out. That report covers the shared page-shape design as well as the page's own.

For generate_service_area_pages and recreate_source_pages, pass the returned batchId. The response then also includes the canonical designBatch projection with per-page full-design outcomes: queued, pending, ready, skipped, failed, or cancelled. Poll until designBatch.terminal equals designBatch.total; do not infer full-design readiness from generating.

Authentication: Required.

Type: Read-only.

ParameterTypeRequiredDescription
syntheticIdintegerYesThe agent ID whose pages to list.
batchIdstring (UUID)NoA bulk page-generation batch ID; includes canonical per-page full-design outcomes when supplied.

Returns count and a pages array. Each page includes agentPageId, title, slug, status (draft / published / archived), pageType, category, generating, and editableSections (true when edit_site_page_sections can edit the page: every custom page, and a Home, Profile, FAQ or Offerings page once it's edited section by section). When batchId is supplied, also returns designBatch with batchId, total, terminal, canCancel, and a pages array containing each page's pageId, title, design status, and optional failure/skip reason.

get_site_page

Fetch one page on the brand's site, including its body (markdown extracted from the page's sections). Use after list_site_pages to read the full content before proposing an edit with update_site_page.

Authentication: Required. The agent must belong to the authenticated account (owner, admin, or a group-shared member).

Type: Read-only.

ParameterTypeRequiredDescription
agentPageIdstringYesThe page to fetch (from list_site_pages).

Returns success, the syntheticId, and a page object with agentPageId, type, title, slug, status, metaDescription, body, sections (each section's sectionId, type, heading, itemCount, body and items, for edit_site_page_sections), editableSections, publishedAt, updatedAt, generating, and url: the page's live address, or null while it's a draft, the site isn't live, or another renderer serves the site. Use url as is rather than building an address from the slug. A page belonging to a different agent returns a generic not-found error.

create_site_page

Create a new page by providing the content yourself. No LLM call. Pass body as markdown — it's wrapped in a hero (headline = title) plus a single section. Add images to show photos below the body, such as a case study's before and after.

Page types:

  • custom (default): a branded page whose slug is derived from the title (auto-suffixed -2, -3 on collision).
  • homepage: the brand's ordinary homepage page. It uses the fixed slug home, serves at the site root once published (and the site is public), and generates in the site's design language like any other page. One per agent, and it cannot coexist with an active AI-designed legacy homepage — while one of those exists (or is mid-build), creating or publishing a homepage page returns a plain explanation instead.
  • profile / faq: the brand's Profile or FAQ page. Only one of each per agent — if it already exists this returns an error pointing you to update_site_page. The reserved slug (profile / faq) is used automatically. A new Profile page shows the company profile and a new FAQ page shows the Business Info answers, not body; change those with update_company_profile. Once the page is edited section by section, edit its words with edit_site_page_sections.

Authentication: Required. The agent must belong to the authenticated account (owner, admin, or a group-shared member). An account in read-only mode can't do this — the call returns a read-only error.

Type: Write — non-destructive.

ParameterTypeRequiredDescription
syntheticIdintegerYesThe agent ID to add the page to.
type"custom" | "homepage" | "profile" | "faq"NoPage type. Defaults to custom. Typed pages (one each per agent) use their fixed slug automatically.
titlestring (1–300)YesPage title. Also drives the URL slug for custom pages.
bodystring (1–100000)YesPage body as markdown. Wrapped in a hero + single section by the renderer.
status"draft" | "published"NoPublication status. Defaults to draft.
metaDescriptionstring (≤500)NoShort SEO meta description.
imagesarray of { url, caption? } (≤8)NoPhotos for the page, in order, each shown full width below the body, such as a job's before and after. url is a public https image; caption (≤200) is shown as the photo's heading.
bespokeDesignbooleanNoCustom pages only. Generate a usage-gated design preview unique to this page instead of using the shared page-shape design. Unlike the rest of this tool, this triggers a metered background design generation.

Returns success, the syntheticId, the new agentPageId, plus the type, title, slug, and status. When bespokeDesign started a design preview, the response also includes the designId and designingPreview: true while the preview awaits a decision. A published page is only publicly reachable if the site itself is public — see set_site_public. The parked preview is the one place a build waits for a human decision; an approved design plan on the Site → Design tab drives the same preview, pause, and build, and resumes on your approval.

edit_site_page

Make one targeted visual change to an upgraded custom, Profile, FAQ, or Services page from a plain-language instruction. The generated page document is edited in place, but the page's canonical saved content remains the required contract. An edit that removes required content or introduces an untrusted destination is refused and not stored.

Authentication: Required. An account in read-only mode can't do this.

Type: Write — non-destructive.

ParameterTypeRequiredDescription
syntheticIdintegerYesThe agent ID that owns the page.
pageIdstringYesThe upgraded page UUID from list_site_pages.
instructionstring (≤500)YesThe single visual change to make and where it appears.

Runs in the background and returns designId, the per-run editId, pageId, and applying: true. If a structured page save happens while the word edit runs, the structured save wins and the word edit is discarded.

edit_site_page_sections

MCP clients display this tool as Edit a Site Page's Sections.

Add, remove, move or rewrite single sections of a page list_site_pages marks editableSections: true: one of your own (custom) pages, or the Home, Profile, FAQ or Offerings page once it's edited section by section. The hero and every section you don't name stay as they are. Call get_site_page first: its sections list gives each section's sectionId, type, heading, body and items. Pass the items you keep along with the ones you change. Synchronous, no LLM call. The page saves right away, so a published page changes on the site.

Authentication: Required. The agent must belong to the authenticated account (owner, admin, or a group-shared member). An account in read-only mode can't do this.

Type: Write, non-destructive.

ParameterTypeRequiredDescription
agentPageIdstringYesThe page to edit: one list_site_pages marks editableSections: true.
opsarray (1 to 20)YesThe changes, applied in order. See below.

Each op has an op and the fields it needs. Positions count sections from 0, right under the hero (the hero isn't one).

opFieldsWhat it does
addtype, position (default: the end), heading, body, itemsAdds a text-image, features, stats, testimonial or faq section with a new sectionId.
removesectionIdRemoves the section.
movesectionId, positionMoves the section to that position.
updatesectionId, plus heading, body and/or itemsReplaces those fields. New items replace the section's items; each keeps its icon unless you pass one.

body is markdown in a text-image section and a short plain-text intro in every other type. items are { title, description?, icon? }: a feature, a stat (its title is the number), an FAQ question and answer, or a testimonial (title is who said it, description the quote). A section must keep something to show: a body for text, an item with a title for features and stats, a question with an answer for FAQ, an item with a quote for a testimonial. An update with items replaces the whole list; an item keeps its icon when it has the same title as before. Limits: 40 sections a page, 24 items a section, 300 characters a heading or item title, 20,000 a body.

Returns success, the syntheticId, the agentPageId, applied (one line per op) and the page's sections after the change (sectionId, type, heading, itemCount). An unknown sectionId, a position out of range or an op that would empty a section is refused, and nothing is saved. A Home, Profile, FAQ or Offerings page that isn't edited section by section yet (editableSections: false), and a page that is still generating, are refused.

update_site_page

MCP clients display this tool as Update Site Page.

Edit the metadata of an existing page — its title, URL slug, and/or SEO meta description. Pass agentPageId plus whichever fields you want to change (at least one). Synchronous, no LLM call. The Home, Profile, FAQ and Offerings pages keep their fixed address, so a slug change on them is refused; their title and meta description change like any page's. To change a page's sections, use edit_site_page_sections on a page with editableSections: true; for any other page, use the page editor in the app.

Authentication: Required. The agent must belong to the authenticated account (owner, admin, or a group-shared member). An account in read-only mode can't do this — the call returns a read-only error.

Type: Write — non-destructive.

ParameterTypeRequiredDescription
agentPageIdstringYesThe page to edit (from list_site_pages).
titlestring (1–200)NoNew page title / hero headline. Omit to keep current.
slugstring (1–200)NoNew URL slug — resolves to /{username}/{slug}. Lowercase letters, numbers, and hyphens only. Must be unique per agent and cannot be a reserved slug (profile, faq, services). Custom pages only. Omit to keep current.
metaDescriptionstring (≤320)NoNew SEO meta description. Omit to keep current.

At least one of title, slug, or metaDescription must be provided. Returns success, the syntheticId, and the agentPageId. A page belonging to a different agent returns a generic not-found error.

publish_site_page

MCP clients display this tool as Publish Site Page.

Publish a page so it goes live at /{username}/{slug}, and ping IndexNow (Bing/Yandex) to re-crawl the newly-visible URL. Synchronous, no LLM call. The page must have finished generating its content first — publishing a page that's still generating is rejected (it would otherwise go live as an empty placeholder shell). Poll list_site_pages until it reports generating: false, then publish.

A published page is only publicly reachable if the site itself is public — use set_site_public to turn the whole site on.

Authentication: Required. The agent must belong to the authenticated account (owner, admin, or a group-shared member). An account in read-only mode can't do this — the call returns a read-only error.

Type: Write — non-destructive.

ParameterTypeRequiredDescription
agentPageIdstringYesThe page to publish (from list_site_pages).

Returns success, the syntheticId, the agentPageId, and url: the page's live address, or null when the site isn't live yet. A page belonging to a different agent returns a generic not-found error.

A section page's quality check (a custom page, or a Home, Profile, FAQ or Offerings page converted to sections) can hold the publish: a flagged claim nobody fixed or kept, edits the check hasn't read yet, or a check still running. Nothing is published, and the call returns success: false with error: "quality_check_open", a message saying what holds the page, and editorUrl, where the owner fixes or keeps each flagged claim or runs the check again. Notes (claims to double-check) never hold a page.

unpublish_site_page

MCP clients display this tool as Unpublish Site Page.

Take a page offline. The page stops resolving at its public URL and reverts to a draft, but is not deleted — re-publish it any time with publish_site_page. Synchronous, no LLM call. To remove a page permanently instead, use delete_site_page.

Authentication: Required. The agent must belong to the authenticated account (owner, admin, or a group-shared member). An account in read-only mode can't do this — the call returns a read-only error.

Type: Write — non-destructive.

ParameterTypeRequiredDescription
agentPageIdstringYesThe page to unpublish (from list_site_pages).

Returns success, the syntheticId, and the agentPageId. A page belonging to a different agent returns a generic not-found error.

delete_site_page

MCP clients display this tool as Delete Site Page.

Permanently remove a page from the brand's site. Destructive and irreversible. Anyone with access to the agent — including shared team members — can delete a page (alongside creating, editing, and publishing pages). Synchronous, no LLM call. To take a page offline without deleting it, use unpublish_site_page instead.

Authentication: Required. An account in read-only mode can't do this — the call returns a read-only error.

Type: Write — destructive (irreversible).

ParameterTypeRequiredDescription
agentPageIdstringYesThe page to delete (from list_site_pages).

Returns success, the syntheticId, and the deletedAgentPageId. A page belonging to a different agent returns the same generic not-found error (no distinction, so the page's existence isn't leaked).

generate_service_area_pages

Generate up to 12 local landing pages for a service business — one page per neighborhood × service combination, each with a lead-capture form and a complete full-code page design. The brand must have resolved service areas first; otherwise this returns an error. Pages stay as drafts for review. The disclosed ceiling is up to 12 pages × 24,000 output tokens per generation attempt (288,000 output tokens across one attempt per page); bounded retries and QA may add usage.

Authentication: Required.

Type: Write — non-destructive.

ParameterTypeRequiredDescription
syntheticIdintegerYesThe agent ID to generate service-area pages for.

Returns plannedCount, batchId, and syntheticId. The batch completes only after every enrolled page is ready, skipped, failed, or cancelled. Poll list_site_pages with this syntheticId and batchId until designBatch.terminal equals designBatch.total.

recreate_source_pages

Recreate up to 8 captured pages from a Primary brand's existing website, preserving source titles and descriptions, then generate a complete full-code design for every draft. The disclosed ceiling is up to 8 pages × 24,000 output tokens per generation attempt (192,000 output tokens across one attempt per page); bounded retries and QA may add usage. Drafts remain unpublished for owner review on the Pages view of the in-app Content list (/{syntheticId}/content?type=page); without a batch to poll, the result points the owner there.

Authentication: Required.

Type: Write — non-destructive.

ParameterTypeRequiredDescription
syntheticIdintegerYesThe agent whose captured source pages should be recreated.

Returns created, skipped, batchId, and an optional structural reason when no page needed recreation. When batchId is present, poll list_site_pages with it until designBatch.terminal equals designBatch.total.

On this page