Skip to main content
Glama

Create or update a coaching catalogue directory

save_catalogue_directory
Destructive

[Coaching catalogue] With action create (the default): create a directory (page) in the coaching portal catalogue. A directory nests other directories (tags_sub), lists coaching sessions whose own tags match its tags_interview_set_filter, and can carry a fully custom Markdown page (content_md) with [sessions], [directory:…], [session:…] and [plan-progress] directives; the top-level fields are the default language, translations adds the others. With action update and id: rename it, change which sessions it lists, re-order its sub-directories, author its page, or add, replace or remove a language version (translations, per language; null removes one). On update only the fields you send change; a top-level null counts as not sent, except content_md: null, the only way to remove the custom page and restore the default grid. Coaching-platform feature. public visibility is for platform admins only.

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": {
      "id": "<id>"
    },
    "name": "save_catalogue_directory"
  }
}

Input Schema

NameRequiredDescriptionDefault
idYesDirectory id — also the catalogue URL segment (/catalogue/<id>) and the value other directories reference in their `tags_sub`.
nameNoDisplay name of the directory, shown as the page title and on its card. Required to create.
actionNo`create` (default) a new directory with this id. `update` changes the existing directory `id` instead: only the fields you send change (a top-level null argument counts as not sent, except on content_md; in `translations` a language sent as null is removed); `parent_tag` and `merchant_id` are not taken.
statusNoLifecycle status of the catalogue directory. Values: `draft`: the directory exists but is not served to visitors | `active`: Published and served in the catalogue | `archived`: kept for reference but no longer served.
tags_subNoIds of the directories nested under this one, in display order. Replaces the whole list — send the full set, not just the additions. A referenced directory only appears if it exists and is visible to the viewer.
llm_modelNoYour model id, e.g. "claude-opus-4-8"; "unknown" if unsure. For analytics.
coach_planNoCoaching-plan stage this item belongs to, used by the coaching-plan progress view. Omit to leave it out of any plan, or on update to keep the current stage. A null is ignored: use `other` when no stage fits. Values: `demo`: Demo session | `screening`: Screening-interview practice | `2nd`: Second-interview practice | `3rd`: Third-interview practice | `closing`: Closing / salary-negotiation practice | `job-specific`: Job-specific coaching | `other`: Anything that does not fit the other buckets.
content_mdNoMarkdown for a custom directory page. When set (even as an empty string) the markdown replaces the default grid and decides the layout itself. Sending null removes the custom page and renders the plain grid of sub-directories and sessions.
parent_tagNoId of an existing directory to nest this new one under: the new id is appended to that directory's `tags_sub`. Omit to create a top-level directory (reachable via a direct link, or by adding it to another directory later).
visibilityNoWho can see the catalogue directory. Values: `public`: Shared across every merchant | `merchant_public`: Listed in the merchant's own catalogue — the normal choice | `merchant_invite`: Reachable only for invited users | `merchant_unlisted`: Reachable only via a direct link.
descriptionNoShort description shown on the directory card.
merchant_idNoMerchant that owns the directory. Admin / sub-merchant callers only; otherwise taken from your token.
translationsNoOther language versions of the directory, keyed by mojito language code. The top-level fields are the default language (`mojito_language_code`); each version is a page of its own (name, Markdown, session filter, sub-directories) shown to learners who pick that language. With action update only the languages you send change, and a language sent as null is removed; to remove every version, send null for each language.
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.
cover_image_urlNoCover image URL for the directory card. An empty string clears it.
mojito_language_codeNoLanguage of the directory (one of the listed codes). The catalogue groups directories by language; defaults to `en` when omitted.
tags_interview_set_filterNoTag filter selecting which coaching sessions this directory lists: a session appears when its own `tags` contain EVERY tag here (an AND, not an OR). Only `active` coaching/persona sessions with visibility `public` or `merchant_public` are listed.

Output Schema

NameRequiredDescriptionDefault
idYes
parent_tagYes
merchant_idYes
catalogue_urlYes
updated_fieldsNo
_mcp_instructionsNoServer-issued metadata for this conversation.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / visibility / description
      Previous value: -"Who can see the catalogue directory. Values: `public`: Shared across every merchant | `merchant_public`: Listed in the merchant's own catalogue — the normal choice | `merchant_invite`: Owned by the merchant but not listed | `merchant_unlisted`: Owned by the merchant but not listed."New value: +"Who can see the catalogue directory. Values: `public`: Shared across every merchant | `merchant_public`: Listed in the merchant's own catalogue — the normal choice | `merchant_invite`: Reachable only for invited users | `merchant_unlisted`: Reachable only via a direct link."
  2. Changed4 schema fields changed
    • changedInput schema / properties / action / description
      Previous value: -"`create` (default) a new directory with this id. `update` the existing directory `id` instead, exactly as catalogue-tag-update: only the fields you send change (a top-level null argument counts as not sent, except on content_md; in `translations` a language sent as null is removed); `parent_tag` and `merchant_id` are not taken."New value: +"`create` (default) a new directory with this id. `update` changes the existing directory `id` instead: only the fields you send change (a top-level null argument counts as not sent, except on content_md; in `translations` a language sent as null is removed); `parent_tag` and `merchant_id` are not taken."
    • changedInput schema / properties / coach_plan / description
      Previous value: -"Coaching-plan stage this item belongs to, used by the coaching-plan progress view. Omit to leave it out of any plan, or on update to keep the current stage. A null is ignored: use `other` when no stage fits."New value: +"Coaching-plan stage this item belongs to, used by the coaching-plan progress view. Omit to leave it out of any plan, or on update to keep the current stage. A null is ignored: use `other` when no stage fits. Values: `demo`: Demo session | `screening`: Screening-interview practice | `2nd`: Second-interview practice | `3rd`: Third-interview practice | `closing`: Closing / salary-negotiation practice | `job-specific`: Job-specific coaching | `other`: Anything that does not fit the other buckets."
    • changedInput schema / properties / status / description
      Previous value: -"Lifecycle status of the catalogue directory."New value: +"Lifecycle status of the catalogue directory. Values: `draft`: the directory exists but is not served to visitors | `active`: Published and served in the catalogue | `archived`: kept for reference but no longer served."
    • changedInput schema / properties / visibility / description
      Previous value: -"Who can see the catalogue directory."New value: +"Who can see the catalogue directory. Values: `public`: Shared across every merchant | `merchant_public`: Listed in the merchant's own catalogue — the normal choice | `merchant_invite`: Owned by the merchant but not listed | `merchant_unlisted`: Owned by the merchant but not listed."
  3. Changed1 schema field changed
    • changedInput schema / properties / mojito_language_code / description
      Previous value: -"Language of the directory (one of the platform-languages.json codes). The catalogue groups directories by language; defaults to `en` when omitted."New value: +"Language of the directory (one of the listed codes). The catalogue groups directories by language; defaults to `en` when omitted."
  4. Changed41 schema fields changed
    • removedInput schema / properties / action / example
      Removed value: -"create"
    • changedInput schema / properties / coach_plan / description
      Previous value: -"Coaching-plan stage this item belongs to, used by the coaching-plan progress view. Omit to leave it out of any plan, or on update to keep the current stage. A null is ignored: use `other` when no stage fits. Options — `demo`: Demo session. | `screening`: Screening-interview practice. | `2nd`: Second-interview practice. | `3rd`: Third-interview practice. | `closing`: Closing / salary-negotiation practice. | `job-specific`: Job-specific coaching. | `other`: Anything that does not fit the other buckets.."New value: +"Coaching-plan stage this item belongs to, used by the coaching-plan progress view. Omit to leave it out of any plan, or on update to keep the current stage. A null is ignored: use `other` when no stage fits."
    • removedInput schema / properties / coach_plan / example
      Removed value: -"screening"
    • changedInput schema / properties / content_md / description
      Previous value: -"Markdown for a custom directory page. When set (even as an empty string) the markdown replaces the default grid and decides the layout itself. Sending null removes the custom page and renders the plain grid of sub-directories and sessions. Alongside normal Markdown you can place these directives, each ALONE on its own line: `[plan-progress]` (the learner's coaching-plan progress), `[directory:<tag-id>]` (a card for one sub-directory), `[session:<interview-id>]` (a card for one session), `[sessions]` (every session in this directory), `[sessions:<term>]` (sessions matching a term), `[sessions:filter=<term>,limit=<n>]` (a filtered, capped list). A directive on a line with other text is rendered as ordinary text. Chips, callouts, cards, columns and buttons are available here too — full vocabulary: https://developer.jobmojito.com/cookbooks/format-content-with-markdown"New value: +"Markdown for a custom directory page. When set (even as an empty string) the markdown replaces the default grid and decides the layout itself. Sending null removes the custom page and renders the plain grid of sub-directories and sessions."
    • removedInput schema / properties / content_md / example
      Removed value: -"## Sales coaching\n\nPick a session to practise with.\n\n[chip:6 sessions] [chip:Beginner,tone=accent]\n\n[sessions:filter=objection-handling,limit=6]\n"
    • removedInput schema / properties / description / example
      Removed value: -"Practice discovery, objection handling and closing."
    • changedInput schema / properties / id / description
      Previous value: -"Directory id — also the catalogue URL segment (/catalogue/<id>) and the value other directories reference in their `tags_sub`. Lowercase letters, digits and single - or _ separators. Convention is to end language-specific directories with the language code, e.g. `sales-coaching-en`."New value: +"Directory id — also the catalogue URL segment (/catalogue/<id>) and the value other directories reference in their `tags_sub`."
    • removedInput schema / properties / id / example
      Removed value: -"sales-coaching-en"
    • 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"
    • removedInput schema / properties / mojito_language_code / example
      Removed value: -"en"
    • removedInput schema / properties / name / example
      Removed value: -"Sales coaching"
    • removedInput schema / properties / parent_tag / example
      Removed value: -"home-employee-en"
    • changedInput schema / properties / status / description
      Previous value: -"Lifecycle status of the catalogue directory. Options — `draft`: Not published — the directory exists but is not served to visitors. | `active`: Published and served in the catalogue. | `archived`: Retired — kept for reference but no longer served.."New value: +"Lifecycle status of the catalogue directory."
    • removedInput schema / properties / status / example
      Removed value: -"active"
    • changedInput schema / properties / tags_interview_set_filter / description
      Previous value: -"Tag filter selecting which coaching sessions this directory lists: a session appears when its own `tags` contain EVERY tag here (an AND, not an OR). Only `active` coaching/persona sessions with visibility `public` or `merchant_public` are listed. Set the matching tags on the session with the create-interview / job-interview-update `tags` field."New value: +"Tag filter selecting which coaching sessions this directory lists: a session appears when its own `tags` contain EVERY tag here (an AND, not an OR). Only `active` coaching/persona sessions with visibility `public` or `merchant_public` are listed."
    • removedInput schema / properties / tags_interview_set_filter / example
      Removed value: -[
      -  "sales",
      -  "objection-handling"
      -]
    • removedInput schema / properties / tags_sub / example
      Removed value: -[
      -  "sales-coaching-objections-en",
      -  "sales-coaching-closing-en"
      -]
    • removedInput schema / properties / translations / additionalProperties / properties / content_md / description
      Removed value: -"Markdown for a custom directory page. When set (even as an empty string) the markdown replaces the default grid and decides the layout itself; null renders the plain grid of sub-directories and sessions. Alongside normal Markdown you can place these directives, each ALONE on its own line: `[plan-progress]` (the learner's coaching-plan progress), `[directory:<tag-id>]` (a card for one sub-directory), `[session:<interview-id>]` (a card for one session), `[sessions]` (every session in this directory), `[sessions:<term>]` (sessions matching a term), `[sessions:filter=<term>,limit=<n>]` (a filtered, capped list). A directive on a line with other text is rendered as ordinary text. Chips, callouts, cards, columns and buttons are available here too — full vocabulary: https://developer.jobmojito.com/cookbooks/format-content-with-markdown"
    • removedInput schema / properties / translations / additionalProperties / properties / content_md / example
      Removed value: -"## Sales coaching\n\nPick a session to practise with.\n\n[chip:6 sessions] [chip:Beginner,tone=accent]\n\n[sessions:filter=objection-handling,limit=6]\n"
    • removedInput schema / properties / translations / additionalProperties / properties / cover_image_url / description
      Removed value: -"Cover image for this language. Omit to show the default language's cover."
    • removedInput schema / properties / translations / additionalProperties / properties / description / description
      Removed value: -"Card description in this language."
    • removedInput schema / properties / translations / additionalProperties / properties / name / description
      Removed value: -"Page title and card name in this language."
    • removedInput schema / properties / translations / additionalProperties / properties / name / example
      Removed value: -"Obchodný koučing"
    • removedInput schema / properties / translations / additionalProperties / properties / tags_interview_set_filter / description
      Removed value: -"Tag filter selecting which coaching sessions this directory lists: a session appears when its own `tags` contain EVERY tag here (an AND, not an OR). Only `active` coaching/persona sessions with visibility `public` or `merchant_public` are listed. Set the matching tags on the session with the create-interview / job-interview-update `tags` field."
    • removedInput schema / properties / translations / additionalProperties / properties / tags_interview_set_filter / example
      Removed value: -[
      -  "sales",
      -  "objection-handling"
      -]
    • removedInput schema / properties / translations / additionalProperties / properties / tags_sub / description
      Removed value: -"Ids of the directories nested under this one, in display order. Replaces the whole list — send the full set, not just the additions. A referenced directory only appears if it exists and is visible to the viewer."
    • removedInput schema / properties / translations / additionalProperties / properties / tags_sub / example
      Removed value: -[
      -  "sales-coaching-objections-en",
      -  "sales-coaching-closing-en"
      -]
    • changedInput schema / properties / translations / description
      Previous value: -"Other language versions of the directory, keyed by mojito language code. The top-level fields are the default language (`mojito_language_code`); each version is a page of its own (name, Markdown, session filter, sub-directories) shown to learners who pick that language. A key may not equal `mojito_language_code`. With action update only the languages you send change, and a language sent as null is removed; to remove every version, send null for each language."New value: +"Other language versions of the directory, keyed by mojito language code. The top-level fields are the default language (`mojito_language_code`); each version is a page of its own (name, Markdown, session filter, sub-directories) shown to learners who pick that language. With action update only the languages you send change, and a language sent as null is removed; to remove every version, send null for each language."
    • removedInput schema / properties / translations / example
      Removed value: -{
      -  "sk": {
      -    "name": "Obchodný koučing",
      -    "tags_interview_set_filter": [
      -      "sales-sk"
      -    ]
      -  }
      -}
    • changedInput schema / properties / visibility / description
      Previous value: -"Who can see the catalogue directory. Options — `public`: Shared across every merchant. Platform admins only — a merchant caller is rejected by row-level security. | `merchant_public`: Listed in the merchant's own catalogue — the normal choice. | `merchant_invite`: Owned by the merchant but not listed; reachable only for invited users. | `merchant_unlisted`: Owned by the merchant but not listed; reachable only via a direct link.."New value: +"Who can see the catalogue directory."
    • removedInput schema / properties / visibility / example
      Removed value: -"merchant_public"
    • removedOutput schema / description
      Removed value: -"The created catalogue directory."
    • removedOutput schema / properties / catalogue_url / description
      Removed value: -"Public URL of the directory page, when the merchant has a coaching-portal domain configured. Null otherwise."
    • removedOutput schema / properties / catalogue_url / example
      Removed value: -"https://coaching.example.com/catalogue/sales-coaching-en"
    • removedOutput schema / properties / id / description
      Removed value: -"Id of the created (or, with action update, updated) directory."
    • removedOutput schema / properties / id / example
      Removed value: -"sales-coaching-en"
    • removedOutput schema / properties / merchant_id / description
      Removed value: -"Owning merchant id. Null for a platform-wide (`public`) directory."
    • removedOutput schema / properties / parent_tag / description
      Removed value: -"The directory this one was nested under, when `parent_tag` was supplied. Always null for an update."
    • removedOutput schema / properties / updated_fields / description
      Removed value: -"Action update only: the fields that were written."
    • removedOutput schema / properties / updated_fields / example
      Removed value: -[
      -  "content_md"
      -]
  5. Added

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the annotations it discloses the destructive edge cases that matter most: tags_sub replaces the whole list rather than appending, content_md: null is the only way to drop a custom page, a null language inside translations removes that version, and a top-level null otherwise counts as 'not sent'. It also flags the authorization boundary ('public visibility is for platform admins only') and the session-filtering rule (AND across tags, only active public/merchant_public sessions).

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 dense but front-loaded, leading with create behavior then update behavior before the caveats, and every clause carries operational weight. Some of the null/removal rules are restated from the schema, which slightly inflates length for a single-paragraph description.

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 17-parameter mutation tool with an output schema, the description covers the mode split, the destructive semantics, the visibility/authorization note, and points to get_tool_reference for full argument examples. Nothing needed to call it correctly appears to be missing.

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 per-parameter descriptions already carry most meaning and the baseline is 3. The description still adds cross-parameter semantics the schema cannot show: top-level fields are the default language while translations holds the others, and the update-mode null/removal rules layered onto several fields at once.

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 opens with a specific verb+resource pairing ('create a directory (page) in the coaching portal catalogue') and explicitly separates the two modes (action create vs action update with id). It is clearly distinguishable from siblings like get_catalogue_directory and list_catalogue_directories, which read rather than write.

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 states when to use create (default, new directory with this id) versus update (change existing directory id, partial-field semantics), and notes that parent_tag/merchant_id are not accepted on update. It stops short of naming the read-side alternatives for looking up an existing directory, so it is clear but not fully routing.

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.