Skip to main content
Glama

update_portal_page

Idempotent

Update a portal page's HTML or name. Can also make it the default page. Before changing the HTML always get_portal_page and pass checksum + site_id from SURFACE CONTEXT. IMPORTANT: if the page holds forms or tables with data, better use generate_ai_site, not this tool directly. If you do insert an iframe by hand, the only right format is: src='https://quintadb.com/widgets/APP_ID/ENTITY_ID?iframe=true'. APP_ID and ENTITY_ID come from describe_project. Do NOT invent other URLs.

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": {
      "app_id": "<app_id>",
      "portal_id": "<portal_id>",
      "page_id": "<page_id>"
    },
    "name": "update_portal_page"
  }
}

Input Schema

NameRequiredDescriptionDefault
htmlNoNew HTML content of the page
nameNoNew page name
app_idYesProject ID (from list_projects)
page_idYesPortal page ID (from list_portal_pages)
site_idNosite_id from SURFACE CONTEXT — dual-write into the right Site.
portal_idYesPortal ID (from list_portals or describe_project)
embed_formNoThe MAIN way to PUT A FORM ON THE SITE («add a request form to the page», «so that a visitor leaves their contacts»). The server itself inserts a ready block with the form into the html and does NOT rewrite the rest — quinta-* blocks physically cannot be harmed. Do NOT pass html and page_checksum together with embed_form. If the form is already there, the answer says already_embedded and duplicates NOTHING.
nav_appendNoThe MAIN way to add an item to the SITE MENU: the server itself inserts <a> into the page's <nav> and does NOT touch the rest of the html (quinta-* blocks are guaranteed whole). Do NOT pass html and page_checksum together with nav_append. If page_id is not known, it can be left empty — the site's home page is taken.
must_containNoA targeted edit (e.g. a site menu item): lines that MUST be in the saved HTML (the link's name, href). An independent verify check — if they are missing, the edit counts as failed.
page_checksumNoSHA256 of the current HTML from get_portal_page.checksum. REQUIRED when updating html — a call without checksum is refused.
set_as_defaultNoMake this page the home page

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed14 schema fields changed
    • changedInput schema / properties / embed_form / description
      Previous value: -"ОСНОВНИЙ шлях ПОСТАВИТИ ФОРМУ НА САЙТ («додай форму заявок на сторінку», «щоб відвідувач залишав контакти»). Сервер сам вставляє готовий блок з формою у html і НЕ переписує решту — quinta-* блоки фізично не можуть постраждати. НЕ передавай html і page_checksum разом із embed_form. Форма вже стоїть — відповідь скаже already_embedded і НІЧОГО не продублює."New value: +"The MAIN way to PUT A FORM ON THE SITE («add a request form to the page», «so that a visitor leaves their contacts»). The server itself inserts a ready block with the form into the html and does NOT rewrite the rest — quinta-* blocks physically cannot be harmed. Do NOT pass html and page_checksum together with embed_form. If the form is already there, the answer says already_embedded and duplicates NOTHING."
    • changedInput schema / properties / embed_form / properties / anchor_text / description
      Previous value: -"Видимий текст на сторінці, ПІСЛЯ секції з яким поставити форму (напр. заголовок «Лійка лідів»). Не знайдено або не передано — форма стане в кінці сторінки, і відповідь це прямо скаже."New value: +"Visible text on the page AFTER whose section the form is put (e.g. the heading «Lead funnel»). Not found or not passed — the form goes to the end of the page, and the answer says so plainly."
    • changedInput schema / properties / embed_form / properties / entity_id / description
      Previous value: -"ID форми/таблиці, яку вбудовуємо (list_forms)"New value: +"ID of the form/table being embedded (list_forms)"
    • changedInput schema / properties / embed_form / properties / heading / description
      Previous value: -"Заголовок над формою для відвідувача"New value: +"Heading above the form for the visitor"
    • changedInput schema / properties / embed_form / properties / subtext / description
      Previous value: -"Рядок пояснення під заголовком"New value: +"A line of explanation under the heading"
    • changedInput schema / properties / html / description
      Previous value: -"Новий HTML контент сторінки"New value: +"New HTML content of the page"
    • changedInput schema / properties / must_contain / description
      Previous value: -"Точкова правка (напр. пункт меню сайту): рядки, які МУСЯТЬ бути в збереженому HTML (назва лінка, href). Незалежна verify-перевірка — якщо їх нема, правка вважається неуспішною."New value: +"A targeted edit (e.g. a site menu item): lines that MUST be in the saved HTML (the link's name, href). An independent verify check — if they are missing, the edit counts as failed."
    • changedInput schema / properties / name / description
      Previous value: -"Нова назва сторінки"New value: +"New page name"
    • changedInput schema / properties / nav_append / description
      Previous value: -"ОСНОВНИЙ шлях додати пункт у МЕНЮ САЙТУ: сервер сам вставляє <a> у <nav> сторінки і НЕ торкається решти html (quinta-* блоки гарантовано цілі). НЕ передавай html і page_checksum разом із nav_append. Якщо page_id невідомий — можна лишити порожнім, візьметься головна сторінка сайту."New value: +"The MAIN way to add an item to the SITE MENU: the server itself inserts <a> into the page's <nav> and does NOT touch the rest of the html (quinta-* blocks are guaranteed whole). Do NOT pass html and page_checksum together with nav_append. If page_id is not known, it can be left empty — the site's home page is taken."
    • changedInput schema / properties / nav_append / properties / href / description
      Previous value: -"href лінка (напр. #contact або /page)"New value: +"The link's href (e.g. #contact or /page)"
    • changedInput schema / properties / nav_append / properties / name / description
      Previous value: -"Видимий текст пункту меню"New value: +"The menu item's visible text"
    • changedInput schema / properties / page_checksum / description
      Previous value: -"SHA256 поточного HTML з get_portal_page.checksum. ОБОВ'ЯЗКОВО при оновленні html — виклик без checksum буде відхилено."New value: +"SHA256 of the current HTML from get_portal_page.checksum. REQUIRED when updating html — a call without checksum is refused."
    • changedInput schema / properties / set_as_default / description
      Previous value: -"Зробити цю сторінку головною"New value: +"Make this page the home page"
    • changedInput schema / properties / site_id / description
      Previous value: -"site_id з SURFACE CONTEXT — dual-write у правильний Site."New value: +"site_id from SURFACE CONTEXT — dual-write into the right Site."
  2. Changed1 schema field changed
    • addedInput schema / properties / embed_form
      Added value: +{
      +  "description": "ОСНОВНИЙ шлях ПОСТАВИТИ ФОРМУ НА САЙТ («додай форму заявок на сторінку», «щоб відвідувач залишав контакти»). Сервер сам вставляє готовий блок з формою у html і НЕ переписує решту — quinta-* блоки фізично не можуть постраждати. НЕ передавай html і page_checksum разом із embed_form. Форма вже стоїть — відповідь скаже already_embedded і НІЧОГО не продублює.",
      +  "properties": {
      +    "anchor_text": {
      +      "description": "Видимий текст на сторінці, ПІСЛЯ секції з яким поставити форму (напр. заголовок «Лійка лідів»). Не знайдено або не передано — форма стане в кінці сторінки, і відповідь це прямо скаже.",
      +      "type": "string"
      +    },
      +    "entity_id": {
      +      "description": "ID форми/таблиці, яку вбудовуємо (list_forms)",
      +      "type": "string"
      +    },
      +    "heading": {
      +      "description": "Заголовок над формою для відвідувача",
      +      "type": "string"
      +    },
      +    "subtext": {
      +      "description": "Рядок пояснення під заголовком",
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  3. Changed1 schema field changed
    • addedInput schema / properties / nav_append
      Added value: +{
      +  "description": "ОСНОВНИЙ шлях додати пункт у МЕНЮ САЙТУ: сервер сам вставляє <a> у <nav> сторінки і НЕ торкається решти html (quinta-* блоки гарантовано цілі). НЕ передавай html і page_checksum разом із nav_append. Якщо page_id невідомий — можна лишити порожнім, візьметься головна сторінка сайту.",
      +  "properties": {
      +    "href": {
      +      "description": "href лінка (напр. #contact або /page)",
      +      "type": "string"
      +    },
      +    "name": {
      +      "description": "Видимий текст пункту меню",
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  4. Changed1 schema field changed
    • addedInput schema / properties / must_contain
      Added value: +{
      +  "description": "Точкова правка (напр. пункт меню сайту): рядки, які МУСЯТЬ бути в збереженому HTML (назва лінка, href). Незалежна verify-перевірка — якщо їх нема, правка вважається неуспішною.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  5. Changed2 schema fields changed
    • addedInput schema / properties / page_checksum
      Added value: +{
      +  "description": "SHA256 поточного HTML з get_portal_page.checksum. ОБОВ'ЯЗКОВО при оновленні html — виклик без checksum буде відхилено.",
      +  "type": "string"
      +}
    • addedInput schema / properties / site_id
      Added value: +{
      +  "description": "site_id з SURFACE CONTEXT — dual-write у правильний Site.",
      +  "type": "string"
      +}
  6. First observed

TDQS

A4.6/5.0
Behavior5/5

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

Adds substantial behavior beyond the annotations: calls without page_checksum are refused, embed_form/nav_append insert blocks server-side without rewriting the rest of the HTML, quinta-* blocks are guaranteed intact, and duplicates return already_embedded. This is consistent with idempotentHint=true and destructiveHint=false rather than contradicting them.

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

Conciseness3/5

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

The first three sentences are well front-loaded, but the text then sprawls into iframe URL formatting and site-building advice that is tangential to invoking this tool, making it read as a working memo rather than a tight definition.

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

Completeness4/5

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

For an 11-parameter tool with nested objects and no output schema, the description covers the prerequisite workflow, mutually exclusive parameter combinations, and the side effects of the embed/nav convenience parameters. The one gap is that it never says what the response contains beyond 'the answer says so plainly' / 'already_embedded'.

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 100%, so the baseline is 3, but the description earns extra credit by documenting cross-parameter constraints the schema cannot express (do not pass html and page_checksum together with embed_form or nav_append) and the mandatory checksum pairing for HTML edits.

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 specific verb and resource ('Update a portal page's HTML or name') plus the extra scope of making it the default page. It also names the sibling it is not for ('if the page holds forms or tables with data, better use generate_ai_site'), so an agent can distinguish it without opening schemas.

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 an explicit precondition ('always get_portal_page and pass checksum + site_id from SURFACE CONTEXT') and an explicit exclusion with a named alternative (generate_ai_site for pages with live forms/tables). It also routes to describe_project for APP_ID/ENTITY_ID rather than letting the agent guess.

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