Skip to main content
Glama

Update portal configuration

update_portal_configuration
Destructive

[Admin] Import portal configuration documents, the same ones get_portal_configuration returns: branding, interview portal, coaching portal, brands, and portal sites (pages, menu, footer, theme CSS, style settings, CSS files). With dry_run: true nothing is written, and the answer has the summary, warnings and changes the same call makes without it. Fields a document omits keep their value, and languages are only ever added. Validation is all-or-nothing: a 422 lists every error and nothing is written. Pages land as drafts the company reviews in the admin; publish: true puts the pages and theme live at once, and it also builds and publishes the stylesheet of any brand whose settings or CSS files the documents carry. Brands, style settings and CSS files are switched on per company by JobMojito; while off, those parts are refused with 422. A CSS file's version, sent back, makes the call refuse a file someone else changed.

Every argument in full, with examples: get_tool_reference.

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": {
      "documents": "<documents>"
    },
    "name": "update_portal_configuration"
  }
}

Input Schema

NameRequiredDescriptionDefault
kindNoOptional: lock the call to one document type, as one admin import tab does. Every document must then be that type (`portal-site` accepts both portal-site and portal-page formats), and a document that declares neither `kind` nor `format` is read as this type with a warning. Without it, every document must declare its own `kind` or `format`.
portalNoWhere portal-site pages and theme CSS go: `interview` (candidate-facing interview / careers portal) or `consumer` (coaching portal). Default: the portal-site document's own `portal`, else `interview`.
dry_runNoValidate and report what would change (summary, warnings, changes) without writing anything.
publishNoAlso publish the imported pages and theme CSS (live at once, as the admin's "Publish after import"). Default false: pages land as drafts the company reviews in the admin. Built-in page drafts produced by interview-portal / coaching-portal documents are never published. With page versions switched on, only a company owner or admin may publish.
documentsYes1 to 20 documents, applied in order (a later document wins where two set the same thing). Every field a document omits keeps its current value; languages are only ever added, never removed.
llm_modelNoYour model id, e.g. "claude-opus-4-8"; "unknown" if unsure. For analytics.
merchant_idNoOptional merchant to configure. Admins and sub-merchant operators only; other callers always use their token's merchant.
conversation_idNoThe conversation_id this server returned earlier in this conversation, unchanged, including after later user messages. Omit it if you have none. Recorded for the server developer's analytics.

Output Schema

NameRequiredDescriptionDefault
changesYes
dry_runYes
documentsYes
merchant_idYes
_mcp_instructionsNoServer-issued metadata for this conversation.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed41 schema fields changed
    • removedInput schema / properties / documents / items / description
      Removed value: -"One configuration document: declares either `kind` (branding, interview-portal, coaching-portal, brands) or `format` (jobmojito.portal-site, jobmojito.portal-page), plus that type's fields. Field reference: branding https://developer.jobmojito.com/cookbooks/portal-branding/branding, interview portal https://developer.jobmojito.com/cookbooks/portal-branding/interview-portal, coaching portal https://developer.jobmojito.com/cookbooks/portal-branding/coaching-portal, portal pages https://developer.jobmojito.com/cookbooks/portal-branding/portal-pages. Unknown fields are ignored with a warning; wrong types and enum values are errors."
    • removedInput schema / properties / documents / items / properties / format / description
      Removed value: -"Portal site document type. `jobmojito.portal-site`: `{ portal, theme: { css }, style_settings, css_files: [{ path, brand, content, sort_order, version }], pages: [Page] }`, a whole site (pages in every language, the menu, the footer and the theme CSS). `jobmojito.portal-page`: `{ page: Page }`, one page. Page = `{ slug, brand, show_in_menu, sort_order, languages: [{ mojito_language_code, title, description, blocks }] }`; slug \"\" is the home page, \"_footer\", \"_support\", \"_jobs\" etc. are the built-in pages. A page's `brand` is the tag of a sub-brand, null for the main brand; a brand page can have any slug except the home page \"\" and the built-in pages, which belong to the main brand. `style_settings` are the main brand's colours, fonts, spacing steps, page width, corners and headings; a sub-brand's are in the brands document. `css_files` are matched by brand and path and never removed; send the `version` you read and a file changed since is refused. These parts are refused with 422 while the company's `portal_styles` or `brands` switch is off."
    • removedInput schema / properties / documents / items / properties / format / example
      Removed value: -"jobmojito.portal-site"
    • removedInput schema / properties / documents / items / properties / kind / description
      Removed value: -"Portal configuration document type. `branding`: portal name, style, colours, logos, e-mail sender name, speech term boosting. `interview-portal`: interview portal languages and the per-language home texts. `coaching-portal`: coaching portal vertical (`use_case`), feature toggles, label overrides, coaching plan, catalogue start directory, languages and per-language home blocks. `brands`: `{ brands: [{ name, tag, slug, logo_url, logo_dark_url, icon_url, privacy_notice_url, style_settings, sort_order, status }] }`, the sub-brands. A brand is matched by `tag`, which never changes; the main brand is the company itself and has no entry. A new brand needs `name`; `slug` is optional, a short name kept for older links that decides no page address (two brands cannot share one). A brand left out stays as it is; `status: \"deleted\"` retires one, and null clears a field. Refused with 422 while the company's `brands` switch is off. A portal site document declares `format` instead."
    • removedInput schema / properties / documents / items / properties / kind / example
      Removed value: -"branding"
    • removedInput schema / properties / documents / items / properties / version / description
      Removed value: -"Document format version. Always 1."
    • removedInput schema / properties / documents / items / properties / version / example
      Removed value: -1
    • changedInput schema / properties / dry_run / description
      Previous value: -"Validate and report what would change (summary, warnings, changes) without writing anything. Use it to preview an import before applying it."New value: +"Validate and report what would change (summary, warnings, changes) without writing anything."
    • addedInput schema / properties / llm_model
      Added value: +{
      +  "description": "Your model id, e.g. \"claude-opus-4-8\"; \"unknown\" if unsure. For analytics.",
      +  "type": "string"
      +}
    • removedInput schema / properties / merchant_id / example
      Removed value: -"28106cba-1c27-4e53-b149-32113e5e8e31"
    • changedInput schema / properties / portal / description
      Previous value: -"Where portal-site pages and theme CSS go: `interview` (candidate-facing interview / careers portal) or `consumer` (coaching portal). Default: the portal-site document's own `portal`, else `interview`. A document made for the other portal is imported here with a warning."New value: +"Where portal-site pages and theme CSS go: `interview` (candidate-facing interview / careers portal) or `consumer` (coaching portal). Default: the portal-site document's own `portal`, else `interview`."
    • changedInput schema / properties / publish / description
      Previous value: -"Also publish the imported pages and theme CSS (live at once, as the admin's \"Publish after import\"). Default false: pages land as drafts the company reviews in the admin. Style settings and CSS files in the documents are built into a stylesheet per brand and published too, by the same build as portal-css-publish: the files a document names go live, the others stay as last published. Built-in page drafts produced by interview-portal / coaching-portal documents are never published. With page versions switched on, only a company owner or admin may publish."New value: +"Also publish the imported pages and theme CSS (live at once, as the admin's \"Publish after import\"). Default false: pages land as drafts the company reviews in the admin. Built-in page drafts produced by interview-portal / coaching-portal documents are never published. With page versions switched on, only a company owner or admin may publish."
    • removedOutput schema / properties / changes / description
      Removed value: -"What changed (for a dry run: what would change)."
    • removedOutput schema / properties / changes / properties / brands / description
      Removed value: -"Sub-brands in the documents and what happens to each. Present only when a brands document was sent."
    • removedOutput schema / properties / changes / properties / css_files / description
      Removed value: -"CSS files in the documents; `brand` null is the main brand. Present only when there are any."
    • removedOutput schema / properties / changes / properties / merchant_fields / description
      Removed value: -"Company settings that change: column names, with the key for the branding / feature jsonb and the language for home texts."
    • removedOutput schema / properties / changes / properties / merchant_fields / example
      Removed value: -[
      -  "homepage_name",
      -  "template_colors.c_primary",
      -  "interview_homepage_texts.de"
      -]
    • removedOutput schema / properties / changes / properties / page_changes / description
      Removed value: -"Every page touched, with its portal (built-in page drafts from a coaching-portal document go to the consumer portal)."
    • removedOutput schema / properties / changes / properties / page_changes / items / properties / action / description
      Removed value: -"What happens to the page."
    • removedOutput schema / properties / changes / properties / page_changes / items / properties / portal / description
      Removed value: -"Portal of the page."
    • removedOutput schema / properties / changes / properties / page_changes / items / properties / published / description
      Removed value: -"Whether this write publishes the page."
    • removedOutput schema / properties / changes / properties / page_changes / items / properties / slug / description
      Removed value: -"Page slug (\"\" is the home page)."
    • removedOutput schema / properties / changes / properties / pages_created / description
      Removed value: -"Slugs of pages created."
    • removedOutput schema / properties / changes / properties / pages_created / example
      Removed value: -[
      -  "our-history"
      -]
    • removedOutput schema / properties / changes / properties / pages_unchanged / description
      Removed value: -"Slugs of pages the documents carry that already hold the same content (not written)."
    • removedOutput schema / properties / changes / properties / pages_updated / description
      Removed value: -"Slugs of existing pages whose draft (or published version) changes."
    • removedOutput schema / properties / changes / properties / pages_updated / example
      Removed value: -[
      -  "about",
      -  "_support"
      -]
    • removedOutput schema / properties / changes / properties / portal / description
      Removed value: -"Portal the portal-site pages and theme CSS went to."
    • removedOutput schema / properties / changes / properties / published / description
      Removed value: -"Whether anything is published by this call."
    • removedOutput schema / properties / changes / properties / style_settings / description
      Removed value: -"True when the main brand's style settings change. Present only then."
    • removedOutput schema / properties / changes / properties / stylesheets_published / description
      Removed value: -"Stylesheets built and published by this call; `brand` null is the main brand. Present only when there are any."
    • removedOutput schema / properties / changes / properties / theme_css / description
      Removed value: -"Whether the theme CSS changes."
    • removedOutput schema / properties / documents / items / properties / index / description
      Removed value: -"Position of the document in the request."
    • removedOutput schema / properties / documents / items / properties / index / example
      Removed value: -0
    • removedOutput schema / properties / documents / items / properties / kind / description
      Removed value: -"How the document was read."
    • removedOutput schema / properties / documents / items / properties / summary / description
      Removed value: -"What the document sets, in the lines the admin dialog shows (\"+ /slug\" a new page, \"↻ /slug\" a replaced one)."
    • removedOutput schema / properties / documents / items / properties / summary / example
      Removed value: -[
      -  "3 colour(s)",
      -  "style \"minimal\"",
      -  "portal name"
      -]
    • removedOutput schema / properties / documents / items / properties / warnings / description
      Removed value: -"Parts that were ignored or adjusted. Warnings never block the import."
    • removedOutput schema / properties / dry_run / description
      Removed value: -"True when nothing was written."
    • removedOutput schema / properties / merchant_id / description
      Removed value: -"Merchant that was configured."
    • removedOutput schema / properties / merchant_id / example
      Removed value: -"28106cba-1c27-4e53-b149-32113e5e8e31"
  2. Changed2 schema fields changed
    • changedInput schema / properties / documents / items / properties / format / description
      Previous value: -"Portal site document type. `jobmojito.portal-site`: `{ portal, theme: { css }, style_settings, css_files: [{ path, brand, content, sort_order, version }], pages: [Page] }`, a whole site (pages in every language, the menu, the footer and the theme CSS). `jobmojito.portal-page`: `{ page: Page }`, one page. Page = `{ slug, brand, show_in_menu, sort_order, languages: [{ mojito_language_code, title, description, blocks }] }`; slug \"\" is the home page, \"_footer\", \"_support\", \"_jobs\" etc. are the built-in pages. A page's `brand` is the tag of a sub-brand, null for the main brand; its slug must sit under the brand's slug. `style_settings` are the main brand's colours, fonts, spacing steps, page width, corners and headings; a sub-brand's are in the brands document. `css_files` are matched by brand and path and never removed; send the `version` you read and a file changed since is refused. These parts are refused with 422 while the company's `portal_styles` or `brands` switch is off."New value: +"Portal site document type. `jobmojito.portal-site`: `{ portal, theme: { css }, style_settings, css_files: [{ path, brand, content, sort_order, version }], pages: [Page] }`, a whole site (pages in every language, the menu, the footer and the theme CSS). `jobmojito.portal-page`: `{ page: Page }`, one page. Page = `{ slug, brand, show_in_menu, sort_order, languages: [{ mojito_language_code, title, description, blocks }] }`; slug \"\" is the home page, \"_footer\", \"_support\", \"_jobs\" etc. are the built-in pages. A page's `brand` is the tag of a sub-brand, null for the main brand; a brand page can have any slug except the home page \"\" and the built-in pages, which belong to the main brand. `style_settings` are the main brand's colours, fonts, spacing steps, page width, corners and headings; a sub-brand's are in the brands document. `css_files` are matched by brand and path and never removed; send the `version` you read and a file changed since is refused. These parts are refused with 422 while the company's `portal_styles` or `brands` switch is off."
    • changedInput schema / properties / documents / items / properties / kind / description
      Previous value: -"Portal configuration document type. `branding`: portal name, style, colours, logos, e-mail sender name, speech term boosting. `interview-portal`: interview portal languages and the per-language home texts. `coaching-portal`: coaching portal vertical (`use_case`), feature toggles, label overrides, coaching plan, catalogue start directory, languages and per-language home blocks. `brands`: `{ brands: [{ name, tag, slug, logo_url, logo_dark_url, icon_url, privacy_notice_url, style_settings, sort_order, status }] }`, the sub-brands. A brand is matched by `tag`, which never changes; the main brand is the company itself and has no entry. A brand left out stays as it is; `status: \"deleted\"` retires one, and null clears a field. Refused with 422 while the company's `brands` switch is off. A portal site document declares `format` instead."New value: +"Portal configuration document type. `branding`: portal name, style, colours, logos, e-mail sender name, speech term boosting. `interview-portal`: interview portal languages and the per-language home texts. `coaching-portal`: coaching portal vertical (`use_case`), feature toggles, label overrides, coaching plan, catalogue start directory, languages and per-language home blocks. `brands`: `{ brands: [{ name, tag, slug, logo_url, logo_dark_url, icon_url, privacy_notice_url, style_settings, sort_order, status }] }`, the sub-brands. A brand is matched by `tag`, which never changes; the main brand is the company itself and has no entry. A new brand needs `name`; `slug` is optional, a short name kept for older links that decides no page address (two brands cannot share one). A brand left out stays as it is; `status: \"deleted\"` retires one, and null clears a field. Refused with 422 while the company's `brands` switch is off. A portal site document declares `format` instead."
  3. Changed11 schema fields changed
    • changedInput schema / properties / documents / items / description
      Previous value: -"One configuration document: declares either `kind` (branding, interview-portal, coaching-portal) or `format` (jobmojito.portal-site, jobmojito.portal-page), plus that type's fields. Field reference: branding https://developer.jobmojito.com/cookbooks/portal-branding/branding, interview portal https://developer.jobmojito.com/cookbooks/portal-branding/interview-portal, coaching portal https://developer.jobmojito.com/cookbooks/portal-branding/coaching-portal, portal pages https://developer.jobmojito.com/cookbooks/portal-branding/portal-pages. Unknown fields are ignored with a warning; wrong types and enum values are errors."New value: +"One configuration document: declares either `kind` (branding, interview-portal, coaching-portal, brands) or `format` (jobmojito.portal-site, jobmojito.portal-page), plus that type's fields. Field reference: branding https://developer.jobmojito.com/cookbooks/portal-branding/branding, interview portal https://developer.jobmojito.com/cookbooks/portal-branding/interview-portal, coaching portal https://developer.jobmojito.com/cookbooks/portal-branding/coaching-portal, portal pages https://developer.jobmojito.com/cookbooks/portal-branding/portal-pages. Unknown fields are ignored with a warning; wrong types and enum values are errors."
    • changedInput schema / properties / documents / items / properties / format / description
      Previous value: -"Portal site document type. `jobmojito.portal-site`: `{ portal, theme: { css }, pages: [Page] }`, a whole site (pages in every language, the menu, the footer and the theme CSS). `jobmojito.portal-page`: `{ page: Page }`, one page. Page = `{ slug, show_in_menu, sort_order, languages: [{ mojito_language_code, title, description, blocks }] }`; slug \"\" is the home page, \"_footer\", \"_support\", \"_jobs\" etc. are the built-in pages."New value: +"Portal site document type. `jobmojito.portal-site`: `{ portal, theme: { css }, style_settings, css_files: [{ path, brand, content, sort_order, version }], pages: [Page] }`, a whole site (pages in every language, the menu, the footer and the theme CSS). `jobmojito.portal-page`: `{ page: Page }`, one page. Page = `{ slug, brand, show_in_menu, sort_order, languages: [{ mojito_language_code, title, description, blocks }] }`; slug \"\" is the home page, \"_footer\", \"_support\", \"_jobs\" etc. are the built-in pages. A page's `brand` is the tag of a sub-brand, null for the main brand; its slug must sit under the brand's slug. `style_settings` are the main brand's colours, fonts, spacing steps, page width, corners and headings; a sub-brand's are in the brands document. `css_files` are matched by brand and path and never removed; send the `version` you read and a file changed since is refused. These parts are refused with 422 while the company's `portal_styles` or `brands` switch is off."
    • changedInput schema / properties / documents / items / properties / kind / description
      Previous value: -"Portal configuration document type. `branding`: portal name, style, colours, logos, e-mail sender name, speech term boosting. `interview-portal`: interview portal languages and the per-language home texts. `coaching-portal`: coaching portal vertical (`use_case`), feature toggles, label overrides, coaching plan, catalogue start directory, languages and per-language home blocks. A portal site document declares `format` instead."New value: +"Portal configuration document type. `branding`: portal name, style, colours, logos, e-mail sender name, speech term boosting. `interview-portal`: interview portal languages and the per-language home texts. `coaching-portal`: coaching portal vertical (`use_case`), feature toggles, label overrides, coaching plan, catalogue start directory, languages and per-language home blocks. `brands`: `{ brands: [{ name, tag, slug, logo_url, logo_dark_url, icon_url, privacy_notice_url, style_settings, sort_order, status }] }`, the sub-brands. A brand is matched by `tag`, which never changes; the main brand is the company itself and has no entry. A brand left out stays as it is; `status: \"deleted\"` retires one, and null clears a field. Refused with 422 while the company's `brands` switch is off. A portal site document declares `format` instead."
    • changedInput schema / properties / documents / items / properties / kind / enum
      Previous value: -[
      -  "branding",
      -  "interview-portal",
      -  "coaching-portal"
      -]New value: +[
      +  "branding",
      +  "interview-portal",
      +  "coaching-portal",
      +  "brands"
      +]
    • changedInput schema / properties / kind / enum
      Previous value: -[
      -  "branding",
      -  "interview-portal",
      -  "coaching-portal",
      -  "portal-site"
      -]New value: +[
      +  "branding",
      +  "interview-portal",
      +  "coaching-portal",
      +  "brands",
      +  "portal-site"
      +]
    • changedInput schema / properties / publish / description
      Previous value: -"Also publish the imported pages and theme CSS (live at once, as the admin's \"Publish after import\"). Default false: pages land as drafts the company reviews in the admin. Built-in page drafts produced by interview-portal / coaching-portal documents are never published. With page versions switched on, only a company owner or admin may publish."New value: +"Also publish the imported pages and theme CSS (live at once, as the admin's \"Publish after import\"). Default false: pages land as drafts the company reviews in the admin. Style settings and CSS files in the documents are built into a stylesheet per brand and published too, by the same build as portal-css-publish: the files a document names go live, the others stay as last published. Built-in page drafts produced by interview-portal / coaching-portal documents are never published. With page versions switched on, only a company owner or admin may publish."
    • addedOutput schema / properties / changes / properties / brands
      Added value: +{
      +  "description": "Sub-brands in the documents and what happens to each. Present only when a brands document was sent.",
      +  "items": {
      +    "properties": {
      +      "action": {
      +        "enum": [
      +          "create",
      +          "update",
      +          "delete",
      +          "unchanged",
      +          null
      +        ],
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "tag": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      }
      +    },
      +    "required": [
      +      "tag",
      +      "action"
      +    ],
      +    "type": "object"
      +  },
      +  "type": [
      +    "array",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / changes / properties / css_files
      Added value: +{
      +  "description": "CSS files in the documents; `brand` null is the main brand. Present only when there are any.",
      +  "items": {
      +    "properties": {
      +      "action": {
      +        "enum": [
      +          "create",
      +          "update",
      +          "unchanged",
      +          null
      +        ],
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "brand": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "path": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      }
      +    },
      +    "required": [
      +      "brand",
      +      "path",
      +      "action"
      +    ],
      +    "type": "object"
      +  },
      +  "type": [
      +    "array",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / changes / properties / style_settings
      Added value: +{
      +  "description": "True when the main brand's style settings change. Present only then.",
      +  "type": [
      +    "boolean",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / changes / properties / stylesheets_published
      Added value: +{
      +  "description": "Stylesheets built and published by this call; `brand` null is the main brand. Present only when there are any.",
      +  "items": {
      +    "properties": {
      +      "brand": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "portal": {
      +        "enum": [
      +          "interview",
      +          "consumer",
      +          null
      +        ],
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      }
      +    },
      +    "required": [
      +      "portal",
      +      "brand"
      +    ],
      +    "type": "object"
      +  },
      +  "type": [
      +    "array",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / documents / items / properties / kind / enum
      Previous value: -[
      -  "branding",
      -  "interview-portal",
      -  "coaching-portal",
      -  "portal-site",
      -  null
      -]New value: +[
      +  "branding",
      +  "interview-portal",
      +  "coaching-portal",
      +  "brands",
      +  "portal-site",
      +  null
      +]
  4. Changed13 schema fields changed
    • changedInput schema / properties / conversation_id / description
      Previous value: -"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."New value: +"The conversation_id this server returned earlier in this conversation, unchanged, including after later user messages. Omit it if you have none. Recorded for the server developer's analytics."
    • changedInput schema / properties / documents / items / properties / format / enum
      Previous value: -[
      -  "jobmojito.portal-site",
      -  "jobmojito.portal-page",
      -  null
      -]New value: +[
      +  "jobmojito.portal-site",
      +  "jobmojito.portal-page"
      +]
    • changedInput schema / properties / documents / items / properties / format / type
      Previous value: -[
      -  "string",
      -  "null"
      -]New value: +"string"
    • changedInput schema / properties / documents / items / properties / kind / enum
      Previous value: -[
      -  "branding",
      -  "interview-portal",
      -  "coaching-portal",
      -  null
      -]New value: +[
      +  "branding",
      +  "interview-portal",
      +  "coaching-portal"
      +]
    • changedInput schema / properties / documents / items / properties / kind / type
      Previous value: -[
      -  "string",
      -  "null"
      -]New value: +"string"
    • changedInput schema / properties / documents / type
      Previous value: -[
      -  "array",
      -  "null"
      -]New value: +"array"
    • changedInput schema / properties / dry_run / type
      Previous value: -[
      -  "boolean",
      -  "null"
      -]New value: +"boolean"
    • changedInput schema / properties / kind / enum
      Previous value: -[
      -  "branding",
      -  "interview-portal",
      -  "coaching-portal",
      -  "portal-site",
      -  null
      -]New value: +[
      +  "branding",
      +  "interview-portal",
      +  "coaching-portal",
      +  "portal-site"
      +]
    • changedInput schema / properties / kind / type
      Previous value: -[
      -  "string",
      -  "null"
      -]New value: +"string"
    • changedInput schema / properties / merchant_id / type
      Previous value: -[
      -  "string",
      -  "null"
      -]New value: +"string"
    • changedInput schema / properties / portal / enum
      Previous value: -[
      -  "interview",
      -  "consumer",
      -  null
      -]New value: +[
      +  "interview",
      +  "consumer"
      +]
    • changedInput schema / properties / portal / type
      Previous value: -[
      -  "string",
      -  "null"
      -]New value: +"string"
    • changedInput schema / properties / publish / type
      Previous value: -[
      -  "boolean",
      -  "null"
      -]New value: +"boolean"
  5. Added

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the annotations it discloses a lot of non-obvious behavior: all-or-nothing validation with a 422 listing every error, nothing written on failure, pages landing as drafts vs. `publish` going live, per-company feature gating that refuses brands/style settings/CSS files, a version-mismatch refusal on CSS files, and owner/admin-only publishing. It is consistent with destructiveHint=true and idempotentHint=false (imports write and later documents win).

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?

It is front-loaded with the core purpose and each sentence carries a behavioral fact, but it is a long dense block with many clauses; a short bulleted structure for the flag semantics would read more cleanly. The closing pointer to `get_tool_reference` for full argument examples is a sensible, non-wasteful addition.

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 destructive, feature-gated write tool with eight parameters, it covers inputs, validation failure modes, merge behavior, draft/publish outcomes, permission requirements, and the version-conflict guard. An output schema exists, so it does not need to explain return values, and it explicitly defers full argument detail to `get_tool_reference`, which is a reasonable completeness strategy.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents every parameter in depth. The description mostly restates that ground (same merge semantics, same dry_run/publish meaning) and adds only token cross-parameter behavior such as `publish` also building brand stylesheets, so it lands at the baseline rather than adding substantial new meaning.

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?

The description names a specific verb and resource ('Import portal configuration documents') and ties that resource back to what `get_portal_configuration` returns, making the read/write split between the two siblings immediately clear. A dense list of the document types (branding, interview portal, coaching portal, brands, portal sites) leaves no ambiguity about scope.

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

Usage Guidelines4/5

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

It gives concrete use-case context: `dry_run: true` previews, `publish: true` goes live, drafts otherwise, and the per-company feature gates that cause 422s. It does not explicitly say 'use this instead of X' for scenarios like reading current config (that routing to `get_portal_configuration` is only implied), so it stops short of a 5.

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.