Skip to main content
Glama

Publish HTML as a Foliyo link

publish_html
Destructive

Create or update a Foliyo link from finished HTML: static by default, or interactive:true to keep its scripts in a sandboxed frame. For NEW work, first resolve all six choices through prepare_foliyo and obtain approval of the complete summary (readyToBuild=true); a format choice alone does not authorize publishing or defaulting other choices. Returns the URL, generated PIN and requested personal recipient links. The API's fallback PIN is not permission to skip the access question. Updates preserve omitted settings and require the current revision from get_page. An unverified email gate records claimed addresses; verified email access requires Pro. Notification email is opt-in. Video must already be on YouTube, Vimeo or Loom (or a hosted https file) and embedded by link: Foliyo does not store video files, and video is a Pro feature.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "html": "<html>"
    },
    "name": "publish_html"
  }
}

Input Schema

NameRequiredDescriptionDefault
toNoNamed recipients. Each gets their own link so opens are attributable.
gateNoUse "pin" for a generated code, "email" to collect addresses (Pro; verify:true proves mailbox access), "domain:acme.com" to restrict email domain, or "none" to explicitly open a page and remove its PIN. Omit on updates to preserve the current policy.
htmlYesThe full HTML document to publish. WRITE IT FOR A PHONE FIRST: most of these links are opened on one. A viewport meta tag, max-width rather than fixed pixel widths, images at max-width:100%, a single column below ~640px, and nothing that needs sideways scrolling. The server adds a viewport tag when you leave it out, but it cannot reflow a 900px-wide layout.
noteNoOne plain line saying what changed, e.g. "Added the Q3 numbers". Shown to readers on the project hub under 'what changed since you were last here', and used in the update email. Write it every time you republish something inside a project: it is what saves the user from explaining the change to their team by hand.
slugNoPreferred URL slug. One taken for you if omitted.
replyNoPut a one-line reply box at the foot of the page so readers can answer without leaving it. true for the default label, or your own short prompt.
titleNoTitle shown on the page and in link previews.
trackNoEnable viewing analytics; plan limits still apply.
assetsNo
formatNoPresentation format; fixed slides use data-foliyo-slide on every slide.
notifyNoEmail everyone already holding this link to say it has been updated. Off by default, because republishing while you iterate must not mail anybody. Pass true only when the user says to tell them.
senderNoWho it is from: a saved identity's label, e.g. "Ashford Advertising". brand_guide lists the saved identities. Unknown labels are refused.
verifyNoEmail a code to prove the viewer owns the address.
expiresNoWhen it stops working: "14d", "48h", or an ISO date.
projectNoWhich saved project this belongs to, e.g. "acme". Settles the letterhead, the design guide and the recipients in one, so none of them need asking again. Anything you pass explicitly still wins. If the user works on several streams of work and has projects saved, pick the matching one rather than re-asking the same three questions.
audienceNoA saved group to send to, e.g. "acme-team". Expands into named recipients exactly as if you had typed them, and stacks with `to` for one-offs. brand_guide lists them.
maxViewsNoStop working after this many views.
notesOffNoPro only. Section names (heading text or data-section) to switch reader notes off for. Sections are on by default. Omit to leave the current setting; [] switches all back on. When two headings share a name, 'name#index' (index = the section's 0-based position among the page's h1/h2/h3/data-section elements, e.g. 'Summary#4') switches off only that one; the plain name switches off every section with that name. Authors can also mark a heading with data-notes="off".
passwordNoA code of the user's own for the PIN gate. LEAVE IT OUT unless the user named one: with gate:"pin" and no `password`, the server mints six digits and returns them as `sharePassword`, which is the code to repeat back. Never invent one yourself - an invented code is a different shape every time, and the lock screen asks the recipient for six digits. A code the user does name is kept as given (minimum 4 characters). Everyone shares the one code, so every reader stays anonymous in the report: add `to` for personal links, or use gate:"email" when the user wants names.
descriptionNo
interactiveNoKeep the page's scripts. The document runs in a sandboxed frame like a Claude artifact: inline scripts and scripts from cdnjs.cloudflare.com, cdn.jsdelivr.net, unpkg.com, cdn.tailwindcss.com and code.jquery.com; stylesheets from fonts.googleapis.com and those hosts; no fetch or network; localStorage and sessionStorage work per reader, up to 64 KB; no cookies, no dialogs, no embedded documents. Omit on updates to keep the page's current setting. Off by default: a static page is lighter and prints completely.
acceptStaticNoAcknowledge removal of scripted functionality from a STATIC page. Prefer interactive:true when the scripts matter, or convert to static HTML first.
expectedRevisionNoRequired for updates. Use the revision returned by get_page, never guess.
allowContentRemovalNoOnly true after the user intentionally removes content reported by preflight or an update warning.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changed
    • removedInput schema / additionalProperties
      Removed value: -false
    • removedInput schema / properties / assets / items / additionalProperties
      Removed value: -false
    • addedInput schema / properties / expectedRevision / maximum
      Added value: +9007199254740991
    • changedInput schema / properties / maxViews / anyOf
      Previous value: -[
      -  {
      -    "exclusiveMinimum": 0,
      -    "type": "integer"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "exclusiveMinimum": 0,
      +    "maximum": 9007199254740991,
      +    "type": "integer"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedInput schema / properties / to / items / additionalProperties
      Removed value: -false
  2. Changed1 schema field changed
    • changedInput schema / properties / interactive / description
      Previous value: -"Keep the page's scripts. The document runs in a sandboxed frame like a Claude artifact: inline scripts and scripts from cdnjs.cloudflare.com, cdn.jsdelivr.net, unpkg.com, cdn.tailwindcss.com and code.jquery.com; stylesheets from fonts.googleapis.com and those hosts; no fetch or network, no storage or cookies, no dialogs, no embedded documents. Omit on updates to keep the page's current setting. Off by default: a static page is lighter and prints completely."New value: +"Keep the page's scripts. The document runs in a sandboxed frame like a Claude artifact: inline scripts and scripts from cdnjs.cloudflare.com, cdn.jsdelivr.net, unpkg.com, cdn.tailwindcss.com and code.jquery.com; stylesheets from fonts.googleapis.com and those hosts; no fetch or network; localStorage and sessionStorage work per reader, up to 64 KB; no cookies, no dialogs, no embedded documents. Omit on updates to keep the page's current setting. Off by default: a static page is lighter and prints completely."
  3. Changed3 schema fields changed
    • changedInput schema / properties / acceptStatic / description
      Previous value: -"Acknowledge removal of scripted functionality. Prefer converting to static HTML before publishing."New value: +"Acknowledge removal of scripted functionality from a STATIC page. Prefer interactive:true when the scripts matter, or convert to static HTML first."
    • addedInput schema / properties / interactive
      Added value: +{
      +  "description": "Keep the page's scripts. The document runs in a sandboxed frame like a Claude artifact: inline scripts and scripts from cdnjs.cloudflare.com, cdn.jsdelivr.net, unpkg.com, cdn.tailwindcss.com and code.jquery.com; stylesheets from fonts.googleapis.com and those hosts; no fetch or network, no storage or cookies, no dialogs, no embedded documents. Omit on updates to keep the page's current setting. Off by default: a static page is lighter and prints completely.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / notesOff
      Added value: +{
      +  "description": "Pro only. Section names (heading text or data-section) to switch reader notes off for. Sections are on by default. Omit to leave the current setting; [] switches all back on. When two headings share a name, 'name#index' (index = the section's 0-based position among the page's h1/h2/h3/data-section elements, e.g. 'Summary#4') switches off only that one; the plain name switches off every section with that name. Authors can also mark a heading with data-notes=\"off\".",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  4. Changed3 schema fields changed
    • addedInput schema / properties / allowContentRemoval
      Added value: +{
      +  "description": "Only true after the user intentionally removes content reported by preflight or an update warning.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / expectedRevision
      Added value: +{
      +  "description": "Required for updates. Use the revision returned by get_page, never guess.",
      +  "exclusiveMinimum": 0,
      +  "type": "integer"
      +}
    • addedInput schema / properties / format
      Added value: +{
      +  "description": "Presentation format; fixed slides use data-foliyo-slide on every slide.",
      +  "enum": [
      +    "web",
      +    "slides-16-9",
      +    "slides-flexible",
      +    "interactive-static"
      +  ],
      +  "type": "string"
      +}
  5. First observed

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=false, but the description adds substantial context beyond them: updates preserve omitted settings, an unverified email gate records claimed addresses, verified email requires Pro, notification email is opt-in, video must be hosted elsewhere and is Pro-only, and the server injects a viewport tag. These are real behavioral facts an agent would otherwise have to discover by failing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and mode in the first clause, then workflow, then return values, then edge cases — no filler sentences. It is dense and somewhat run-on when enumerating video/Pro constraints, but every sentence carries operational information rather than restating structured fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 24-parameter mutation with no output schema, the description supplies what the structure cannot: the required preflight workflow, revision requirement, what is returned (URL, PIN, recipient links), Pro gating, and preservation semantics on update. An agent could call this correctly from the description alone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 92%, so the schema already does most of the work and baseline would be 3. The description still adds meaning the schema does not: the fallback PIN is not permission to skip the access question, personal recipient links are attributable per recipient, and omitted settings are preserved on update. That is genuine semantic value on top of an already rich schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource pair: 'Create or update a Foliyo link from finished HTML', and immediately qualifies the two modes (static default vs interactive sandboxed frame). It also distinguishes itself from nearby siblings by naming prepare_foliyo as the prerequisite for new work and get_page as the source of the revision for updates.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use routing: for NEW work, resolve all six choices through prepare_foliyo and get readyToBuild=true approval, with the caveat that a format choice alone does not authorize publishing. For updates it states the current revision from get_page is required, and it flags opt-in notification and the PIN-vs-access-question distinction. Alternatives and preconditions are named, not implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources