MCP ServerTool Reference

Sites and pages

Generated MCP reference for sites and pages.

This page is generated from mcp-catalog.json. Do not edit it by hand.

Source: paper3 local extraction on 2026-05-29. Generated: 2026-05-29T11:34:45.044Z.

create_page

Create page

Creates a new page in the site. Pass a unique slug (e.g. '/about' or '/blog/[slug]' for dynamic pages) and a human title. The page ships with THREE breakpoint artboards by default — desktop (1280), tablet (834), mobile (390) — laid out side-by-side on the canvas. Tablet inherits visually from desktop, mobile inherits from tablet, until you author divergent content into them. ALWAYS author desktop first; the inheritance handles the smaller breakpoints automatically. Set withDefaultArtboard: false only if you intend to drop in custom artboards via add_artboard_breakpoint. Returns the new page id and the desktop artboard id.

Parameters

ParameterTypeRequiredDescription
slugstringYes
titlestringYes
metaobjectNo
withDefaultArtboardbooleanNo
isHomebooleanNo
_sitestringNoOptional target site formatted as <workspaceSlug>/<siteSlug>. Required when the workspace has multiple sites and no site header is set.

Input schema

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    },
    "title": {
      "type": "string"
    },
    "meta": {
      "type": "object",
      "properties": {
        "metaTitle": {
          "type": "string"
        },
        "metaDescription": {
          "type": "string"
        },
        "canonicalUrl": {
          "type": "string"
        },
        "noIndex": {
          "type": "boolean"
        },
        "noFollow": {
          "type": "boolean"
        },
        "locale": {
          "type": "string"
        },
        "keywords": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "alternates": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "locale": {
                "type": "string"
              },
              "url": {
                "type": "string"
              }
            },
            "required": [
              "locale",
              "url"
            ],
            "additionalProperties": false
          }
        },
        "ogTitle": {
          "type": "string"
        },
        "ogDescription": {
          "type": "string"
        },
        "ogImage": {
          "type": "string"
        },
        "twitterCard": {
          "type": "string",
          "enum": [
            "summary",
            "summary_large_image"
          ]
        },
        "twitterSite": {
          "type": "string"
        },
        "quickAnswer": {
          "type": "string"
        },
        "publishedAt": {
          "type": "string"
        },
        "updatedAt": {
          "type": "string"
        },
        "author": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string"
            },
            "url": {
              "type": "string"
            },
            "jobTitle": {
              "type": "string"
            },
            "sameAs": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          "required": [
            "name"
          ],
          "additionalProperties": false
        },
        "aiCrawlers": {
          "type": "object",
          "properties": {
            "gptbot": {
              "type": "boolean"
            },
            "googleExtended": {
              "type": "boolean"
            },
            "claudeWeb": {
              "type": "boolean"
            },
            "perplexityBot": {
              "type": "boolean"
            },
            "ccBot": {
              "type": "boolean"
            },
            "bytespider": {
              "type": "boolean"
            },
            "applebot": {
              "type": "boolean"
            }
          },
          "additionalProperties": false
        },
        "speakable": {
          "type": "object",
          "properties": {
            "cssSelectors": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "xpath": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          "additionalProperties": false
        },
        "schemas": {
          "type": "array",
          "items": {
            "type": "object",
            "additionalProperties": {}
          }
        }
      },
      "additionalProperties": false
    },
    "withDefaultArtboard": {
      "type": "boolean"
    },
    "isHome": {
      "type": "boolean"
    },
    "_site": {
      "type": "string",
      "description": "Optional target site formatted as <workspaceSlug>/<siteSlug>. Required when the workspace has multiple sites and no site header is set.",
      "pattern": "^[^/]+/[^/]+$"
    }
  },
  "required": [
    "slug",
    "title"
  ],
  "additionalProperties": false
}

delete_page

Delete page

Removes a page from the site. The site must always retain at least one page; deleting the only page is a no-op.

Parameters

ParameterTypeRequiredDescription
pageIdstringYes
_sitestringNoOptional target site formatted as <workspaceSlug>/<siteSlug>. Required when the workspace has multiple sites and no site header is set.

Input schema

{
  "type": "object",
  "properties": {
    "pageId": {
      "type": "string"
    },
    "_site": {
      "type": "string",
      "description": "Optional target site formatted as <workspaceSlug>/<siteSlug>. Required when the workspace has multiple sites and no site header is set.",
      "pattern": "^[^/]+/[^/]+$"
    }
  },
  "required": [
    "pageId"
  ],
  "additionalProperties": false
}

