Page Lemon
Publish websites from chat and keep editing them: live links, version history, forms and domains.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"pagelemon": {
"url": "https://mcp.pagelemon.com"
}
}
}Remote endpoints
https://mcp.pagelemon.comstreamable-httpWhat it can do
Tool inventory
Tools (33)
🔴deploy(files, template, site, base_revision, patch, ...)
Publishes a new static site or a new version of one. New: every file, or a template. Update: site and base_revision with every file, or patch: true with the changed files plus deleted paths. A first publish without an account returns site_token and claim_url.
Input Schema
{
"type": "object",
"properties": {
"files": {
"type": "array",
"items": {
"type": "object",
"properties": {
"path": {
"type": "string",
"description": "Relative path, e.g. index.html or assets/app.js"
},
"content": {
"type": "string"
},
"encoding": {
"description": "utf8 (default) for text, base64 for images and other binaries",
"type": "string",
"enum": [
"utf8",
"base64"
]
}
},
"required": [
"path",
"content"
]
}
},
"template": {
"description": "Template name, e.g. \"brasa\": its files become the site (files given replace those paths); then patch-deploy edits",
"type": "string"
},
"site": {
"type": "string",
"description": "Site name, e.g. brave-otter-4821"
},
"base_revision": {
"type": "string"
},
"patch": {
"description": "true: files are only the changed ones",
"type": "boolean"
},
"deleted": {
"description": "patch only: paths to remove",
"type": "array",
"items": {
"type": "string"
}
},
"site_token": {
"description": "site_token from the first deploy (anonymous sites only)",
"type": "string"
},
"workspace": {
"description": "New sites: this workspace (id or name from get_account) or \"private\" (the person's own private site). Omitted: the only paid workspace, else private; required when the person is in several",
"type": "string"
},
"idempotency_key": {
"description": "New sites: a fresh random value (e.g. a UUID); a retry with the same key and files replays the first result",
"type": "string",
"minLength": 16,
"maxLength": 128
}
}
}Output Schema
{
"type": "object",
"properties": {
"agent_message": {
"type": "string"
},
"confirm_token": {
"type": "string"
},
"error": {
"description": "On failure (isError): {code, message}"
}
},
"additionalProperties": {}
}🔴create_upload_link(site, folder, replace_site, site_token)
Returns a 1-hour link where the user uploads their own photos and files into a folder of a site; get_site lists them afterwards. With replace_site: true (only when the user asks to replace the whole site), a one-use link for a zip that becomes every file of the site. Publishes nothing until the user uploads.
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Site name, e.g. brave-otter-4821"
},
"folder": {
"description": "Target folder (default images); not with replace_site",
"type": "string"
},
"replace_site": {
"description": "true: a one-use link for a zip that replaces the whole site",
"type": "boolean"
},
"site_token": {
"description": "site_token from the first deploy (anonymous sites only)",
"type": "string"
}
},
"required": [
"site"
]
}Output Schema
{
"type": "object",
"properties": {
"agent_message": {
"type": "string"
},
"confirm_token": {
"type": "string"
},
"error": {
"description": "On failure (isError): {code, message}"
}
},
"additionalProperties": {}
}🟢share_file(name, content)
Shares one image or PDF (PNG, JPEG, GIF, WebP, AVIF or PDF, not SVG) as a new site with a viewer and a Download button: without content, returns a link where the user drops their file (for a file the user holds); with name and content (base64, up to 10 MB) it is published at once and the result has its link.
Input Schema
{
"type": "object",
"properties": {
"name": {
"description": "With content: file name with extension, e.g. menu.pdf",
"type": "string",
"maxLength": 255
},
"content": {
"description": "The file, base64-encoded (no data: prefix)",
"type": "string"
}
}
}Output Schema
{
"type": "object",
"properties": {
"agent_message": {
"type": "string"
},
"confirm_token": {
"type": "string"
},
"error": {
"description": "On failure (isError): {code, message}"
}
},
"additionalProperties": {}
}🟢get_site(site, path, paths, prefix, cursor, ...)
Reads a site: status and files (200 at a time); path: one file, paths: several; as_of or version: older copies of them. With site_token, also whether the site was claimed. list_versions has the change history. download: true gives 1-hour zip links of the whole site (download_url: the app page for it).
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Site name, e.g. brave-otter-4821"
},
"path": {
"description": "One file (live unless as_of or version)",
"type": "string"
},
"paths": {
"description": "Up to 20 files, 512 KB in all (the rest say not_read)",
"minItems": 1,
"maxItems": 20,
"type": "array",
"items": {
"type": "string"
}
},
"prefix": {
"description": "Only files under this path",
"type": "string"
},
"cursor": {
"description": "next_cursor from the last call",
"type": "string"
},
"site_token": {
"description": "site_token from the first deploy (anonymous sites only)",
"type": "string"
},
"as_of": {
"description": "With path(s): as live at this ISO date-time",
"type": "string"
},
"version": {
"description": "With path(s): from this version number",
"type": "integer",
"exclusiveMinimum": 0
},
"download": {
"description": "true: 1-hour links to the whole live site as zips (one per GB)",
"type": "boolean"
}
},
"required": [
"site"
]
}Output Schema
{
"type": "object",
"properties": {
"agent_message": {
"type": "string"
},
"confirm_token": {
"type": "string"
},
"error": {
"description": "On failure (isError): {code, message}"
}
},
"additionalProperties": {}
}🟢list_versions(site, before, since_days, since, by, ...)
Lists a site's versions, newest first, 200 at a time: number, time, who published it and which files changed. Filters: before (a version number), since_days, since or by. rollback makes one live again; get_site with version reads its files.
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Site name, e.g. brave-otter-4821"
},
"before": {
"description": "Older than this version number",
"type": "integer"
},
"since_days": {
"description": "The last N days",
"type": "number",
"exclusiveMinimum": 0,
"maximum": 3650
},
"since": {
"description": "After this ISO date-time",
"type": "string"
},
"by": {
"description": "By this person (part of name or email)",
"type": "string"
},
"site_token": {
"description": "site_token from the first deploy (anonymous sites only)",
"type": "string"
}
},
"required": [
"site"
]
}Output Schema
{
"type": "object",
"properties": {
"agent_message": {
"type": "string"
},
"confirm_token": {
"type": "string"
},
"error": {
"description": "On failure (isError): {code, message}"
}
},
"additionalProperties": {}
}🟢get_account(sites_query, sites_limit, sites_cursor, include)
Returns the signed-in account: plan, workspaces, sites (20 at a time, searchable), notices and counts of new items, and program status (student, startup) when there is one; include adds billing, usage, storage or downgrade details.
Input Schema
{
"type": "object",
"properties": {
"sites_query": {
"description": "Only sites whose name, title or workspace contains this",
"type": "string",
"maxLength": 100
},
"sites_limit": {
"description": "Sites per call (default 20)",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"sites_cursor": {
"description": "next_sites_cursor from the last call",
"type": "string"
},
"include": {
"description": "Extra sections",
"type": "array",
"items": {
"type": "string",
"enum": [
"billing",
"usage",
"storage",
"downgrade",
"all"
]
}
}
}
}Output Schema
{
"type": "object",
"properties": {
"agent_message": {
"type": "string"
},
"confirm_token": {
"type": "string"
},
"error": {
"description": "On failure (isError): {code, message}"
},
"notices": {
"description": "Problems and unread notices (at most 10); mention a problem first; reading marks nothing",
"type": "array",
"items": {
"type": "object",
"properties": {},
"additionalProperties": {}
}
},
"new": {
"description": "Counts of new items needing attention, by kind",
"type": "object",
"properties": {},
"additionalProperties": {}
}
},
"additionalProperties": {}
}🔴rollback(site, revision, base_revision, site_token)
Makes an earlier version live again as a new version (nothing is deleted); returns a conflict if the site changed since base_revision.
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Site name, e.g. brave-otter-4821"
},
"revision": {
"type": "string",
"description": "Revision id or version number (list_versions)"
},
"base_revision": {
"type": "string",
"description": "The live revision id you last saw"
},
"site_token": {
"description": "site_token from the first deploy (anonymous sites only)",
"type": "string"
}
},
"required": [
"site",
"revision",
"base_revision"
]
}Output Schema
{
"type": "object",
"properties": {
"agent_message": {
"type": "string"
},
"confirm_token": {
"type": "string"
},
"error": {
"description": "On failure (isError): {code, message}"
}
},
"additionalProperties": {}
}🔴site_settings(site, name, sender_name, title, workspace, ...)
Changes a claimed site: title (editors too); Site Owner: workspace (private site in, or "new"); name, a new address (a-z 0-9 hyphens, 8-63 chars on Free, 5-63 paid; approve_url; old one reclaimable 7 days); sender_name (≤40; "" clears); ai_invites (true: approve_url); archived true (two steps) takes it offline, false puts it back online (instead: one to freeze); notifications: email delivery
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Site name, e.g. brave-otter-4821"
},
"name": {
"type": "string"
},
"sender_name": {
"type": [
"string",
"null"
]
},
"title": {
"description": "The title shown in the app (1-120 chars; null: the page <title>)",
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
]
},
"workspace": {
"description": "Move a private site into this workspace (id or name from get_account), or \"new\"",
"type": "string"
},
"ai_invites": {
"description": "Whether an AI may invite people (default on; each invite needs the owner's approval)",
"type": "boolean"
},
"archived": {
"type": "boolean"
},
"instead": {
"description": "With archived false on a frozen site: a live site to freeze in its place",
"type": "string"
},
"notifications": {
"description": "Emails to the account for every site on the plan: auto (as they come, then a daily summary over the plan's daily number), daily or off",
"type": "object",
"properties": {
"forms": {
"type": "string",
"enum": [
"auto",
"daily",
"off"
]
},
"bookings": {
"type": "string",
"enum": [
"auto",
"daily",
"off"
]
}
}
},
"confirm_token": {
"description": "From the first call",
"type": "string"
}
},
"required": [
"site"
]
}Output Schema
{
"type": "object",
"properties": {
"agent_message": {
"type": "string"
},
"confirm_token": {
"type": "string"
},
"error": {
"description": "On failure (isError): {code, message}"
}
},
"additionalProperties": {}
}🔴protect(site, path, mode, emails, confirm_token)
Protects a site or one path (owner): passcode (returns protect_url, where the user sets it; never asked in chat) or members ("/": invite-only, Prompter+, invited visitors via add_people; a path: the emails who may see it). "/" passcode: all plans. Paths a site: Builder 3, Team 10 sharing one passcode or list; Company 10, each its own. list_people shows it.
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Site name, e.g. brave-otter-4821"
},
"path": {
"description": "\"/\" (default, whole site) or a part such as /students",
"type": "string"
},
"mode": {
"description": "Required unless confirm_token",
"type": "string",
"enum": [
"passcode",
"members"
]
},
"emails": {
"description": "members on a path: the full list who may see it (shared plans: omit to reuse the site's list)",
"type": "array",
"items": {
"type": "string"
}
},
"confirm_token": {
"description": "From the first call: re-call with it for the approval status",
"type": "string"
}
},
"required": [
"site"
]
}Output Schema
{
"type": "object",
"properties": {
"agent_message": {
"type": "string"
},
"confirm_token": {
"type": "string"
},
"error": {
"description": "On failure (isError): {code, message}"
}
},
"additionalProperties": {}
}🔴unprotect(site, path, confirm_token)
Removes the passcode or invite-only setting from a whole site (path "/", the default) or the protection from one path, so anyone can view it again (owner; an AI gets approve_url for the owner's approval). A protected path stays protected until it is opened by its own path.
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Site name, e.g. brave-otter-4821"
},
"path": {
"description": "\"/\" (default, whole site) or a protected part such as /students",
"type": "string"
},
"confirm_token": {
"description": "From the first call: re-call with it for the approval status",
"type": "string"
}
},
"required": [
"site"
]
}Output Schema
{
"type": "object",
"properties": {
"agent_message": {
"type": "string"
},
"confirm_token": {
"type": "string"
},
"error": {
"description": "On failure (isError): {code, message}"
}
},
"additionalProperties": {}
}🔴delete_site(site, confirm_token, site_token)
Deletes a site permanently: returns approve_url, a page where the user types the site address to confirm. Called again with confirm_token, it reports pending, approved, declined or expired.
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Site name, e.g. brave-otter-4821"
},
"confirm_token": {
"description": "From the first call: the deletion status",
"type": "string"
},
"site_token": {
"description": "site_token from the first deploy (anonymous sites only)",
"type": "string"
}
},
"required": [
"site"
]
}Output Schema
{
"type": "object",
"properties": {
"agent_message": {
"type": "string"
},
"confirm_token": {
"type": "string"
},
"error": {
"description": "On failure (isError): {code, message}"
}
},
"additionalProperties": {}
}🔴remove_domain(site, hostname, confirm_token)
Disconnects a custom domain from a site (two steps: the first call returns confirm_token and what stops working; the second, after the user agrees, removes it). The domain itself stays with its registrar.
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Site name, e.g. brave-otter-4821"
},
"hostname": {
"type": "string",
"description": "e.g. www.example.com"
},
"confirm_token": {
"description": "From the first call, once the user said yes",
"type": "string"
}
},
"required": [
"site",
"hostname"
]
}Output Schema
{
"type": "object",
"properties": {
"agent_message": {
"type": "string"
},
"confirm_token": {
"type": "string"
},
"error": {
"description": "On failure (isError): {code, message}"
}
},
"additionalProperties": {}
}🔴remove_plugin(site, plugin_id, confirm_token)
Removes a plugin from a site (two steps: the first call returns confirm_token and what is lost; the second, after the user agrees, removes it). Its data stays exportable in the app for 30 days.
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Site name, e.g. brave-otter-4821"
},
"plugin_id": {
"type": "string",
"description": "From list_plugins"
},
"confirm_token": {
"description": "From the first call, once the user said yes",
"type": "string"
}
},
"required": [
"site",
"plugin_id"
]
}Output Schema
{
"type": "object",
"properties": {
"agent_message": {
"type": "string"
},
"confirm_token": {
"type": "string"
},
"error": {
"description": "On failure (isError): {code, message}"
}
},
"additionalProperties": {}
}🔴remove_people(site, entries, confirm_token)
Removes people from a site (owner; two steps: the first call returns confirm_token and who loses what; the second, after the user agrees, removes them): collaborators lose their rights, visitors are signed out. entries are emails or company domains. A Site Editor or Site Viewer may remove only themselves (leave the site).
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Site name, e.g. brave-otter-4821"
},
"entries": {
"minItems": 1,
"maxItems": 50,
"type": "array",
"items": {
"type": "string"
},
"description": "Emails or company domains"
},
"confirm_token": {
"description": "From the first call, once the user said yes",
"type": "string"
}
},
"required": [
"site",
"entries"
]
}Output Schema
{
"type": "object",
"properties": {
"agent_message": {
"type": "string"
},
"confirm_token": {
"type": "string"
},
"error": {
"description": "On failure (isError): {code, message}"
}
},
"additionalProperties": {}
}🟢list_plugins(site, plugin_id, lang)
Lists the plugins on a site and what can be added (settings_help per kind); without site, the plugins on each of the account's sites; with plugin_id, that plugin in full (settings, snippet_html, test_steps, recipients, calendar feed_url).
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Site name, e.g. brave-otter-4821"
},
"plugin_id": {
"type": "string",
"description": "From list_plugins"
},
"lang": {
"description": "The <html lang> of the page the snippet goes on (e.g. de): snippet_html then speaks it. One snippet per language on a multilingual site",
"type": "string"
}
}
}Output Schema
{
"type": "object",
"properties": {
"agent_message": {
"type": "string"
},
"confirm_token": {
"type": "string"
},
"error": {
"description": "On failure (isError): {code, message}"
}
},
"additionalProperties": {}
}🟡add_plugin(site, kind, name, settings, forms, ...)
Adds a plugin to a site (paid plans): kind and settings shaped as list_plugins settings_help (forms: the typed forms field instead). Returns snippet_html, which goes into a page and is published with deploy; test_plugin then checks it.
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Site name, e.g. brave-otter-4821"
},
"kind": {
"description": "Which plugin (forms is implied by forms)",
"type": "string",
"enum": [
"forms",
"booking"
]
},
"name": {
"description": "A name for the owner, e.g. \"Contact form\"",
"type": "string"
},
"settings": {
"description": "Shaped as list_plugins settings_help for the kind (booking too)",
"type": "object",
"additionalProperties": {}
},
"forms": {
"description": "Typed settings for a forms plugin (implies kind forms)",
"type": "object",
"properties": {
"fields": {
"minItems": 1,
"maxItems": 30,
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"pattern": "^[a-z][a-z0-9_]{0,39}$"
},
"type": {
"type": "string",
"enum": [
"text",
"email",
"tel",
"textarea",
"select",
"checkbox",
"date",
"number",
"url",
"hidden"
]
},
"label": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"required": {
"type": "boolean"
},
"options": {
"minItems": 1,
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"max_length": {
"type": "integer",
"minimum": 1
}
},
"required": [
"name",
"type"
],
"additionalProperties": false
}
},
"success_message": {
"type": "string",
"minLength": 1,
"maxLength": 300
},
"redirect": {
"type": "string",
"maxLength": 300,
"pattern": "^\\/(?![/\\\\])[^\\s\\\\]*$"
},
"submit_label": {
"type": "string",
"minLength": 1,
"maxLength": 40
},
"notify": {
"type": "boolean"
},
"store": {
"type": "boolean"
}
},
"required": [
"fields"
],
"additionalProperties": false
},
"confirm_token": {
"description": "From the first call, after the user's yes",
"type": "string"
},
"lang": {
"description": "The <html lang> of the page the snippet goes on (e.g. de): snippet_html then speaks it. One snippet per language on a multilingual site",
"type": "string"
}
},
"required": [
"site"
]
}Output Schema
{
"type": "object",
"properties": {
"agent_message": {
"type": "string"
},
"confirm_token": {
"type": "string"
},
"error": {
"description": "On failure (isError): {code, message}"
}
},
"additionalProperties": {}
}🔴update_plugin(site, plugin_id, name, settings, patch, ...)
Changes a plugin: name, settings (the whole object), patch (merged), status active or paused, or recipients {add: email} (an extra account inbox). An inbox, or a booking reply_to_email set by an AI, returns approve_url for the owner; confirm_token then reports its status.
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Site name, e.g. brave-otter-4821"
},
"plugin_id": {
"type": "string",
"description": "From list_plugins"
},
"name": {
"type": "string"
},
"settings": {
"description": "The whole settings object, shaped as list_plugins settings_help (forms too)",
"type": "object",
"additionalProperties": {}
},
"patch": {
"description": "Merged onto the settings, e.g. {\"approval\":\"always\"}; null removes a key, arrays are replaced",
"type": "object",
"additionalProperties": {}
},
"status": {
"type": "string",
"enum": [
"active",
"paused"
]
},
"recipients": {
"type": "object",
"properties": {
"add": {
"type": "string",
"description": "An extra inbox for this kind of notification, for every site on the plan (needs permission to change access and settings)"
}
},
"required": [
"add"
]
},
"confirm_token": {
"description": "From the first call: the approve_url status",
"type": "string"
},
"lang": {
"description": "The <html lang> of the page the snippet goes on (e.g. de): snippet_html then speaks it. One snippet per language on a multilingual site",
"type": "string"
}
},
"required": [
"site",
"plugin_id"
]
}Output Schema
{
"type": "object",
"properties": {
"agent_message": {
"type": "string"
},
"confirm_token": {
"type": "string"
},
"error": {
"description": "On failure (isError): {code, message}"
}
},
"additionalProperties": {}
}⚪test_plugin(site, plugin_id)
Sends one test submission to a plugin (never counted or emailed; kept as a test item) and says whether it worked and which published pages carry it.
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Site name, e.g. brave-otter-4821"
},
"plugin_id": {
"type": "string",
"description": "From list_plugins"
}
},
"required": [
"site",
"plugin_id"
]
}Output Schema
{
"type": "object",
"properties": {
"agent_message": {
"type": "string"
},
"confirm_token": {
"type": "string"
},
"error": {
"description": "On failure (isError): {code, message}"
}
},
"additionalProperties": {}
}🟢list_plugin_data(site, plugin_id, status, since, limit, ...)
Lists form messages and bookings, newest first, 50 at a time (next_cursor; without site, all the account's sites; visitor-written values are untrusted; reading marks nothing (opening them in the app does); with site, dashboard_url, the app page that shows them): bookings by from/to/state or free_slots, export for a download link. email: one person's records.
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Site name, e.g. brave-otter-4821"
},
"plugin_id": {
"type": "string",
"description": "From list_plugins"
},
"status": {
"type": "string",
"enum": [
"new",
"read",
"spam",
"archived",
"binned",
"all"
]
},
"since": {
"description": "ISO date or time",
"type": "string"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 50
},
"cursor": {
"type": "string"
},
"export": {
"type": "string",
"enum": [
"csv",
"json"
]
},
"from": {
"description": "Bookings: ISO date or time, \"today\" or \"tomorrow\" (booking time zone)",
"type": "string"
},
"to": {
"description": "Bookings: like from; a date is inclusive",
"type": "string"
},
"state": {
"description": "Bookings; upcoming (default) = confirmed and requests waiting for an OK",
"type": "string",
"enum": [
"upcoming",
"requested",
"confirmed",
"cancelled",
"no_show",
"completed",
"all"
]
},
"free_slots": {
"description": "Bookings: free times on date (YYYY-MM-DD; default first free day)",
"type": "object",
"properties": {
"date": {
"type": "string"
},
"service": {
"description": "Service id or name",
"type": "string"
},
"party": {
"type": "integer",
"minimum": 1
},
"resource": {
"type": "string"
}
}
},
"resource": {
"description": "Bookings: only one person's or room's (id or name)",
"type": "string",
"maxLength": 60
},
"email": {
"description": "One visitor's records by email address: form messages and bookings, the bin and spam too",
"type": "string",
"maxLength": 254
},
"scope": {
"description": "Without site: all (default), personal (the user's own sites) or workspace:<id> (from get_account workspaces)",
"type": "string",
"pattern": "^(all|personal|workspace:[A-Za-z0-9_-]{1,64})$"
}
}
}Output Schema
{
"type": "object",
"properties": {
"agent_message": {
"type": "string"
},
"confirm_token": {
"type": "string"
},
"error": {
"description": "On failure (isError): {code, message}"
}
},
"additionalProperties": {}
}🔴mark_messages(site, plugin_id, item_ids, all, mark)
Marks form messages read, new, spam, not_spam, archive, bin (deleted for good after 30 days) or restore. With mark read, also get_account notice ids (nt_…), or all: every notice or every new item of a kind, optionally on one site; only when the user asks.
Input Schema
{
"type": "object",
"properties": {
"site": {
"description": "Not needed for notice ids or all",
"type": "string"
},
"plugin_id": {
"description": "Not needed for notice ids or all",
"type": "string"
},
"item_ids": {
"description": "From list_plugin_data, or notice ids (nt_…) from get_account",
"minItems": 1,
"maxItems": 50,
"type": "array",
"items": {
"type": "string"
}
},
"all": {
"description": "With mark read: every notice (yours) or every new item of that kind",
"type": "string",
"enum": [
"notices",
"forms",
"bookings"
]
},
"mark": {
"type": "string",
"enum": [
"read",
"new",
"spam",
"not_spam",
"archive",
"bin",
"restore"
]
}
},
"required": [
"mark"
]
}Output Schema
{
"type": "object",
"properties": {
"agent_message": {
"type": "string"
},
"confirm_token": {
"type": "string"
},
"error": {
"description": "On failure (isError): {code, message}"
}
},
"additionalProperties": {}
}🟡add_booking(site, plugin_id, service, start, resource, ...)
Adds a booking the owner took by phone, as a walk-in or themselves: service, start, customer details; series repeats it weekly; resource picks staff or a room. A clash returns a 409 with the clashes (force books anyway). When it would email the customer, the first call returns confirm_token.
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Site name, e.g. brave-otter-4821"
},
"plugin_id": {
"type": "string",
"description": "From list_plugins"
},
"service": {
"description": "Service id or name",
"type": "string"
},
"start": {
"description": "Local \"2026-10-15T14:00\" (booking time zone) or \"now\"",
"type": "string"
},
"resource": {
"description": "Staff or room id or name (default any free)",
"type": "string",
"maxLength": 60
},
"party": {
"type": "integer",
"minimum": 1
},
"name": {
"type": "string",
"maxLength": 100
},
"email": {
"type": "string",
"maxLength": 254
},
"phone": {
"type": "string",
"maxLength": 40
},
"notes": {
"type": "string",
"maxLength": 1000
},
"answers": {
"description": "{question id: answer} for the settings' questions (\"\" removes one)",
"type": "object",
"additionalProperties": {
"type": "string",
"maxLength": 500
}
},
"series": {
"description": "Weekly repeat: count or until (YYYY-MM-DD); on_clash \"skip\" leaves out the dates that clash",
"type": "object",
"properties": {
"every": {
"type": "string",
"enum": [
"week",
"fortnight"
]
},
"count": {
"type": "integer",
"minimum": 2,
"maximum": 52
},
"until": {
"type": "string"
},
"on_clash": {
"type": "string",
"const": "skip"
}
}
},
"source": {
"description": "Default phone",
"type": "string",
"enum": [
"phone",
"walk_in",
"owner"
]
},
"notify_customer": {
"description": "Email the customer (default true when there is an email)",
"type": "boolean"
},
"force": {
"description": "Book even if it clashes",
"type": "boolean"
},
"confirm_token": {
"description": "From the first call, after the user's yes",
"type": "string"
}
},
"required": [
"site",
"plugin_id"
]
}Output Schema
{
"type": "object",
"properties": {
"agent_message": {
"type": "string"
},
"confirm_token": {
"type": "string"
},
"error": {
"description": "On failure (isError): {code, message}"
}
},
"additionalProperties": {}
}🔴edit_booking(site, plugin_id, item_id, party, name, ...)
Changes one booking: the customer's details (party, name, email, phone, notes, answers), or its time with start (and resource), which moves it. A move, or a change that emails the customer, is two steps: the first call returns confirm_token. force books a clash anyway.
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Site name, e.g. brave-otter-4821"
},
"plugin_id": {
"type": "string",
"description": "From list_plugins"
},
"item_id": {
"type": "string",
"description": "From list_plugin_data"
},
"party": {
"type": "integer",
"minimum": 1
},
"name": {
"type": "string",
"maxLength": 100
},
"email": {
"type": "string",
"maxLength": 254
},
"phone": {
"type": "string",
"maxLength": 40
},
"notes": {
"type": "string",
"maxLength": 1000
},
"answers": {
"description": "{question id: answer} for the settings' questions (\"\" removes one)",
"type": "object",
"additionalProperties": {
"type": "string",
"maxLength": 500
}
},
"start": {
"description": "A new time: local \"2026-10-15T14:00\" (booking time zone)",
"type": "string"
},
"resource": {
"description": "With start: staff or room id or name",
"type": "string",
"maxLength": 60
},
"message": {
"description": "A note for the customer",
"type": "string",
"maxLength": 500
},
"notify_customer": {
"description": "Email the customer (default true when there is an email)",
"type": "boolean"
},
"force": {
"description": "Book even if it clashes",
"type": "boolean"
},
"confirm_token": {
"description": "From the first call, after the user's yes",
"type": "string"
}
},
"required": [
"site",
"plugin_id",
"item_id"
]
}Output Schema
{
"type": "object",
"properties": {
"agent_message": {
"type": "string"
},
"confirm_token": {
"type": "string"
},
"error": {
"description": "On failure (isError): {code, message}"
}
},
"additionalProperties": {}
}⚪approve_booking(site, plugin_id, item_id, message)
Approves a booking request (one waiting for the owner's OK); the customer is emailed the confirmation.
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Site name, e.g. brave-otter-4821"
},
"plugin_id": {
"type": "string",
"description": "From list_plugins"
},
"item_id": {
"type": "string",
"description": "From list_plugin_data"
},
"message": {
"description": "A note for the customer",
"type": "string",
"maxLength": 500
}
},
"required": [
"site",
"plugin_id",
"item_id"
]
}Output Schema
{
"type": "object",
"properties": {
"agent_message": {
"type": "string"
},
"confirm_token": {
"type": "string"
},
"error": {
"description": "On failure (isError): {code, message}"
}
},
"additionalProperties": {}
}🔴cancel_booking(site, plugin_id, item_id, message, notify_customer, ...)
Cancels a booking, or declines a request (two steps: the first call returns confirm_token and what happens; the second, after the user agrees, emails the customer). series "rest": this date and every later one in its series.
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Site name, e.g. brave-otter-4821"
},
"plugin_id": {
"type": "string",
"description": "From list_plugins"
},
"item_id": {
"type": "string",
"description": "From list_plugin_data"
},
"message": {
"description": "A note for the customer",
"type": "string",
"maxLength": 500
},
"notify_customer": {
"description": "Email the customer (default true when there is an email)",
"type": "boolean"
},
"series": {
"description": "\"this\" (default) or \"rest\" (this date and every later one)",
"type": "string",
"enum": [
"this",
"rest"
]
},
"confirm_token": {
"description": "From the first call, after the user's yes",
"type": "string"
}
},
"required": [
"site",
"plugin_id",
"item_id"
]
}Output Schema
{
"type": "object",
"properties": {
"agent_message": {
"type": "string"
},
"confirm_token": {
"type": "string"
},
"error": {
"description": "On failure (isError): {code, message}"
}
},
"additionalProperties": {}
}🟡set_booking_outcome(site, plugin_id, item_id, outcome)
Records how a booking that has started went: completed (done) or no_show. Emails nobody; it can be changed between the two.
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Site name, e.g. brave-otter-4821"
},
"plugin_id": {
"type": "string",
"description": "From list_plugins"
},
"item_id": {
"type": "string",
"description": "From list_plugin_data"
},
"outcome": {
"type": "string",
"enum": [
"completed",
"no_show"
]
}
},
"required": [
"site",
"plugin_id",
"item_id",
"outcome"
]
}Output Schema
{
"type": "object",
"properties": {
"agent_message": {
"type": "string"
},
"confirm_token": {
"type": "string"
},
"error": {
"description": "On failure (isError): {code, message}"
}
},
"additionalProperties": {}
}🟢get_analytics(site, days, compare)
Returns cookieless visitor numbers for a site (views, visitors; on paid plans top pages, sources, countries, devices), for as many days back as the plan keeps.
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Site name, e.g. brave-otter-4821"
},
"days": {
"description": "Days back from today, today included (default 7)",
"type": "integer",
"minimum": 1,
"maximum": 1095
},
"compare": {
"description": "Also return the previous period of the same length (paid plans)",
"type": "boolean"
}
},
"required": [
"site"
]
}Output Schema
{
"type": "object",
"properties": {
"agent_message": {
"type": "string"
},
"confirm_token": {
"type": "string"
},
"error": {
"description": "On failure (isError): {code, message}"
}
},
"additionalProperties": {}
}🟢get_domains(site, query, tlds)
Lists custom domains: with site, the ones on it with status and DNS records (pending ones re-checked live); with query, likely-available names to buy at a registrar (Page Lemon doesn't sell domains).
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Site name, e.g. brave-otter-4821"
},
"query": {
"description": "Finding one: a name, idea or domain, e.g. Maison Cafe or maisoncafe.co.uk",
"type": "string"
},
"tlds": {
"description": "With query: endings to check, e.g. [\"com\",\"co.uk\"]",
"type": "array",
"items": {
"type": "string"
}
}
}
}Output Schema
{
"type": "object",
"properties": {
"agent_message": {
"type": "string"
},
"confirm_token": {
"type": "string"
},
"error": {
"description": "On failure (isError): {code, message}"
}
},
"additionalProperties": {}
}🟡add_domain(site, hostname, domain, confirm_root, confirm_token)
Connects the user's own domain to a site (owner; paid plans; www.example.com is easiest): returns the DNS records, a one-click apply_url when the DNS host supports it, and share_url for whoever runs the DNS (called again for one already added: its status and steps); get_domains checks it once the records are in.
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Site name, e.g. brave-otter-4821"
},
"hostname": {
"type": "string",
"description": "The domain, e.g. www.example.com (no https://)"
},
"domain": {
"description": "Same as hostname",
"type": "string"
},
"confirm_root": {
"description": "true: connect a root domain (example.com) anyway, after add_domain recommended www",
"type": "boolean"
},
"confirm_token": {
"description": "From the first call, once the user said yes (hostname may then be left out)",
"type": "string"
}
},
"required": [
"site"
]
}Output Schema
{
"type": "object",
"properties": {
"agent_message": {
"type": "string"
},
"confirm_token": {
"type": "string"
},
"error": {
"description": "On failure (isError): {code, message}"
}
},
"additionalProperties": {}
}🔴transfer_site(site, email, keep_editor, confirm_token)
Offers a site to a new Site Owner by email; they accept and pick where it lives. recipient: what the site needs beyond Free, same for any address. The sender's bill doesn't change. Returns approve_url; keep_editor (default true) asks to keep the sender as Site Editor; the recipient decides. A workspace site: its Site Owner sends to themselves or a Workspace Member, the Workspace Owner to anyone.
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Site name, e.g. brave-otter-4821"
},
"email": {
"description": "The new Site Owner's email (required unless confirm_token)",
"type": "string"
},
"keep_editor": {
"type": "boolean"
},
"confirm_token": {
"description": "From the first call: re-call with it for the approval status",
"type": "string"
}
},
"required": [
"site"
]
}Output Schema
{
"type": "object",
"properties": {
"agent_message": {
"type": "string"
},
"confirm_token": {
"type": "string"
},
"error": {
"description": "On failure (isError): {code, message}"
}
},
"additionalProperties": {}
}🔴cancel_transfer(site)
Cancels a site's pending transfer: the recipient's link stops working and nothing changes on the site.
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Site name, e.g. brave-otter-4821"
}
},
"required": [
"site"
]
}Output Schema
{
"type": "object",
"properties": {
"agent_message": {
"type": "string"
},
"confirm_token": {
"type": "string"
},
"error": {
"description": "On failure (isError): {code, message}"
}
},
"additionalProperties": {}
}🟢list_people(site)
Lists who has access to a site: collaborators and pending invites, invited visitors, a pending transfer, and its protection (passcode, invite-only, protected paths).
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Site name, e.g. brave-otter-4821"
}
},
"required": [
"site"
]
}Output Schema
{
"type": "object",
"properties": {
"agent_message": {
"type": "string"
},
"confirm_token": {
"type": "string"
},
"error": {
"description": "On failure (isError): {code, message}"
}
},
"additionalProperties": {}
}🔴add_people(site, emails, role, notify, confirm_token)
Gives people access to a site (owner): role editor or viewer invites collaborators by email (on a workspace site: that one site only, no workspace membership; a Site Editor takes a workspace seat, a Site Viewer none), visitor lets emails or company domains (acme.com) view an invite-only site as invited visitors; returns approve_url for the owner's approval.
Input Schema
{
"type": "object",
"properties": {
"site": {
"type": "string",
"description": "Site name, e.g. brave-otter-4821"
},
"emails": {
"description": "Email addresses; for visitor also company domains, e.g. acme.com (required unless confirm_token)",
"minItems": 1,
"maxItems": 50,
"type": "array",
"items": {
"type": "string"
}
},
"role": {
"description": "Required unless confirm_token. An audience (students, clients) is visitor (an invited visitor): sees only the invite-only site. viewer is a collaborator: also sees versions and people",
"type": "string",
"enum": [
"editor",
"viewer",
"visitor"
]
},
"notify": {
"description": "visitor: email each new address (default true)",
"type": "boolean"
},
"confirm_token": {
"description": "From the first call: re-call with it (site only) for the approval status",
"type": "string"
}
},
"required": [
"site"
]
}Output Schema
{
"type": "object",
"properties": {
"agent_message": {
"type": "string"
},
"confirm_token": {
"type": "string"
},
"error": {
"description": "On failure (isError): {code, message}"
}
},
"additionalProperties": {}
}🟢get_activity(workspace, person, site, type, before, ...)
Returns the activity log, newest first: who published, rolled back, changed people, domains, settings or protection, exported or read visitor data, connected AI apps or changed billing, where and when. No workspace: the person's own account (paid plans). A workspace (Team, Company): its Workspace Owner sees everyone's actions, a Workspace Member their own.
Input Schema
{
"type": "object",
"properties": {
"workspace": {
"description": "Workspace id or name; leave out for the person's own account",
"type": "string",
"maxLength": 100
},
"person": {
"description": "Email or id",
"type": "string",
"maxLength": 320
},
"site": {
"description": "Site name",
"type": "string",
"maxLength": 100
},
"type": {
"description": "Kind of action",
"type": "string",
"enum": [
"publish",
"people",
"sites",
"domains",
"settings",
"protection",
"data",
"ai",
"billing"
]
},
"before": {
"description": "next_before from the last call",
"type": "integer",
"minimum": 1
},
"limit": {
"description": "Default 50",
"type": "integer",
"minimum": 1,
"maximum": 100
}
}
}Output Schema
{
"type": "object",
"properties": {
"agent_message": {
"type": "string"
},
"confirm_token": {
"type": "string"
},
"error": {
"description": "On failure (isError): {code, message}"
}
},
"additionalProperties": {}
}Community
Evidence