Page Lemon

Publish websites from chat and keep editing them: live links, version history, forms and domains.

Should I use this

Quality & Safety

A
Description quality
99%
Schema completeness
96%
Naming quality
95%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~9,904Tokens (tool definitions)
~2.4 KBTypical response size
Significant attention impact (7.74% of 128k context)

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-http

What it can do

Tool inventory

Tools (33)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🔴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

Rate this Server

Evidence

Recent observations

verifiedversion not recorded33 tools