duplicate_page

Duplicate page

Clones a page with a fresh id and slug. Useful when iterating on variations or when an existing page is the right starting point for a new one.

Parameters

ParameterTypeRequiredDescription
pageIdstringYes
titlestringNo
slugstringNo
_sitestringNoOptional target site formatted as <workspaceSlug>/<siteSlug>. Required when the workspace has multiple sites and no site header is set.

Input schema

{
  "type": "object",
  "properties": {
    "pageId": {
      "type": "string"
    },
    "title": {
      "type": "string"
    },
    "slug": {
      "type": "string"
    },
    "_site": {
      "type": "string",
      "description": "Optional target site formatted as <workspaceSlug>/<siteSlug>. Required when the workspace has multiple sites and no site header is set.",
      "pattern": "^[^/]+/[^/]+$"
    }
  },
  "required": [
    "pageId"
  ],
  "additionalProperties": false
}

list_pages

List pages

Returns the full sitemap: every page with its slug, title, meta, isHome, hidden, and the list of artboards it owns. Call this before edits to know the page ids.

Parameters

ParameterTypeRequiredDescription
_sitestringNoOptional target site formatted as <workspaceSlug>/<siteSlug>. Required when the workspace has multiple sites and no site header is set.

Input schema

{
  "type": "object",
  "properties": {
    "_site": {
      "type": "string",
      "description": "Optional target site formatted as <workspaceSlug>/<siteSlug>. Required when the workspace has multiple sites and no site header is set.",
      "pattern": "^[^/]+/[^/]+$"
    }
  },
  "additionalProperties": false
}

regenerate_sitemap

Regenerate sitemap

Triggers a fresh emit of /sitemap.xml. paper3 generates the sitemap on every request from the live doc.pages (no static cache), so this tool is effectively a confirmation hook: call it after a batch of page mutations to fetch the resulting URL set, validate the structure, and confirm to the user that the published sitemap reflects the latest changes. Returns the absolute sitemap URL.

Parameters

ParameterTypeRequiredDescription
_sitestringNoOptional target site formatted as <workspaceSlug>/<siteSlug>. Required when the workspace has multiple sites and no site header is set.

Input schema

{
  "type": "object",
  "properties": {
    "_site": {
      "type": "string",
      "description": "Optional target site formatted as <workspaceSlug>/<siteSlug>. Required when the workspace has multiple sites and no site header is set.",
      "pattern": "^[^/]+/[^/]+$"
    }
  },
  "additionalProperties": false
}

set_page_collection_binding

Bind page to a CMS collection

Turns a page into a CMS-driven page. mode: 'listing' makes it the feed page (typically /<collection-slug>) — drop a &lt;div data-paper-type="repeater" data-collection-id="…"> inside it via write_html to render the items. mode: 'single' makes it a dynamic per-item template — give the page slug a [slug] segment (e.g. '/posts/[slug]') and the public router substitutes the matched item's slug in the URL, then renders the page with \{\{field\}\} tokens resolved against that item. Pass binding: null to disconnect.

The single-template route is wired: a published item with slug 'my-post' will render at '/posts/my-post'. Use \{\{title\}\}, \{\{coverImage\}\}, \{\{@url\}\}, etc. anywhere in the authored HTML to bind to the current item's data.

For any new collection ship the pair: ONE listing page (e.g. /posts) + ONE single template (e.g. /posts/[slug]). See get_guide(\{ topic: 'collections' \}) for the full flow.

Parameters

ParameterTypeRequiredDescription
pageIdstringYes
bindingunknownYes
_sitestringNoOptional target site formatted as <workspaceSlug>/<siteSlug>. Required when the workspace has multiple sites and no site header is set.

Input schema

{
  "type": "object",
  "properties": {
    "pageId": {
      "type": "string"
    },
    "binding": {},
    "_site": {
      "type": "string",
      "description": "Optional target site formatted as <workspaceSlug>/<siteSlug>. Required when the workspace has multiple sites and no site header is set.",
      "pattern": "^[^/]+/[^/]+$"
    }
  },
  "required": [
    "pageId",
    "binding"
  ],
  "additionalProperties": false
}

update_page

Update page (title / slug / status / meta / home — pick fields)

One-stop page mutator. Pass pageId plus ANY subset of fields you want to change — the rest stay untouched.

