Skip to main content
Glama

kelpo_apply_operations

Apply one conversational turn atomically with the same operations and validations as the Kelpo studio: classify uploads (shared photos with per-photo positions), edit the scene, answer preparation steps, choose actors/outfits/voice, ask the user with a picker, etc. All operations succeed together or none is saved; read receipts (status rejected + code/message explains why). The exchange (message, attachments, your response) is recorded by this call. Retry with the identical request_id/body after a timeout. Never generates or charges: generation stays an explicit user approval (quote + generate). Arguments: {"path": {"id": ""}, "body": {"version": 3, "message": "<the person's exact words of this turn>", "operations": [{"op": "edit_scene", "args": {"fields": ["tone"], "values": {"tone": "posé"}}}]}}

Input Schema

NameRequiredDescriptionDefault
bodyYes
pathYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed6 schema fields changed
    • addedInput schema / $defs / EditPanel
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "at_words": {
      +      "description": "Spoken words on which the panel opens (copied exactly, no figures).",
      +      "title": "At Words",
      +      "type": "string"
      +    },
      +    "lines": {
      +      "description": "1 to 6 short lines, in the order they are said.",
      +      "items": {
      +        "$ref": "#/$defs/EditPanelLine"
      +      },
      +      "title": "Lines",
      +      "type": "array"
      +    },
      +    "scale": {
      +      "default": 1,
      +      "description": "Zoom while the face slides aside, 1-1.3 (1 = no zoom, sharpest; default).",
      +      "title": "Scale",
      +      "type": "number"
      +    },
      +    "side": {
      +      "default": "auto",
      +      "description": "Side of the text; the face slides to the other side. auto (default) = close panels share ONE slide (the face moves once) and the side alternates from one slide to the next.",
      +      "enum": [
      +        "auto",
      +        "left",
      +        "right"
      +      ],
      +      "title": "Side",
      +      "type": "string"
      +    },
      +    "title": {
      +      "default": "",
      +      "description": "Yellow title of the panel (max 48), e.g. \"La niche réunionnaise\".",
      +      "title": "Title",
      +      "type": "string"
      +    },
      +    "until_words": {
      +      "default": "",
      +      "description": "Optional spoken words after which it closes. Empty = until the next panel, long enough to read.",
      +      "title": "Until Words",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "at_words"
      +  ],
      +  "title": "EditPanel",
      +  "type": "object"
      +}
    • addedInput schema / $defs / EditPanelLine
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "at_words": {
      +      "default": "",
      +      "description": "Spoken words on which this line appears, copied exactly as said; avoid words written in figures by the voice recognizer (numbers): take the words just before. Empty = spread over the panel.",
      +      "title": "At Words",
      +      "type": "string"
      +    },
      +    "text": {
      +      "description": "Short line written on screen (max 80), *word* = yellow accent, e.g. \"Abattement de *50 %* sur les bénéfices\".",
      +      "title": "Text",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "text"
      +  ],
      +  "title": "EditPanelLine",
      +  "type": "object"
      +}
    • addedInput schema / $defs / EditingLaterArgs / properties / panels
      Added value: +{
      +  "description": "« Cours » panels for an explainer / YouTube lesson (face to one side, darkened side, yellow title, lines written on their words); max 8.",
      +  "items": {
      +    "$ref": "#/$defs/EditPanel"
      +  },
      +  "title": "Panels",
      +  "type": "array"
      +}
    • addedInput schema / $defs / EditingPlanArgs / properties / panels
      Added value: +{
      +  "description": "With set_panels: « cours » panels (max 8), for an explainer / YouTube lesson, ONLY on the key facts the viewer must remember (figures, rates, legal conditions, deadlines, eligibility, concrete steps), never on arguments, opinions or the call to action (face only): the face slides to one side, the other side darkens, a yellow title then short lines appear one by one on their spoken words. Subtitles, hooks and zooms are not shown during a panel. Leave face-only moments between panels.",
      +  "items": {
      +    "$ref": "#/$defs/EditPanel"
      +  },
      +  "title": "Panels",
      +  "type": "array"
      +}
    • addedInput schema / $defs / EditingPlanArgs / properties / set_panels
      Added value: +{
      +  "default": false,
      +  "description": "True = replace the « cours » panels by `panels` ([] removes them).",
      +  "title": "Set Panels",
      +  "type": "boolean"
      +}
    • changedInput schema / $defs / Op_plan_video / properties / op / description
      Previous value: -"API/MCP only. ONE quote for the whole video = every shot (1 to 6) + Kelpo's montage (flat fee): for a video with several\nshots (the montage is always included, never ask whether they want it), or for a single shot only when the person asked\nfor a montage. Call it last, after the scene is prepared (finish_review first when needed). Nothing is generated or\ncharged here. The receipt data.shoot lists each shot (title, duration, credits), montage_credits and the total `credits`;\nits english_directions_needed lists, per shot, the texts to write SILENTLY in English for the accept call (never shown to\nthe person). Show every line and the total in the person's language, get their explicit yes, and call kelpo_accept_shoot\nONCE (max_credits = total, english per shot). The delivery is the final edited video (kelpo_get_shoot montage_job_id). A\nsingle shot without a requested montage never uses this: kelpo_quote_scene then kelpo_generate."New value: +"API/MCP only. ONE quote for the whole video = every shot (1 to 6) + Kelpo's montage (see montage_credits in the receipt): for a video with several\nshots (the montage is always included, never ask whether they want it), or for a single shot only when the person asked\nfor a montage. Call it last, after the scene is prepared (finish_review first when needed). Nothing is generated or\ncharged here. The receipt data.shoot lists each shot (title, duration, credits), montage_credits and the total `credits`;\nits english_directions_needed lists, per shot, the texts to write SILENTLY in English for the accept call (never shown to\nthe person). Show every line and the total in the person's language, get their explicit yes, and call kelpo_accept_shoot\nONCE (max_credits = total, english per shot). The delivery is the final edited video (kelpo_get_shoot montage_job_id). A\nsingle shot without a requested montage never uses this: kelpo_quote_scene then kelpo_generate."
  2. First observed

TDQS

A3.8/5.0
Behavior4/5

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

Annotations only say it writes, is not idempotent and is not destructive; the description adds substantive behavior: all-or-nothing atomicity, a `receipts` structure with rejected status plus code/message for diagnosis, the fact that the message/attachments/response exchange is persisted, and safe retry via identical request_id/body after a timeout. That is well beyond annotation coverage. It stops short of describing latency, ordering constraints among operations, or what a partial rejection means for the rest of the plan.

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 the core verb and atomicity guarantee, then behavior, then a payload example — a sensible order with no filler sentences. The parenthetical op enumeration is dense and the trailing JSON blob partly repeats schema structure, but for a 39-way op union the example earns its space.

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?

Given a 2-parameter tool whose body is a discriminated union of 39 operations and no output schema, the description covers purpose, atomicity, failure handling via receipts, and non-charging. The per-op detail lives in the nested schema descriptions, which is appropriate. Missing: no pointer to kelpo_operations_catalog for the op vocabulary, and no explanation of version conflicts.

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?

Top-level schema coverage is 0% (path.id is undocumented), but the description compensates with a concrete payload example that reveals the nested shape: path.id, body.version, body.message as the person's exact words, and an operations array with op/args pairs. That is meaningfully more than the schema alone conveys at the top level. It still leaves `version` semantics, `response` and `attachments` unexplained, so compensation is partial.

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

Purpose4/5

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

Specific verb + resource: "Apply one conversational turn atomically", followed by an enumeration of the operation families it carries (classify uploads, edit scene, preparation answers, actors/outfits/voice, ask_user). It also draws a line against generation ("generation stays an explicit user approval (quote + generate)"), so the agent can tell it is not the generate tool. It never contrasts itself with siblings that duplicate the same operations (e.g. kelpo_answer_offer, kelpo_set_ai_label), so differentiation is partial rather than complete.

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

Usage Guidelines3/5

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

Usage is implied rather than stated: the atomic-per-turn framing plus the retry note tells an agent this is the batching entry point, and the "never generates or charges" sentence is a genuine when-not with an alternative. But there is no guidance on routing between this umbrella tool and the many sibling tools that expose the same actions as standalone calls (offer answers, AI label, editing plan), leaving a real selection ambiguity.

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