Build and publish site pages
List, read, create, generate, 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 or AI-generating content, editing metadata, and taking pages live or offline. When a generated homepage or template redesign lands, Pendium also starts matching full-code designs for eligible published pages in the background.
When to use
Use these tools to manage the durable Pages on the site: the Profile, FAQ, custom pages, and local service-area landing pages. For the brand's whole-page front door, generate_homepage composes an AI-designed homepage at /home/{username}, while apply_homepage_template redesigns it in a gallery style. 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). Building NEW pages with AI (generate_site_page, generate_service_area_pages, recreate_source_pages) requires a Starter or Pro plan with available credits. Designing the homepage itself (generate_homepage, apply_homepage_template, edit_homepage, style variants) is open on every plan, including free accounts with no credits.
Typical sequence
list_site_pages— see what pages already exist and their generation status; pass a bulk tool'sbatchIdto poll full-design outcomes.- Author the page:
create_site_page(you provide the content, no LLM) orgenerate_site_page(AI writes it in the background). For local businesses,generate_service_area_pagescreates one page per neighborhood × service. - For one AI-generated page, poll
list_site_pagesuntil it reportsgenerating: false. For a bulk full-design batch, pass itsbatchIdand poll untildesignBatch.terminalequalsdesignBatch.total. get_site_pageto read the full body;update_site_pageto adjust title, slug, or meta description.publish_site_pageto go live (ensure the site itself is public viaset_site_public).unpublish_site_pageto revert to draft, ordelete_site_pageto remove permanently.
Generating or redesigning the homepage adds one background step after the homepage becomes active: Pendium enrolls eligible published pages for matching full-code designs. If the homepage generator omits its site-design manifest, page enrollment waits. A repair worker stores the current manifest first, then dispatches the page-design follow-up so pages never inherit the previous homepage's visual system.
Design generation is deduplicated: asking for a design (homepage or per-page) 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.
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.
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.
| Parameter | Type | Required | Description |
|---|---|---|---|
syntheticId | integer | Yes | The agent ID whose pages to list. |
batchId | string (UUID) | No | A 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
agentPageId | string | Yes | The 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. To have AI write the content instead, use generate_site_page.
Page types:
custom(default): a branded page whose slug is derived from the title (auto-suffixed-2,-3on collision).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 toupdate_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.
| Parameter | Type | Required | Description |
|---|---|---|---|
syntheticId | integer | Yes | The agent ID to add the page to. |
type | "custom" | "profile" | "faq" | No | Page type. Defaults to custom. |
title | string (1–300) | Yes | Page title. Also drives the URL slug for custom pages. |
body | string (1–100000) | Yes | Page body as markdown. Wrapped in a hero + single section by the renderer. |
status | "draft" | "published" | No | Publication status. Defaults to draft. |
metaDescription | string (≤500) | No | Short SEO meta description. |
Returns success, the syntheticId, the new agentPageId, plus the type, title, slug, and status. A published page is only publicly reachable if the site itself is public — see set_site_public.
generate_site_page
Create a new page and generate its content with AI. The page is created immediately as a draft shell, then a background job fills in the hero and sections. This tool returns right away — poll list_site_pages until the page reports generating: false. For local service-area landing pages, use generate_service_area_pages instead.
Authentication: Paid. The agent's owning account must have available credits (a Starter or Pro plan) — the background content generation uses LLM credits, billed to the owner.
Type: Write — non-destructive.
| Parameter | Type | Required | Description |
|---|---|---|---|
syntheticId | integer | Yes | The agent ID to add the page to. |
title | string (1–200) | Yes | Human-readable page title. Shows as the hero headline and in nav. |
slug | string (1–200) | Yes | URL slug — the page resolves to /{username}/{slug}. Lowercase letters, numbers, and hyphens only. Must be unique per agent and cannot be a reserved slug (profile, faq, services, resources, service-areas). |
category | enum | No | Nav placement. product (default) = an offering, shown in the Products/Services nav. resource = a topic/pillar page, shown in the Resources nav. |
Returns agentPageId, plus the syntheticId, slug, title, and category. The page starts as a draft with placeholder content; poll list_site_pages and wait for generating: false, then publish it with publish_site_page.
generate_homepage
Generate the brand's AI-designed homepage, a bespoke whole-page design with its own palette, typography, and section layout. An LLM design director composes it from the brand's real content and photos, and the result is served at /home/{username}. This differs from generate_site_page, which creates one tier-2 crawler page. The tool returns right away; the design generates in the background (~1–2 minutes) and is saved as a new version each run. The owner previews it in-app, and it goes public at /home/{username} only once the homepage is published.
Authentication: Required, no plan or credit balance needed. This is a metered LLM generation billed to the agent's owning account, but designing the site is deliberately open on every plan — connecting a custom domain is where a Starter or Pro plan is required. An account in read-only mode can't do this.
Type: Write — non-destructive.
| Parameter | Type | Required | Description |
|---|---|---|---|
syntheticId | positive integer | Yes | The agent ID to generate the homepage for. |
moodPrompt | string (≤300) | No | Optional design direction, e.g. "big type, lots of whitespace, editorial". Omit to let the design director choose from the brand's content. |
Returns the designId and version for the design that is now generating, plus the syntheticId. Poll the brand's homepage status (or wait for the completion notification) before treating the design as ready.
After the homepage lands, Pendium automatically enrolls up to 12 eligible published pages that do not already have a ready or pending full-code design. This follow-up runs in the background and uses the homepage's current site-design manifest. If generation omitted that manifest, enrollment pauses while a repair worker extracts and stores it; repair completion dispatches the page-design follow-up.
generate_homepage_variants
Explore several homepage looks at once: runs the AI design director multiple times in divergent curated style directions (Editorial, Bold & Confident, Warm & Human, Dark Technical) and produces real candidate designs the owner picks from. The live homepage does not change until a candidate is chosen with choose_homepage_variant. Returns right away; the variants generate in the background (~3–5 minutes).
Authentication: Required, no plan or credit balance needed. This is a metered LLM generation billed to the agent's owning account, but designing the site is deliberately open on every plan — connecting a custom domain is where a Starter or Pro plan is required. An account in read-only mode can't do this.
Type: Write — non-destructive.
| Parameter | Type | Required | Description |
|---|---|---|---|
syntheticId | integer | Yes | The agent ID to generate style variants for. |
directionKeys | string[] (1–4) | No | Style directions to explore: editorial, bold, warm, technical, minimal, heritage. Omit for a curated trio. |
moodPrompt | string (≤300) | No | Optional extra design direction applied to every variant. |
Returns the batch designId and the directions being generated. Poll list_homepage_variants until the candidates appear.
list_homepage_variants
List the homepage style-variant candidates currently awaiting the owner's pick. Each carries a direction name, one-line vibe, and the design thesis the AI wrote for that variant. The design thesis may be null for designs generated as free-code (the current default), which carry no primitive design spec. Visual previews live on the in-app Homepage page.
Authentication: Required. The agent must belong to the authenticated account.
Type: Read-only.
| Parameter | Type | Required | Description |
|---|---|---|---|
syntheticId | integer | Yes | The agent ID to list variant candidates for. |
Returns candidates — each with designId, direction, name, vibe, and designThesis. An empty list means nothing is awaiting a pick.
choose_homepage_variant
Build one style-variant candidate as the brand's homepage — a full AI redesign in that style, generated as real code in the background (~1–2 minutes). This uses credits (like a Regenerate) and is not active instantly, so confirm the user wants to spend credits before calling. The other candidates are retired. Changes what renders at /home/{username} once the homepage is published.
Authentication: Required. The agent must belong to the authenticated account. An account in read-only mode can't do this.
Type: Write — non-destructive.
| Parameter | Type | Required | Description |
|---|---|---|---|
syntheticId | integer | Yes | The agent ID the candidate belongs to. |
designId | string | Yes | The candidate's designId from list_homepage_variants. |
Returns success: true when the pick applied. success: false means the candidate was no longer available (already picked, or replaced by a newer batch) — call list_homepage_variants for the current set.
list_homepage_templates
List the homepage template gallery — curated design languages (Editorial, Bold & Confident, Warm & Human, Dark Technical, Swiss Minimal, Heritage & Craft), each with a full example-site mockup image. The mockups are real renders of each style applied to a demo brand, so they show exactly what the design system produces. Templates differ from variants: variants are one-off explorations of your brand; templates are a persistent gallery you can re-apply any time.
Authentication: Required. The agent must belong to the authenticated account.
Type: Read-only.
| Parameter | Type | Required | Description |
|---|---|---|---|
syntheticId | integer | Yes | The agent ID (templates are global; the call is access-scoped). |
Returns templates — each with key, name, vibe, and mockupUrl (a full-page mockup image suitable for showing in a card).
apply_homepage_template
Redesign the agent's homepage in one of the gallery templates. The design director regenerates the page in that design language while the brand's own content, logo, and photos stay in place. It runs in the background (~1–2 minutes) and lands as a new design version. The previous version is kept.
Authentication: Required, no plan or credit balance needed. This is a metered LLM generation billed to the agent's owning account, but designing the site is deliberately open on every plan — connecting a custom domain is where a Starter or Pro plan is required. An account in read-only mode can't do this.
Type: Write — non-destructive.
| Parameter | Type | Required | Description |
|---|---|---|---|
syntheticId | positive integer | Yes | The agent ID to redesign the homepage for. |
templateKey | "editorial" | "bold" | "warm" | "technical" | "minimal" | "heritage" | Yes | The template's key from list_homepage_templates. |
moodPrompt | string (≤300) | No | Optional extra direction layered on top of the template. |
Returns the new designId, version, and generating: true. The redesigned homepage appears on the in-app Homepage page when ready; it's live at /home/{username} only while the homepage is published.
When the redesigned homepage lands, Pendium automatically enrolls up to 12 eligible published pages that lack a ready or pending full-code design. Each page uses the new homepage's site-design manifest. If the generator omits the manifest, enrollment waits for the repair worker to store it, and repair completion starts the page-design follow-up.
edit_homepage
Make one targeted change to the brand's live code-written homepage from a plain-language instruction — e.g. "remove the gold shape after the hero" or "make the hero shorter". The model edits the existing page in place: only the described change is applied, and every other section, wording, and style stays exactly as it is. This is not a redesign (use apply_homepage_template or generate_homepage for a new look). Describe what you see and where it is on the page — the model can't see a screenshot. Requires an existing code-written homepage.
Authentication: Required, no plan or credit balance needed. This is a metered LLM generation billed to the agent's owning account, but designing the site is deliberately open on every plan — connecting a custom domain is where a Starter or Pro plan is required. An account in read-only mode can't do this.
Type: Write — non-destructive.
| Parameter | Type | Required | Description |
|---|---|---|---|
syntheticId | integer | Yes | The agent ID whose homepage to edit. |
instruction | string (≤500) | Yes | The single change to make, described by what it looks like and where it is — e.g. "remove the wavy gold band below the hero". |
Runs in the background (~1 minute) and returns the target designId with applying: true. If nothing on the page matched the description, the edit makes no change (it won't invent one). The change lands on the in-app Homepage page when ready; it's live at /home/{username} only while the homepage is published.
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, no plan or credit balance needed. This is a metered LLM generation billed to the agent's owning account, but designing the site is deliberately open on every plan — connecting a custom domain is where a Starter or Pro plan is required. An account in read-only mode can't do this.
Type: Write — non-destructive.
| Parameter | Type | Required | Description |
|---|---|---|---|
syntheticId | integer | Yes | The agent ID that owns the page. |
pageId | string | Yes | The upgraded page UUID from list_site_pages. |
instruction | string (≤500) | Yes | The 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 (re)generate the page's hero and section content, use generate_site_page instead.
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.
| Parameter | Type | Required | Description |
|---|---|---|---|
agentPageId | string | Yes | The page to edit (from list_site_pages). |
title | string (1–200) | No | New page title / hero headline. Omit to keep current. |
slug | string (1–200) | No | New 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. |
metaDescription | string (≤320) | No | New 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
agentPageId | string | Yes | The 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
agentPageId | string | Yes | The 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).
| Parameter | Type | Required | Description |
|---|---|---|---|
agentPageId | string | Yes | The 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: Paid. The agent's owning account must have available credits (a Starter or Pro plan) — generating the pages uses LLM credits, billed to the owner.
Type: Write — non-destructive.
| Parameter | Type | Required | Description |
|---|---|---|---|
syntheticId | integer | Yes | The 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: Paid. The agent's owning account must have available credits on a Starter or Pro plan.
Type: Write — non-destructive.
| Parameter | Type | Required | Description |
|---|---|---|---|
syntheticId | integer | Yes | The Primary 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.