Fields: • title — human-readable title shown in the editor sidebar + default nav label. Separate from meta.metaTitle (the SEO title). • slug — URL slug. Normalised to lowercase + dashes + leading /. Use [name] segments for dynamic pages bound to a collection. • statuspublished | draft | hidden. Default published. Mirrors status === 'hidden' onto the legacy hidden flag automatically. • hidden — boolean shortcut for status=hidden vs status=published. Kept for back-compat with the old set_page_hidden tool; prefer status. • isHometrue makes this page the site's home page (slug becomes /). Other pages are demoted automatically. • meta — patch the page's SEO/GEO/social meta bag (metaTitle / metaDescription / ogImage / quickAnswer / aiCrawlers / schemas / …). Combined with metaReplace: true to overwrite instead of patch-merge. • metaReplace — paired with meta. When true the existing meta is wiped and replaced wholesale.

Recipes: • Rename : \{ pageId, title: 'About us' \} • Slug : \{ pageId, slug: '/about' \} • Publish: \{ pageId, status: 'published' \} • Hide : \{ pageId, status: 'hidden' \} • Home : \{ pageId, isHome: true \} • Meta : \{ pageId, meta: \{ metaTitle: 'About — Acme', metaDescription: '...' \} \}

Parameters

ParameterTypeRequiredDescription
pageIdstringYes
titlestringNo
slugstringNo
statusstringNo
hiddenbooleanNo
isHomebooleanNo
metaobjectNo
metaReplacebooleanNo
_sitestringNoOptional target site formatted as <workspaceSlug>/<siteSlug>. Required when the workspace has multiple sites and no site header is set.

Input schema

{
  "type": "object",
  "properties": {
    "pageId": {
      "type": "string"
    },
    "title": {
      "type": "string"
    },
    "slug": {
      "type": "string"
    },
    "status": {
      "type": "string",
      "enum": [
        "published",
        "draft",
        "hidden"
      ]
    },
    "hidden": {
      "type": "boolean"
    },
    "isHome": {
      "type": "boolean"
    },
    "meta": {
      "type": "object",
      "properties": {
        "metaTitle": {
          "type": "string"
        },
        "metaDescription": {
          "type": "string"
        },
        "canonicalUrl": {
          "type": "string"
        },
        "noIndex": {
          "type": "boolean"
        },
        "noFollow": {
          "type": "boolean"
        },
        "locale": {
          "type": "string"
        },
        "keywords": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "alternates": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "locale": {
                "type": "string"
              },
              "url": {
                "type": "string"
              }
            },
            "required": [
              "locale",
              "url"
            ],
            "additionalProperties": false
          }
        },
        "ogTitle": {
          "type": "string"
        },
        "ogDescription": {
          "type": "string"
        },
        "ogImage": {
          "type": "string"
        },
        "twitterCard": {
          "type": "string",
          "enum": [
            "summary",
            "summary_large_image"
          ]
        },
        "twitterSite": {
          "type": "string"
        },
        "quickAnswer": {
          "type": "string"
        },
        "publishedAt": {
          "type": "string"
        },
        "updatedAt": {
          "type": "string"
        },
        "author": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string"
            },
            "url": {
              "type": "string"
            },
            "jobTitle": {
              "type": "string"
            },
            "sameAs": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          "required": [
            "name"
          ],
          "additionalProperties": false
        },
        "aiCrawlers": {
          "type": "object",
          "properties": {
            "gptbot": {
              "type": "boolean"
            },
            "googleExtended": {
              "type": "boolean"
            },
            "claudeWeb": {
              "type": "boolean"
            },
            "perplexityBot": {
              "type": "boolean"
            },
            "ccBot": {
              "type": "boolean"
            },
            "bytespider": {
              "type": "boolean"
            },
            "applebot": {
              "type": "boolean"
            }
          },
          "additionalProperties": false
        },
        "speakable": {
          "type": "object",
          "properties": {
            "cssSelectors": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "xpath": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          "additionalProperties": false
        },
        "schemas": {
          "type": "array",
          "items": {
            "type": "object",
            "additionalProperties": {}
          }
        }
      },
      "additionalProperties": false
    },
    "metaReplace": {
      "type": "boolean"
    },
    "_site": {
      "type": "string",
      "description": "Optional target site formatted as <workspaceSlug>/<siteSlug>. Required when the workspace has multiple sites and no site header is set.",
      "pattern": "^[^/]+/[^/]+$"
    }
  },
  "required": [
    "pageId"
  ],
  "additionalProperties": false
}

update_site_settings

Update site settings

