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) uses credits, whether those credits come from a monthly plan allowance or a standalone top-up.

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 on the Pages screen reports generating: true until its content lands.
  4. get_site_page to read the full body; update_site_page to adjust title, slug, or meta description.
  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 screen 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 in-app Pages screen 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.

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, and generating. 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, publishedAt, updatedAt, and generating. 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, no credits. Pass body as markdown — it's wrapped in a hero (headline = title) plus a single section.

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 typed 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.

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.
bespokeDesignbooleanNoCustom pages only. Generate a credit-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 with available credits. This metered edit is billed to the agent's owning account; credits can come from a plan allowance or a standalone top-up. 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.

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. To change the page's body, 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). 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, and the agentPageId. A page belonging to a different agent returns a generic not-found error.

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 with available credits. Generating the pages uses LLM credits billed to the owner; credits can come from a plan allowance or a standalone top-up.

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.

Authentication: Required with available credits. Credits can come from a plan allowance or a standalone top-up and are billed to the owner.

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