Patches every site-wide knob in doc.settings. Each field is optional — pass only what you want to change. Supported fields: brandName, baseUrl (production URL — drives canonical / OG / sitemap), faviconUrl, defaultLocale, locales (hreflang set), defaultMeta (inherits into every page's PageMeta — title template, description, og*, jsonLd[], aiCrawlers, …), defaultAiCrawlers (per-bot allow/block defaults — also serialised into /robots.txt), organization (publisher Organization JSON-LD: name, url, logoUrl, sameAs[], description), and robotsTxt (manual override served verbatim at /robots.txt — set to empty / undefined to fall back to the auto-generated content). The organization block + AI crawlers + a clean robots.txt are the highest-impact GEO levers: LLMs weigh publisher authority when picking citations and only crawl what the bot directives let them through.

Parameters

ParameterTypeRequiredDescription
settingsobjectYes
replacebooleanNo
_sitestringNoOptional target site formatted as <workspaceSlug>/<siteSlug>. Required when the workspace has multiple sites and no site header is set.

Input schema

{
  "type": "object",
  "properties": {
    "settings": {
      "type": "object",
      "properties": {
        "brandName": {
          "type": "string"
        },
        "baseUrl": {
          "type": "string"
        },
        "faviconUrl": {
          "type": "string"
        },
        "defaultLocale": {
          "type": "string"
        },
        "locales": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "defaultMeta": {
          "type": "object",
          "properties": {
            "metaTitle": {
              "type": "string"
            },
            "metaDescription": {
              "type": "string"
            },
            "canonicalUrl": {
              "type": "string"
            },
            "noIndex": {
              "type": "boolean"
            },
            "noFollow": {
              "type": "boolean"
            },
            "locale": {
              "type": "string"
            },
            "keywords": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "alternates": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "locale": {
                    "type": "string"
                  },
                  "url": {
                    "type": "string"
                  }
                },
                "required": [
                  "locale",
                  "url"
                ],
                "additionalProperties": false
              }
            },
            "ogTitle": {
              "type": "string"
            },
            "ogDescription": {
              "type": "string"
            },
            "ogImage": {
              "type": "string"
            },
            "twitterCard": {
              "type": "string",
              "enum": [
                "summary",
                "summary_large_image"
              ]
            },
            "twitterSite": {
              "type": "string"
            },
            "quickAnswer": {
              "type": "string"
            },
            "publishedAt": {
              "type": "string"
            },
            "updatedAt": {
              "type": "string"
            },
            "author": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "jobTitle": {
                  "type": "string"
                },
                "sameAs": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "required": [
                "name"
              ],
              "additionalProperties": false
            },
            "aiCrawlers": {
              "type": "object",
              "properties": {
                "gptbot": {
                  "type": "boolean"
                },
                "googleExtended": {
                  "type": "boolean"
                },
                "claudeWeb": {
                  "type": "boolean"
                },
                "perplexityBot": {
                  "type": "boolean"
                },
                "ccBot": {
                  "type": "boolean"
                },
                "bytespider": {
                  "type": "boolean"
                },
                "applebot": {
                  "type": "boolean"
                }
              },
              "additionalProperties": false
            },
            "speakable": {
              "type": "object",
              "properties": {
                "cssSelectors": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "xpath": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "additionalProperties": false
            },
            "schemas": {
              "type": "array",
              "items": {
                "type": "object",
                "additionalProperties": {}
              }
            }
          },
          "additionalProperties": false
        },
        "defaultAiCrawlers": {
          "type": "object",
          "properties": {
            "gptbot": {
              "type": "boolean"
            },
            "googleExtended": {
              "type": "boolean"
            },
            "claudeWeb": {
              "type": "boolean"
            },
            "perplexityBot": {
              "type": "boolean"
            },
            "ccBot": {
              "type": "boolean"
            },
            "bytespider": {
              "type": "boolean"
            },
            "applebot": {
              "type": "boolean"
            }
          },
          "additionalProperties": false
        },
        "organization": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string"
            },
            "url": {
              "type": "string"
            },
            "logoUrl": {
              "type": "string"
            },
            "sameAs": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": {
              "type": "string"
            }
          },
          "required": [
            "name"
          ],
          "additionalProperties": false
        },
        "robotsTxt": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "replace": {
      "type": "boolean"
    },
    "_site": {
      "type": "string",
      "description": "Optional target site formatted as <workspaceSlug>/<siteSlug>. Required when the workspace has multiple sites and no site header is set.",
      "pattern": "^[^/]+/[^/]+$"
    }
  },
  "required": [
    "settings"
  ],
  "additionalProperties": false
}

On this page