GhostfeedGhostfeed MCPv6.0.0

What changed

Every released change to the agent surface, with the exact old and new wording shown as a diff.

One entry per released version, newest first. Green lines are new, red lines are what they replaced. Additions never break a connected agent: MCP clients re-read the tool list every session, so new tools, parameters, and enum values simply appear. Anything that could break an existing integration is labeled breaking and only ships with a new major version.

The current version is always reported by get_me as apiVersion.

v6.0.0

2026-08-24

Slideshow text composition now has a four-element ceiling per slide, replacing the previous five-element limit. Agents should combine or redistribute copy that would require a fifth text box. The Director remains free to choose the best mix of headings and supporting text within that ceiling and the existing safe-area fit rules.

  • BREAKINGset_slide_textsconstraint tightened: texts maxItems: 5 -> 4Studio
  • WORDINGset_slide_textsdescription changedStudio
    Replace one slide's text boxes (1-5 texts with placement top/center/bottom and role heading/subheading/body/cta - role sets the font size, positions are computed server-side exactly like the dashboard). Infer copy density from the user's full brief and this slide's narrative job: headings are usually 3-8 words and body copy 8-20 words, but conversational brevity/detail guidance and explicit word or line limits win. The server rejects copy beyond heading 2, subheading 3, body 4, or CTA 2 rendered lines, or outside the safe area; it never truncates. Rewrite or redistribute and retry after a fit error. Optionally mark isProductSlide. If this is the deck's first build edit it charges 1 credit and returns creditsSpent/creditsRemaining.
    Replace one slide's text boxes (1-4 texts with placement top/center/bottom and role heading/subheading/body/cta - role sets the font size, positions are computed server-side exactly like the dashboard). Infer copy density from the user's full brief, the slide's narrative job, and the slideshow's established style. There are no default word-count or rendered-line quotas; deliberate dense copy and walls of text are valid creative choices. Explicit user limits win. The server enforces physical safe-area fit; it never truncates. Rewrite or restructure after a fit error. Optionally mark isProductSlide. If this is the deck's first build edit it charges 1 credit and returns creditsSpent/creditsRemaining.
  • WORDINGset_slide_textsparam description changed: textsStudio
    Replaces ALL text boxes on the slide; positions are computed server-side. Hard fit limits: heading 2 rendered lines, subheading 3, body 4, CTA 2.
    Replaces ALL text boxes on the slide; positions are computed server-side. There are no default word or line quotas: use the density the slide needs. The server enforces physical safe-area fit and any explicit limits from the user's brief; it never truncates.

v5.20.2

2026-08-14

MiniMax H3 video-guided generation now accepts source videos without audio. When source audio exists, Ghostfeed preserves and sends it; when the source is silent, Ghostfeed sends the selected frame, reference video, and approved text without inventing an audio track. Audio-guided generation still requires a supported source-audio stream.

  • WORDINGgenerate_reaction_videodescription changedUGC Reactions
    PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames and exact prompt. For MiniMax H3, set minimaxH3Mode explicitly: prompt_based sends the selected frame and text; audio_guided also sends source audio; video_guided also sends the source video and its audio. Guided H3 calls require sourceTemplateId and durationSeconds, and sourceTemplateId must match every frame lineage. First call generate_reaction_prompt with the matching profile and show its complete prompt. The prompt already includes visible Mandatory reference guidance; do not remove or rewrite that section. Small user-approved changes belong only inside Action guidance. Ghostfeed sends the approved prompt without adding hidden text. Then call here with promptApproved true and a protective maxCredits. Other clone modes take no prompt and follow source duration. Other prompt modes use text and may support enableAudio. H3 defaults to 768p and supports optional 2k. Async: returns one reaction_video generation per frame to poll. Immediately call render_video_result with status generating, the generationId, prompt, model, method, aspect ratio, and relevant frame/avatar reference images. The view polls and replaces the pending card with the playable video.
    PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames and exact prompt. For MiniMax H3, set minimaxH3Mode explicitly: prompt_based sends the selected frame and text; audio_guided also sends source audio; video_guided also sends the source video and includes its audio when present. Guided H3 calls require sourceTemplateId and durationSeconds, and sourceTemplateId must match every frame lineage. First call generate_reaction_prompt with the matching profile and show its complete prompt. The prompt already includes visible Mandatory reference guidance; do not remove or rewrite that section. Small user-approved changes belong only inside Action guidance. Ghostfeed sends the approved prompt without adding hidden text. Then call here with promptApproved true and a protective maxCredits. Other clone modes take no prompt and follow source duration. Other prompt modes use text and may support enableAudio. H3 defaults to 768p and supports optional 2k. Async: returns one reaction_video generation per frame to poll. Immediately call render_video_result with status generating, the generationId, prompt, model, method, aspect ratio, and relevant frame/avatar reference images. The view polls and replaces the pending card with the playable video.
  • WORDINGgenerate_reaction_videoparam description changed: minimaxH3ModeUGC Reactions
    MiniMax H3 input mode. Every value uses the selected frame. prompt_based adds text only; audio_guided also sends source audio; video_guided also sends the source video and its audio.
    MiniMax H3 input mode. Every value uses the selected frame. prompt_based adds text only; audio_guided also sends source audio; video_guided also sends the source video and includes its audio when present.
  • WORDINGlist_reaction_video_modesdescription changedUGC Reactions
    List the video modes for the reaction video phase, with costs, resolutions, prompt rules, and audio behavior. MiniMax H3 also returns minimaxH3Modes: prompt_based, audio_guided, and video_guided. Every H3 mode uses the selected frame. Audio-guided adds free source audio. Video-guided adds billed source-video input and its audio. Read these fields before creating an H3 prompt or video.
    List the video modes for the reaction video phase, with costs, resolutions, prompt rules, and audio behavior. MiniMax H3 also returns minimaxH3Modes: prompt_based, audio_guided, and video_guided. Every H3 mode uses the selected frame. Audio-guided adds free source audio. Video-guided adds billed source-video input and includes its audio when present. Read these fields before creating an H3 prompt or video.

v5.20.1

2026-08-13

Data tools whose results the user can see now carry one uniform presentation rule: in an MCP Apps host, show results with the mapped render tool instead of hand-building galleries or embedding thumbnails in chat. Nine tools gained the sentence (avatars, draft avatars, avatar images, collection images, reaction frames, reaction videos, video detail, generations, inspirations). Behavior and inputs are unchanged.

  • WORDINGget_reaction_videodescription changedUGC Reactions
    Read one reaction video’s full render record after finding it with list_reaction_videos. Returns the canonical generated video URL, sourceReactionId, exact first-frame and video prompts, selected frame, models, duration, and post-edit URL. Call get_reaction_template separately for source media and Gemini analysis. Use this only for videos you need to recreate or inspect in detail; the list stays compact enough to inventory up to 100 videos.
    Read one reaction video’s full render record after finding it with list_reaction_videos. Returns the canonical generated video URL, sourceReactionId, exact first-frame and video prompts, selected frame, models, duration, and post-edit URL. Call get_reaction_template separately for source media and Gemini analysis. Use this only for videos you need to recreate or inspect in detail; the list stays compact enough to inventory up to 100 videos. To SHOW these results in an MCP Apps host, ALWAYS call render_video_result; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
  • WORDINGlist_avatar_imagesdescription changedStudio
    List a saved avatar's generated photos (urls + captions), newest first, 30 per page. A worked avatar can hold hundreds, so this is paged: read total/pages and ask for the next page rather than expecting everything at once. The captions describe each shot, so use them to pick a specific pose or framing — that is how you cast a first frame for generate_reaction_frames via referenceImageUrl. Reusing them is free; use set_slide_background type 'avatar' to cast one.
    List a saved avatar's generated photos (urls + captions), newest first, 30 per page. A worked avatar can hold hundreds, so this is paged: read total/pages and ask for the next page rather than expecting everything at once. The captions describe each shot, so use them to pick a specific pose or framing — that is how you cast a first frame for generate_reaction_frames via referenceImageUrl. Reusing them is free; use set_slide_background type 'avatar' to cast one. To SHOW these results in an MCP Apps host, ALWAYS call render_image_results; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
  • WORDINGlist_avatarsdescription changedAvatars
    List SAVED (library) avatars in the active workspace: id, name, thumbnail. Use this to find an avatarId for rename_avatar or content generation. Unapproved drafts are separate (list_draft_avatars).
    List SAVED (library) avatars in the active workspace: id, name, thumbnail. Use this to find an avatarId for rename_avatar or content generation. Unapproved drafts are separate (list_draft_avatars). To SHOW these results in an MCP Apps host, ALWAYS call render_image_results; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
  • WORDINGlist_collection_imagesdescription changedStudio
    List a collection's actual images (urls + AI captions of what each shows), 30 per page. Use to hand-pick a specific image for set_slide_background.
    List a collection's actual images (urls + AI captions of what each shows), 30 per page. Use to hand-pick a specific image for set_slide_background. To SHOW these results in an MCP Apps host, ALWAYS call render_image_results; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
  • WORDINGlist_draft_avatarsdescription changedAvatars
    List draft avatars awaiting approval in the active workspace, newest first (paginated).
    List draft avatars awaiting approval in the active workspace, newest first (paginated). To SHOW these results in an MCP Apps host, ALWAYS call render_image_results; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
  • WORDINGlist_generationsdescription changedGenerations
    List recent ASYNC agent jobs in the active workspace for polling and operational status, newest first. This ledger is not the product media library and must never be used to decide which content exists. Avatar creation is synchronous and never appears. Optionally filter by kind or state. Use show_generations when the user wants the real visual product library.
    List recent ASYNC agent jobs in the active workspace for polling and operational status, newest first. This ledger is not the product media library and must never be used to decide which content exists. Avatar creation is synchronous and never appears. Optionally filter by kind or state. Use show_generations when the user wants the real visual product library. To SHOW these results in an MCP Apps host, ALWAYS call render_generation_gallery; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
  • WORDINGlist_inspiration_reactionsdescription changedUGC Reactions
    SECOND source search for every new reaction request, after list_reaction_templates has no suitable opening pose. Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). Captioned clips also carry opensOn (the opening still your avatar gets rendered into) and motion (what happens in the clip). When the user wants a visual browser, call render_inspiration_browser with the workspace and optional category. The widget loads 12 real library items per page and can change pages without another model turn. A selection asks what the user wants to create and does not start paid work. Choose primarily on opensOn. A prompt-mode video may reuse the opening pose without copying the source motion. Use motion only to judge a requested clone, and never paste it into generate_reaction_video as the prompt. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first. Only fall back to a custom referenceImageUrl after both libraries lack a reasonable match.
    SECOND source search for every new reaction request, after list_reaction_templates has no suitable opening pose. Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). Captioned clips also carry opensOn (the opening still your avatar gets rendered into) and motion (what happens in the clip). render_inspiration_browser (workspace plus optional category) loads 12 real library items per page and changes pages without another model turn. A selection asks what the user wants to create and does not start paid work. Choose primarily on opensOn. A prompt-mode video may reuse the opening pose without copying the source motion. Use motion only to judge a requested clone, and never paste it into generate_reaction_video as the prompt. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first. Only fall back to a custom referenceImageUrl after both libraries lack a reasonable match. To SHOW these results in an MCP Apps host, ALWAYS call render_inspiration_browser; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
  • WORDINGlist_reaction_framesdescription changedUGC Reactions
    List reusable reaction FRAMES on the workspace board, newest first, including ones a person made in the dashboard. Filter by both avatar and template before generating a new first frame. Each row carries its image, lineage and generation metadata, preferenceStatus, videoStage, and animationStatus. A complete frame is still reusable for another video. Show candidates and let the user reuse one for free or request a fresh variation; never silently assume an old take is approved.
    List reusable reaction FRAMES on the workspace board, newest first, including ones a person made in the dashboard. Filter by both avatar and template before generating a new first frame. Each row carries its image, lineage and generation metadata, preferenceStatus, videoStage, and animationStatus. A complete frame is still reusable for another video. Show candidates and let the user reuse one for free or request a fresh variation; never silently assume an old take is approved. To SHOW these results in an MCP Apps host, ALWAYS call render_image_results; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
  • WORDINGlist_reaction_videosdescription changedUGC Reactions
    List the reaction VIDEOS in this workspace, newest first, agent-made or not. Each has a videoId, name, stage, a playable videoUrl once stage is "complete", a dashboardUrl, and sourceReactionId when it came from a template. videoUrl is the canonical clip: the post-edit version once one exists, otherwise the raw render. generation is a compact model/mode/duration summary. Rows carry avatarId but not the avatar name; resolve names with list_avatars when you need them. Call get_reaction_template with sourceReactionId for source media and Gemini analysis, or get_reaction_video for the exact prompt/settings of one rendered video. Managing and deleting videos stays in the dashboard.
    List the reaction VIDEOS in this workspace, newest first, agent-made or not. Each has a videoId, name, stage, a playable videoUrl once stage is "complete", a dashboardUrl, and sourceReactionId when it came from a template. videoUrl is the canonical clip: the post-edit version once one exists, otherwise the raw render. generation is a compact model/mode/duration summary. Rows carry avatarId but not the avatar name; resolve names with list_avatars when you need them. Call get_reaction_template with sourceReactionId for source media and Gemini analysis, or get_reaction_video for the exact prompt/settings of one rendered video. Managing and deleting videos stays in the dashboard. To SHOW these results in an MCP Apps host, ALWAYS call render_video_result; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.

v5.20.0

2026-08-10

Ghostfeed MCP Apps now use the product avatar setup rules. Avatar preparation uses all product traits, required fields, field locks, the server randomizer, one draft per request, and product model names and prices. Inspiration items now include their source video URL, so full-screen inspiration has native video playback and video downloads. Full-screen media now reports the complete host height and ends at the MCP App boundary above the host composer.

    v5.19.0

    2026-08-09

    Ghostfeed MCP Apps now provide six focused views: avatar builder, source crop, image results, video result, generation gallery, and inspiration browser. The gallery and inspiration browser each read their real product collection and show 12 items per page. Their controls use read-only server tools directly; they do not require a new model turn. Full-screen media uses host controls, native video controls, and host-mediated downloads.

    • ADDEDedit_reaction_framenew toolUGC Reactions
      Edit one existing reaction frame with a text prompt. Use frameId from list_reaction_frames. This creates a new frame and preserves the source frame plus its lineage. It charges the selected image-model and resolution cost once. The returned reaction_frame generation is normally succeeded; a concurrent idempotent replay can return the same queued generation and must be polled. On success, output.url is the edited image and output.id is the new frameId. Show the edit to the user and get approval before generate_reaction_video.
    • WORDINGcreate_avatardescription changedAvatars
      Generate draft avatar(s) from appearance traits + an optional scene prompt. Returns drafts that are NOT saved to the library; the user must approve them. Any traits you omit are randomized. Costs credits per image; the result reports creditsSpent and creditsRemaining. Drafts are billed once at creation, never expire, and cost nothing to keep unapproved. Each draft carries dashboardUrl, the dashboard door to that draft.
      Generate draft avatar(s) from appearance traits + an optional scene prompt. Returns drafts that are NOT saved to the library; the user must approve them. Any traits you omit are randomized. Costs credits per image; the result reports creditsSpent and creditsRemaining. Drafts are billed once at creation, never expire, and cost nothing to keep unapproved. Each draft carries dashboardUrl, the dashboard door to that draft. After a successful result, call render_image_results with one ready avatar-draft item per imageUrl so the user can review the images in chat.
    • WORDINGgenerate_reaction_framesdescription changedUGC Reactions
      PHASE 1 of a UGC reaction: render one or more avatars into the source pose, ONE frame per avatar. LIBRARY-FIRST RULE: unless the user explicitly supplied an exact source, call list_reaction_templates first, then list_inspiration_reactions if needed, and use a reasonable library opening-pose match. A custom motion request can still use a library first frame with prompt-mode animation. Use referenceImageUrl only after both Ghostfeed libraries lack a suitable opening pose, and tell the user why the custom fallback was necessary. Source is exactly one of templateId, inspirationId (auto-saved to a template first), or referenceImageUrl. imageOutputResolution is optional and defaults to standard; set it to 1080p only when the user requests a higher-resolution frame. Async: returns one reaction_frame generation per avatar to poll; the finished frame is output.url and output.id is the frameId. Charges the selected image-model and resolution cost per avatar as frames render (gemini_flash unless imageModel is set). STOP after this: show the frame(s) to the user and get approval BEFORE generate_reaction_video, because video credits are far higher.
      PHASE 1 of a UGC reaction: create ONE first frame per avatar. With a source, render the avatar into the source pose. Without a source, supply a non-empty stylingPrompt to create the frame directly from the avatar. Source is at most one of templateId, inspirationId (auto-saved to a template first), or referenceImageUrl. For a source-based request, search list_reaction_templates first, then list_inspiration_reactions if the user did not supply an exact source. imageOutputResolution defaults to standard. Source-based work is async and must be polled. Prompt-only work normally returns succeeded reaction_frame generations; a concurrent idempotent replay can return the same queued generation and must be polled. In both flows, the finished frame is output.url and output.id is the frameId. For async generations, immediately call render_image_results with one generating frame item per generation: set generationId to the returned generation id and keep the shared prompt, image model, and requested aspect ratio. The widget polls the read-only result itself. The selected image model and resolution charge applies per avatar. Show all frames and get approval before generate_reaction_video.
    • WORDINGgenerate_reaction_videodescription changedUGC Reactions
      PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames and exact prompt. For MiniMax H3, set minimaxH3Mode explicitly: prompt_based sends the selected frame and text; audio_guided also sends source audio; video_guided also sends the source video and its audio. Guided H3 calls require sourceTemplateId and durationSeconds, and sourceTemplateId must match every frame lineage. First call generate_reaction_prompt with the matching profile and show its complete prompt. The prompt already includes visible Mandatory reference guidance; do not remove or rewrite that section. Small user-approved changes belong only inside Action guidance. Ghostfeed sends the approved prompt without adding hidden text. Then call here with promptApproved true and a protective maxCredits. Other clone modes take no prompt and follow source duration. Other prompt modes use text and may support enableAudio. H3 defaults to 768p and supports optional 2k. Async: returns one reaction_video generation per frame to poll.
      PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames and exact prompt. For MiniMax H3, set minimaxH3Mode explicitly: prompt_based sends the selected frame and text; audio_guided also sends source audio; video_guided also sends the source video and its audio. Guided H3 calls require sourceTemplateId and durationSeconds, and sourceTemplateId must match every frame lineage. First call generate_reaction_prompt with the matching profile and show its complete prompt. The prompt already includes visible Mandatory reference guidance; do not remove or rewrite that section. Small user-approved changes belong only inside Action guidance. Ghostfeed sends the approved prompt without adding hidden text. Then call here with promptApproved true and a protective maxCredits. Other clone modes take no prompt and follow source duration. Other prompt modes use text and may support enableAudio. H3 defaults to 768p and supports optional 2k. Async: returns one reaction_video generation per frame to poll. Immediately call render_video_result with status generating, the generationId, prompt, model, method, aspect ratio, and relevant frame/avatar reference images. The view polls and replaces the pending card with the playable video.
    • WORDINGlist_generationsdescription changedGenerations
      List recent ASYNC generations in the active workspace, newest first (slideshow creations appear here). Avatar creation is synchronous and never appears. Optionally filter by kind or state.
      List recent ASYNC agent jobs in the active workspace for polling and operational status, newest first. This ledger is not the product media library and must never be used to decide which content exists. Avatar creation is synchronous and never appears. Optionally filter by kind or state. Use show_generations when the user wants the real visual product library.
    • WORDINGlist_inspiration_reactionsdescription changedUGC Reactions
      SECOND source search for every new reaction request, after list_reaction_templates has no suitable opening pose. Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). Captioned clips also carry opensOn (the opening still your avatar gets rendered into) and motion (what happens in the clip). Choose primarily on opensOn. A prompt-mode video may reuse the opening pose without copying the source motion. Use motion only to judge a requested clone, and never paste it into generate_reaction_video as the prompt. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first. Only fall back to a custom referenceImageUrl after both libraries lack a reasonable match.
      SECOND source search for every new reaction request, after list_reaction_templates has no suitable opening pose. Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). Captioned clips also carry opensOn (the opening still your avatar gets rendered into) and motion (what happens in the clip). When the user wants a visual browser, call render_inspiration_browser with the workspace and optional category. The widget loads 12 real library items per page and can change pages without another model turn. A selection asks what the user wants to create and does not start paid work. Choose primarily on opensOn. A prompt-mode video may reuse the opening pose without copying the source motion. Use motion only to judge a requested clone, and never paste it into generate_reaction_video as the prompt. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first. Only fall back to a custom referenceImageUrl after both libraries lack a reasonable match.

    v5.17.1

    2026-08-08

    MiniMax H3 guided prompts now show every instruction sent to the provider. Audio-guided and video-guided prompt generation includes a visible `Mandatory reference guidance` section and a separate `Action guidance` section. Agents must show the complete prompt, tell the user not to change the mandatory section, and limit approved edits to the action section. Ghostfeed no longer adds hidden video-audio prompt text after approval.

    • WORDINGgenerate_reaction_promptdescription changedUGC Reactions
      Generate the exact prompt the user will review before video creation. promptProfile prompt_based returns the normal visual-action prompt and remains a repair path when the template motionAnalysis is missing. For MiniMax H3, audio_guided and video_guided are on-demand profiles and require outputDurationSeconds: audio_guided analyzes visible performance plus source audio; video_guided adds strong motion-transfer instructions and exact hard-cut timing. Every profile still uses the selected first frame during video generation. Show the returned prompt, H3 plan, settings, warning, and estimated credits to the user before calling generate_reaction_video.
      Generate the exact prompt the user will review before video creation. promptProfile prompt_based returns the normal visual-action prompt and remains a repair path when the template motionAnalysis is missing. For MiniMax H3, audio_guided and video_guided are on-demand profiles and require outputDurationSeconds. Their returned prompt visibly includes a Mandatory reference guidance section followed by Action guidance. Show the complete returned prompt, H3 plan, settings, warning, and estimated credits to the user. Tell the user not to change Mandatory reference guidance and to make only small changes inside Action guidance. Every profile still uses the selected first frame during video generation.
    • WORDINGgenerate_reaction_videodescription changedUGC Reactions
      PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames and exact prompt. For MiniMax H3, set minimaxH3Mode explicitly: prompt_based sends the selected frame and text; audio_guided also sends source audio; video_guided also sends the source video and its audio. Guided H3 calls require sourceTemplateId and durationSeconds, and sourceTemplateId must match every frame lineage. First call generate_reaction_prompt with the matching profile, show its exact prompt, settings, warning, and estimated cost, then call here with promptApproved true and a protective maxCredits. Other clone modes take no prompt and follow source duration. Other prompt modes use text and may support enableAudio. H3 defaults to 768p and supports optional 2k. Async: returns one reaction_video generation per frame to poll.
      PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames and exact prompt. For MiniMax H3, set minimaxH3Mode explicitly: prompt_based sends the selected frame and text; audio_guided also sends source audio; video_guided also sends the source video and its audio. Guided H3 calls require sourceTemplateId and durationSeconds, and sourceTemplateId must match every frame lineage. First call generate_reaction_prompt with the matching profile and show its complete prompt. The prompt already includes visible Mandatory reference guidance; do not remove or rewrite that section. Small user-approved changes belong only inside Action guidance. Ghostfeed sends the approved prompt without adding hidden text. Then call here with promptApproved true and a protective maxCredits. Other clone modes take no prompt and follow source duration. Other prompt modes use text and may support enableAudio. H3 defaults to 768p and supports optional 2k. Async: returns one reaction_video generation per frame to poll.

    v5.17.0

    2026-08-07

    MiniMax H3 now has three explicit agent modes: `prompt_based`, `audio_guided`, and `video_guided`. All three modes require an approved first frame. Guided modes also bind the request to its source template and require an explicit output duration. Agents can generate the matching prompt on demand, show the exact prompt and cost plan for approval, and then submit the video with the same mode. Audio guidance adds the source audio at no input charge. Video guidance adds the source video, its audio, and a billed reference-video line item. The REST and MCP surfaces use the same schemas, validation, billing, idempotency, durable queue, and provider lifecycle.

    • ADDEDgenerate_reaction_promptoptional param added: promptProfileUGC Reactions
    • ADDEDgenerate_reaction_promptoptional param added: outputDurationSecondsUGC Reactions
    • ADDEDgenerate_reaction_promptoptional param added: outputResolutionUGC Reactions
    • ADDEDgenerate_reaction_videoenum values added to mode: minimax_h3UGC Reactions
    • ADDEDgenerate_reaction_videoconstraint removed: prompt maxLength: 2000 -> noneUGC Reactions
    • ADDEDgenerate_reaction_videoenum values added to outputResolution: 768p, 2kUGC Reactions
    • ADDEDgenerate_reaction_videooptional param added: minimaxH3ModeUGC Reactions
    • ADDEDgenerate_reaction_videooptional param added: sourceTemplateIdUGC Reactions
    • WORDINGgenerate_reaction_promptdescription changedUGC Reactions
      REPAIR PATH, not the first stop. Every clip is analysed automatically when it is imported, so call get_reaction_template FIRST and use its motionAnalysis.prompt; that read is free. Call this only when motionAnalysis is missing, its status is not "complete", or the source was re-cropped after it was written. It reuses an analysis of the same footage from anywhere in either library when one exists, and otherwise watches the full source video and caches the result on the template. Returns timed motion guidance plus a compact prompt for a prompt-mode reaction (Seedance, Grok, PixVerse, or Kling); pass that prompt to generate_reaction_video. Never needed for one_to_one clone modes.
      Generate the exact prompt the user will review before video creation. promptProfile prompt_based returns the normal visual-action prompt and remains a repair path when the template motionAnalysis is missing. For MiniMax H3, audio_guided and video_guided are on-demand profiles and require outputDurationSeconds: audio_guided analyzes visible performance plus source audio; video_guided adds strong motion-transfer instructions and exact hard-cut timing. Every profile still uses the selected first frame during video generation. Show the returned prompt, H3 plan, settings, warning, and estimated credits to the user before calling generate_reaction_video.
    • WORDINGgenerate_reaction_videodescription changedUGC Reactions
      PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames. mode picks the family: a CLONE mode (one_to_one_*) copies the motion straight from the source clip and takes no prompt; a PROMPT mode (default seedance_2_0_fast) animates from text and needs a prompt. In PROMPT mode, show the user the exact prompt plus selected mode, duration, resolution, and audio setting; call only after explicit approval, with promptApproved true. The source template supplied only the first frame — movement comes from what the USER asked for. Never paste the template `motion` browsing summary in as the prompt. Duration is auto unless durationSeconds is set (ignored by clone modes, which follow the source clip). PixVerse and the Seedance 2.0 series generate synchronized audio by default; set enableAudio false for silent output. Unsupported modes default to silent and reject enableAudio true. There is no audio surcharge beyond the selected model/resolution rate. Before setting outputResolution to 1080p, call list_reaction_video_modes and confirm that the chosen mode lists 1080p in supportedResolutions; Seedance 2.0 Fast and Mini are 720p-only. Async: returns one reaction_video generation per frame to poll; the clip is output.url. Charges per second of video and reports creditsSpent/creditsRemaining.
      PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames and exact prompt. For MiniMax H3, set minimaxH3Mode explicitly: prompt_based sends the selected frame and text; audio_guided also sends source audio; video_guided also sends the source video and its audio. Guided H3 calls require sourceTemplateId and durationSeconds, and sourceTemplateId must match every frame lineage. First call generate_reaction_prompt with the matching profile, show its exact prompt, settings, warning, and estimated cost, then call here with promptApproved true and a protective maxCredits. Other clone modes take no prompt and follow source duration. Other prompt modes use text and may support enableAudio. H3 defaults to 768p and supports optional 2k. Async: returns one reaction_video generation per frame to poll.
    • WORDINGgenerate_reaction_videoparam description changed: promptUGC Reactions
      Motion prompt for prompt modes. Call list_reaction_video_modes and obey the selected mode’s maxPromptCharacters; clone modes reject prompt.
    • WORDINGgenerate_reaction_videoparam description changed: enableAudioUGC Reactions
      Controls synchronized generated audio. PixVerse and the Seedance 2.0 series default to true; set false for silent output. Unsupported modes default to silent and reject true. There is no audio surcharge beyond the selected model/resolution rate.
      Controls synchronized generated audio for modes that advertise supportsAudio true. Unsupported modes reject true; MiniMax H3 output audio is provider-native and is not configurable here.
    • WORDINGgenerate_reaction_videoparam description changed: outputResolutionUGC Reactions
      Requested output resolution. Call list_reaction_video_modes first and use the selected mode’s supportedResolutions; Seedance 2.0 Fast and Mini support 720p only.
      Requested output resolution. Call list_reaction_video_modes first and use the selected mode’s supportedResolutions. Resolution availability and defaults are mode-specific; MiniMax H3 defaults to 768p and supports an optional 2k upgrade.
    • WORDINGlist_reaction_video_modesdescription changedUGC Reactions
      List the video modes for the reaction video phase, with per-second credit cost, supported output resolutions, whether each needs a prompt or supports audio, and audioEnabledByDefault. Two families: CLONE modes reproduce a template motion (default one_to_one_standard, Kling motion-control, no prompt); PROMPT modes animate the frame from text (default seedance_2_0_fast). PixVerse and Seedance 2.0, Fast, and Mini generate audio by default with no surcharge; set enableAudio false for silent output and check supportedResolutions before choosing a resolution.
      List the video modes for the reaction video phase, with costs, resolutions, prompt rules, and audio behavior. MiniMax H3 also returns minimaxH3Modes: prompt_based, audio_guided, and video_guided. Every H3 mode uses the selected frame. Audio-guided adds free source audio. Video-guided adds billed source-video input and its audio. Read these fields before creating an H3 prompt or video.

    v5.14.0

    2026-07-28

    UGC reaction agents now search the workspace's existing first frames before spending credits on a new one. `list_reaction_frames` exposes lineage, model, resolution, preference, and accurate animation-state metadata so an agent can show reusable candidates and let the user choose between reuse and a fresh take. Already-animated frames remain reusable for new prompts and settings.

    • ADDEDcrop_reaction_templatenew toolUGC Reactions
      Create one reusable reaction template from an exact timestamp range of an existing owned/imported template. Async and free: poll the returned reaction_crop generation. On success output.id is the new template id. Use when the user supplies or approves exact start/end times; this creates a derivative and archives the source only when the source was blocked in needs_crop.
    • ADDEDsmart_crop_reaction_templatenew toolUGC Reactions
      Split an existing owned/imported reaction source into up to 8 reusable templates using FFmpeg scene-change detection. This is cut detection, not semantic highlight selection. Async and free: poll the returned reaction_smart_crop generation; outputs appear incrementally and each output.id is a new template id.
    • ADDEDlist_generationsenum values added to kind: reaction_crop, reaction_smart_cropGenerations
    • WORDINGlist_reaction_framesdescription changedUGC Reactions
      List the reaction FRAMES on the workspace board, newest first, including ones a person made in the dashboard rather than through an agent. Each has a frameId, image, the avatar it used, its source template, the videoStage of the shell it lives in, and isAnimated (false means nothing has been animated from it yet, so it is free to use). Use this to act on existing work: "animate the frame I made this morning" starts here, then pass the frameId to generate_reaction_video.
      List reusable reaction FRAMES on the workspace board, newest first, including ones a person made in the dashboard. Filter by both avatar and template before generating a new first frame. Each row carries its image, lineage and generation metadata, preferenceStatus, videoStage, and animationStatus. A complete frame is still reusable for another video. Show candidates and let the user reuse one for free or request a fresh variation; never silently assume an old take is approved.
    • WORDINGset_slide_textsdescription changedStudio
      Replace one slide's text boxes (1-5 texts with placement top/center/bottom and role heading/subheading/body/cta - role sets the font size, positions are computed server-side exactly like the dashboard). Optionally mark isProductSlide. If this is the deck's first build edit it charges 1 credit and returns creditsSpent/creditsRemaining.
      Replace one slide's text boxes (1-5 texts with placement top/center/bottom and role heading/subheading/body/cta - role sets the font size, positions are computed server-side exactly like the dashboard). Infer copy density from the user's full brief and this slide's narrative job: headings are usually 3-8 words and body copy 8-20 words, but conversational brevity/detail guidance and explicit word or line limits win. The server rejects copy beyond heading 2, subheading 3, body 4, or CTA 2 rendered lines, or outside the safe area; it never truncates. Rewrite or redistribute and retry after a fit error. Optionally mark isProductSlide. If this is the deck's first build edit it charges 1 credit and returns creditsSpent/creditsRemaining.
    • WORDINGset_slide_textsparam description changed: textsStudio
      Replaces ALL text boxes on the slide; positions are computed server-side.
      Replaces ALL text boxes on the slide; positions are computed server-side. Hard fit limits: heading 2 rendered lines, subheading 3, body 4, CTA 2.
    • WORDINGset_slide_textsparam description changed: texts[].textStudio
      Final copy for this box. Follow the user's requested density; visual overflow is rejected, never silently truncated.

    v5.13.0

    2026-07-27

    Seedance 2.0, Seedance 2.0 Fast, and Seedance 2.0 Mini now support optional synchronized generated audio in both the dashboard and agent API. Agents can discover the capability through `list_reaction_video_modes` and request it with `enableAudio`. PixVerse and every audio-capable Seedance mode default audio on; set `enableAudio: false` for silent output. Audio remains flat-priced at each selected model and resolution rate.

    • WORDINGgenerate_reaction_videodescription changedUGC Reactions
      PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames. mode picks the family: a CLONE mode (one_to_one_*) copies the motion straight from the source clip and takes no prompt; a PROMPT mode (default seedance_2_0_fast) animates from text and needs a prompt. In PROMPT mode, show the user the exact prompt plus selected mode, duration, resolution, and audio setting; call only after explicit approval, with promptApproved true. The source template supplied only the first frame — movement comes from what the USER asked for. Never paste the template `motion` browsing summary in as the prompt. Duration is auto unless durationSeconds is set (ignored by clone modes, which follow the source clip). Before setting outputResolution to 1080p, call list_reaction_video_modes and confirm that the chosen mode lists 1080p in supportedResolutions; Seedance 2.0 Fast and Mini are 720p-only. Async: returns one reaction_video generation per frame to poll; the clip is output.url. Charges per second of video and reports creditsSpent/creditsRemaining.
      PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames. mode picks the family: a CLONE mode (one_to_one_*) copies the motion straight from the source clip and takes no prompt; a PROMPT mode (default seedance_2_0_fast) animates from text and needs a prompt. In PROMPT mode, show the user the exact prompt plus selected mode, duration, resolution, and audio setting; call only after explicit approval, with promptApproved true. The source template supplied only the first frame — movement comes from what the USER asked for. Never paste the template `motion` browsing summary in as the prompt. Duration is auto unless durationSeconds is set (ignored by clone modes, which follow the source clip). PixVerse and the Seedance 2.0 series generate synchronized audio by default; set enableAudio false for silent output. Unsupported modes default to silent and reject enableAudio true. There is no audio surcharge beyond the selected model/resolution rate. Before setting outputResolution to 1080p, call list_reaction_video_modes and confirm that the chosen mode lists 1080p in supportedResolutions; Seedance 2.0 Fast and Mini are 720p-only. Async: returns one reaction_video generation per frame to poll; the clip is output.url. Charges per second of video and reports creditsSpent/creditsRemaining.
    • WORDINGgenerate_reaction_videoparam description changed: enableAudioUGC Reactions
      Controls synchronized generated audio. PixVerse and the Seedance 2.0 series default to true; set false for silent output. Unsupported modes default to silent and reject true. There is no audio surcharge beyond the selected model/resolution rate.
    • WORDINGlist_reaction_video_modesdescription changedUGC Reactions
      List the video modes for the reaction video phase, with per-second credit cost, supported output resolutions, and whether each needs a prompt or supports audio. Two families: CLONE modes reproduce a template motion (default one_to_one_standard, Kling motion-control, no prompt); PROMPT modes animate the frame from text (default seedance_2_0_fast). Use a clone mode only when the user wants to reproduce the reference video motion, and check supportedResolutions before requesting 1080p.
      List the video modes for the reaction video phase, with per-second credit cost, supported output resolutions, whether each needs a prompt or supports audio, and audioEnabledByDefault. Two families: CLONE modes reproduce a template motion (default one_to_one_standard, Kling motion-control, no prompt); PROMPT modes animate the frame from text (default seedance_2_0_fast). PixVerse and Seedance 2.0, Fast, and Mini generate audio by default with no surcharge; set enableAudio false for silent output and check supportedResolutions before choosing a resolution.

    v5.12.0

    2026-07-27

    MCP results now include native media resource links alongside the unchanged JSON envelope, so compatible clients can preview, play, or download generated images and videos directly in the conversation. Links are capped per result to keep media-heavy library searches usable.

    • ADDEDgenerate_reaction_videooptional param added: promptApprovedUGC Reactions
    • WORDINGgenerate_reaction_videodescription changedUGC Reactions
      PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames. mode picks the family: a CLONE mode (one_to_one_*) copies the motion straight from the source clip and takes no prompt; a PROMPT mode (default seedance_2_0_fast) animates from text and needs a prompt. In PROMPT mode the source template supplied only the first frame — the movement comes from what the USER asked for, so write `prompt` from their words. Never paste the template `motion` text in as the prompt: that field exists to help you CHOOSE a clip, and using it would animate the reference performance instead of the one the user described. Duration is auto unless durationSeconds is set (ignored by clone modes, which follow the source clip). Before setting outputResolution to 1080p, call list_reaction_video_modes and confirm that the chosen mode lists 1080p in supportedResolutions; Seedance 2.0 Fast and Mini are 720p-only. Async: returns one reaction_video generation per frame to poll; the clip is output.url. Charges per second of video and reports creditsSpent/creditsRemaining.
      PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames. mode picks the family: a CLONE mode (one_to_one_*) copies the motion straight from the source clip and takes no prompt; a PROMPT mode (default seedance_2_0_fast) animates from text and needs a prompt. In PROMPT mode, show the user the exact prompt plus selected mode, duration, resolution, and audio setting; call only after explicit approval, with promptApproved true. The source template supplied only the first frame — movement comes from what the USER asked for. Never paste the template `motion` browsing summary in as the prompt. Duration is auto unless durationSeconds is set (ignored by clone modes, which follow the source clip). Before setting outputResolution to 1080p, call list_reaction_video_modes and confirm that the chosen mode lists 1080p in supportedResolutions; Seedance 2.0 Fast and Mini are 720p-only. Async: returns one reaction_video generation per frame to poll; the clip is output.url. Charges per second of video and reports creditsSpent/creditsRemaining.

    v5.11.0

    2026-07-27

    `list_reaction_video_modes` now reports `supportedResolutions` for every mode, so agents can discover that Seedance 2.0 Fast and Mini are 720p-only before calling `generate_reaction_video`. The video generation schema and tool description now point agents to that per-mode capability field.

    • WORDINGgenerate_reaction_videodescription changedUGC Reactions
      PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames. mode picks the family: a CLONE mode (one_to_one_*) copies the motion straight from the source clip and takes no prompt; a PROMPT mode (default seedance_2_0_fast) animates from text and needs a prompt. In PROMPT mode the source template supplied only the first frame — the movement comes from what the USER asked for, so write `prompt` from their words. Never paste the template `motion` text in as the prompt: that field exists to help you CHOOSE a clip, and using it would animate the reference performance instead of the one the user described. Duration is auto unless durationSeconds is set (ignored by clone modes, which follow the source clip). Async: returns one reaction_video generation per frame to poll; the clip is output.url. Charges per second of video and reports creditsSpent/creditsRemaining.
      PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames. mode picks the family: a CLONE mode (one_to_one_*) copies the motion straight from the source clip and takes no prompt; a PROMPT mode (default seedance_2_0_fast) animates from text and needs a prompt. In PROMPT mode the source template supplied only the first frame — the movement comes from what the USER asked for, so write `prompt` from their words. Never paste the template `motion` text in as the prompt: that field exists to help you CHOOSE a clip, and using it would animate the reference performance instead of the one the user described. Duration is auto unless durationSeconds is set (ignored by clone modes, which follow the source clip). Before setting outputResolution to 1080p, call list_reaction_video_modes and confirm that the chosen mode lists 1080p in supportedResolutions; Seedance 2.0 Fast and Mini are 720p-only. Async: returns one reaction_video generation per frame to poll; the clip is output.url. Charges per second of video and reports creditsSpent/creditsRemaining.
    • WORDINGgenerate_reaction_videoparam description changed: outputResolutionUGC Reactions
      Requested output resolution. Call list_reaction_video_modes first and use the selected mode’s supportedResolutions; Seedance 2.0 Fast and Mini support 720p only.
    • WORDINGlist_reaction_video_modesdescription changedUGC Reactions
      List the video modes for the reaction video phase, with per-second credit cost and whether each needs a prompt or supports audio. Two families: CLONE modes reproduce a template motion (default one_to_one_standard, Kling motion-control, no prompt); PROMPT modes animate the frame from text (default seedance_2_0_fast). Use a clone mode only when the user wants to reproduce the reference video motion.
      List the video modes for the reaction video phase, with per-second credit cost, supported output resolutions, and whether each needs a prompt or supports audio. Two families: CLONE modes reproduce a template motion (default one_to_one_standard, Kling motion-control, no prompt); PROMPT modes animate the frame from text (default seedance_2_0_fast). Use a clone mode only when the user wants to reproduce the reference video motion, and check supportedResolutions before requesting 1080p.

    v5.10.0

    2026-07-27

    `generate_reaction_frames` now accepts an optional `imageOutputResolution`. Agents can request standard output or 1080p frames, and the selected image model's resolution-specific cost is estimated and charged before video generation.

    • ADDEDgenerate_reaction_framesoptional param added: imageOutputResolutionUGC Reactions
    • WORDINGgenerate_reaction_framesdescription changedUGC Reactions
      PHASE 1 of a UGC reaction: render one or more avatars into the source pose, ONE frame per avatar. LIBRARY-FIRST RULE: unless the user explicitly supplied an exact source, call list_reaction_templates first, then list_inspiration_reactions if needed, and use a reasonable library opening-pose match. A custom motion request can still use a library first frame with prompt-mode animation. Use referenceImageUrl only after both Ghostfeed libraries lack a suitable opening pose, and tell the user why the custom fallback was necessary. Source is exactly one of templateId, inspirationId (auto-saved to a template first), or referenceImageUrl. Async: returns one reaction_frame generation per avatar to poll; the finished frame is output.url and output.id is the frameId. Charges the image-model cost per avatar as frames render (gemini_flash unless imageModel is set). STOP after this: show the frame(s) to the user and get approval BEFORE generate_reaction_video, because video credits are far higher.
      PHASE 1 of a UGC reaction: render one or more avatars into the source pose, ONE frame per avatar. LIBRARY-FIRST RULE: unless the user explicitly supplied an exact source, call list_reaction_templates first, then list_inspiration_reactions if needed, and use a reasonable library opening-pose match. A custom motion request can still use a library first frame with prompt-mode animation. Use referenceImageUrl only after both Ghostfeed libraries lack a suitable opening pose, and tell the user why the custom fallback was necessary. Source is exactly one of templateId, inspirationId (auto-saved to a template first), or referenceImageUrl. imageOutputResolution is optional and defaults to standard; set it to 1080p only when the user requests a higher-resolution frame. Async: returns one reaction_frame generation per avatar to poll; the finished frame is output.url and output.id is the frameId. Charges the selected image-model and resolution cost per avatar as frames render (gemini_flash unless imageModel is set). STOP after this: show the frame(s) to the user and get approval BEFORE generate_reaction_video, because video credits are far higher.

    v5.9.0

    2026-07-27

    `generate_reaction_video` now accepts an optional `outputResolution` so agents can request 720p or 1080p explicitly. The spend estimate, reservation, recovery, and settlement use the selected model's resolution-specific rate. The `maxCredits` description now explains that the ceiling is evaluated against the selected model and resolution rather than assuming one universal rate.

    • ADDEDgenerate_reaction_videooptional param added: outputResolutionUGC Reactions
    • WORDINGgenerate_reaction_videoparam description changed: maxCreditsUGC Reactions
      Refuse to start any clip that would cost more than this many credits. Clone modes take their length from the source clip, so a 30s template is 30 credits at 1 credit/second and 60 at 2. A ceiling of MAX_REACTION_VIDEO_CREDITS credits per clip always applies; this only tightens it.
      Refuse to start any clip that would cost more than this many credits. Clone modes use the source clip length and the selected model/resolution rate. A per-clip ceiling of MAX_REACTION_VIDEO_CREDITS always applies; this only tightens it.

    v5.8.0

    2026-07-23

    Reported by a free-plan user whose `create_blank_slideshow` answered `internal_error`, HTTP 500, `retryable: true`. The real cause was ordinary and fixable: "Free plan includes 1 slideshow project. Upgrade for unlimited projects." A 500 tells a well-behaved agent to retry a call that can never succeed, and the scrubbing threw away the one sentence that said how to fix it.

      v5.7.0

      2026-07-22

      Found by reviewing 5.6.0 against the enrichment job that already analyses every clip: the new reaction tools read the same `motionPromptAnalysis` the ingestion pipeline writes, but presented themselves as if that analysis did not exist.

      • WORDINGgenerate_reaction_promptdescription changedUGC Reactions
        Analyze one completed source template into a reusable prompt for a prompt-mode reaction (Seedance, Grok, PixVerse, or Kling). This is the dashboard's “Generate prompt from original template” action: it watches the full source video, returns timed motion guidance plus a compact prompt, and caches the result on the template. Pass that prompt to generate_reaction_video with a prompt mode; do not use it for one_to_one clone modes.
        REPAIR PATH, not the first stop. Every clip is analysed automatically when it is imported, so call get_reaction_template FIRST and use its motionAnalysis.prompt; that read is free. Call this only when motionAnalysis is missing, its status is not "complete", or the source was re-cropped after it was written. It reuses an analysis of the same footage from anywhere in either library when one exists, and otherwise watches the full source video and caches the result on the template. Returns timed motion guidance plus a compact prompt for a prompt-mode reaction (Seedance, Grok, PixVerse, or Kling); pass that prompt to generate_reaction_video. Never needed for one_to_one clone modes.
      • WORDINGget_reaction_templatedescription changedUGC Reactions
        Read one source template by its templateId (or a generated video’s sourceReactionId). Returns the original/source clip, external import URL when present, duration, import type, and the current Gemini motion analysis. Use it after list_reaction_videos to resolve each unique source once, rather than repeating source metadata on every generated video.
        Read one source template by its templateId (or a generated video’s sourceReactionId). Returns the original/source clip, external import URL when present, duration, import type, the full opensOn still description, and the full stored motion analysis. Every clip is analysed automatically on import, so this free read is normally where the complete motionAnalysis.prompt already is. list_reaction_templates only carries a one-line teaser of it. Use it after list_reaction_videos to resolve each unique source once, rather than repeating source metadata on every generated video.
      • WORDINGlist_reaction_videosdescription changedUGC Reactions
        List the reaction VIDEOS in this workspace, newest first, agent-made or not. Each has a videoId, name, stage, a playable videoUrl once stage is "complete", and sourceReactionId when it came from a template. generation is a compact model/mode/duration summary. Call get_reaction_template with sourceReactionId for source media and Gemini analysis, or get_reaction_video for the exact prompt/settings of one rendered video. Managing and deleting videos stays in the dashboard.
        List the reaction VIDEOS in this workspace, newest first, agent-made or not. Each has a videoId, name, stage, a playable videoUrl once stage is "complete", a dashboardUrl, and sourceReactionId when it came from a template. videoUrl is the canonical clip: the post-edit version once one exists, otherwise the raw render. generation is a compact model/mode/duration summary. Rows carry avatarId but not the avatar name; resolve names with list_avatars when you need them. Call get_reaction_template with sourceReactionId for source media and Gemini analysis, or get_reaction_video for the exact prompt/settings of one rendered video. Managing and deleting videos stays in the dashboard.

      v5.6.0

      2026-07-22

      `list_reaction_videos` now returns up to 100 compact generated-video records: the canonical generated `videoUrl`, `sourceReactionId`, and a small model/mode/duration summary. `get_reaction_template` resolves each unique source record (media, original import URL, duration, and cached Gemini analysis), while `get_reaction_video` returns the exact prompt, model, duration, and first-frame settings used for one render. `generate_reaction_prompt` is the dashboard's source-video analysis action over MCP/REST: it returns and caches a prompt for prompt-mode generation; one-to-one motion-control clones continue to need none.

      • ADDEDgenerate_reaction_promptnew toolUGC Reactions
        Analyze one completed source template into a reusable prompt for a prompt-mode reaction (Seedance, Grok, PixVerse, or Kling). This is the dashboard's “Generate prompt from original template” action: it watches the full source video, returns timed motion guidance plus a compact prompt, and caches the result on the template. Pass that prompt to generate_reaction_video with a prompt mode; do not use it for one_to_one clone modes.
      • ADDEDget_reaction_templatenew toolUGC Reactions
        Read one source template by its templateId (or a generated video’s sourceReactionId). Returns the original/source clip, external import URL when present, duration, import type, and the current Gemini motion analysis. Use it after list_reaction_videos to resolve each unique source once, rather than repeating source metadata on every generated video.
      • ADDEDget_reaction_videonew toolUGC Reactions
        Read one reaction video’s full render record after finding it with list_reaction_videos. Returns the canonical generated video URL, sourceReactionId, exact first-frame and video prompts, selected frame, models, duration, and post-edit URL. Call get_reaction_template separately for source media and Gemini analysis. Use this only for videos you need to recreate or inspect in detail; the list stays compact enough to inventory up to 100 videos.
      • WORDINGlist_reaction_videosdescription changedUGC Reactions
        List the reaction VIDEOS in this workspace, newest first, agent-made or not. Each has a videoId, name, stage, the avatar, and a playable videoUrl once stage is "complete". Use it to report what is finished or still rendering. Managing and deleting videos stays in the dashboard.
        List the reaction VIDEOS in this workspace, newest first, agent-made or not. Each has a videoId, name, stage, a playable videoUrl once stage is "complete", and sourceReactionId when it came from a template. generation is a compact model/mode/duration summary. Call get_reaction_template with sourceReactionId for source media and Gemini analysis, or get_reaction_video for the exact prompt/settings of one rendered video. Managing and deleting videos stays in the dashboard.

      v5.3.0

      2026-07-21

      Found by a founder building a Pinterest deck over MCP and reopening it: every slide's search box was blank.

      • ADDEDset_slide_backgroundoptional param added: background.queryStudio
      • ADDEDset_slide_backgroundoptional param added: background.candidateUrlsStudio
      • ADDEDset_slide_backgroundoptional param added: background.candidateUrls[]Studio
      • WORDINGsearch_pinterestdescription changedStudio
        Search Pinterest directly (up to 8 queries, default 12 images each) and get raw image urls back. Search for SCENES, not topics. LOOK at the images yourself before picking - that is the whole point of this tool - then set_slide_background with the winner. Costs no credits.
        Search Pinterest directly (up to 8 queries, default 12 images each) and get raw image urls back. Search for SCENES, not topics. LOOK at the images yourself before picking - that is the whole point of this tool - then set_slide_background with the winner AND the query that found it, so the editor reopens on that search and shuffle can re-run it. Costs no credits.
      • WORDINGset_slide_backgrounddescription changedStudio
        Set one slide's background: a Pinterest url, a collection image, an avatar photo, any image url, or a solid color. For a LOCAL image file, call request_slide_image_upload first, PUT the bytes, then pass the returned fileUrl here as type 'url'. External urls are re-hosted to durable storage automatically. Image picks are gated server-side (browser-displayable, 720px+ short side). The dashboard updates live. If this is the deck's first build edit it charges 1 credit and returns creditsSpent/creditsRemaining.
        Set one slide's background: a Pinterest url, a collection image, an avatar photo, any image url, or a solid color. On a Pinterest pick, pass background.query (the search_pinterest query that found it) so the editor's Pinterest tab reopens on that search. For a LOCAL image file, call request_slide_image_upload first, PUT the bytes, then pass the returned fileUrl here as type 'url'. External urls are re-hosted to durable storage automatically. Image picks are gated server-side (browser-displayable, 720px+ short side). The dashboard updates live. If this is the deck's first build edit it charges 1 credit and returns creditsSpent/creditsRemaining.

      v5.2.2

      2026-07-21

      Found by spending real credits against the rewritten charging path, which unit tests had covered and never exercised.

      • WORDINGgenerate_reaction_framesdescription changedUGC Reactions
        PHASE 1 of a UGC reaction: render one or more avatars into the source pose, ONE frame per avatar. Source is exactly one of templateId, inspirationId (auto-saved to a template first), or referenceImageUrl. Async: returns one reaction_frame generation per avatar to poll; the finished frame is output.url and output.id is the frameId. Charges the image-model cost per avatar as frames render (gemini_flash unless imageModel is set). STOP after this: show the frame(s) to the user and get approval BEFORE generate_reaction_video, because video credits are far higher.
        PHASE 1 of a UGC reaction: render one or more avatars into the source pose, ONE frame per avatar. LIBRARY-FIRST RULE: unless the user explicitly supplied an exact source, call list_reaction_templates first, then list_inspiration_reactions if needed, and use a reasonable library opening-pose match. A custom motion request can still use a library first frame with prompt-mode animation. Use referenceImageUrl only after both Ghostfeed libraries lack a suitable opening pose, and tell the user why the custom fallback was necessary. Source is exactly one of templateId, inspirationId (auto-saved to a template first), or referenceImageUrl. Async: returns one reaction_frame generation per avatar to poll; the finished frame is output.url and output.id is the frameId. Charges the image-model cost per avatar as frames render (gemini_flash unless imageModel is set). STOP after this: show the frame(s) to the user and get approval BEFORE generate_reaction_video, because video credits are far higher.
      • WORDINGlist_inspiration_reactionsdescription changedUGC Reactions
        Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). This is the catalogue to start from when the workspace has no templates of its own. Captioned clips also carry opensOn (the opening still your avatar gets rendered into) and motion (what happens in the clip). These are SELECTION aids: read them to pick a clip and to describe it to the user, never as the prompt for generate_reaction_video. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first.
        SECOND source search for every new reaction request, after list_reaction_templates has no suitable opening pose. Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). Captioned clips also carry opensOn (the opening still your avatar gets rendered into) and motion (what happens in the clip). Choose primarily on opensOn. A prompt-mode video may reuse the opening pose without copying the source motion. Use motion only to judge a requested clone, and never paste it into generate_reaction_video as the prompt. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first. Only fall back to a custom referenceImageUrl after both libraries lack a reasonable match.
      • WORDINGlist_reaction_templatesdescription changedUGC Reactions
        List reaction TEMPLATES (the source motion clips) usable in this workspace: platform stock plus your own imported/uploaded ones. Each has an id, name, category, duration, thumbnail, and status. Captioned clips also carry opensOn (the opening still your avatar gets rendered into) and motion (what happens in the clip); older clips may not have them yet. These are SELECTION aids: read them to pick a clip and to describe it to the user, never as the prompt for generate_reaction_video. Find a templateId here for generate_reaction_frames.
        FIRST source search for every new reaction request unless the user explicitly supplied an exact source. List reaction TEMPLATES usable in this workspace: platform stock plus your own imported/uploaded motion clips. Each has an id, name, category, duration, thumbnail, and status. Captioned clips also carry opensOn (the opening still your avatar gets rendered into) and motion (what happens in the clip); older clips may not have them yet. Choose primarily on opensOn. A prompt-mode video may reuse the opening pose without copying the source motion. Use motion only to judge a requested clone, and never paste it into generate_reaction_video as the prompt. If no template has a reasonable opening-pose match, search list_inspiration_reactions next.

      v5.2.1

      2026-07-21

      Wording that 5.0.0 left behind. Both clip catalogues still told agents to "filter a large library with shotSize and energy" and listed those fields as things a captioned clip carries, for parameters that release removed. The example payloads still showed them too.

      • WORDINGlist_inspiration_reactionsdescription changedUGC Reactions
        Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). This is the catalogue to start from when the workspace has no templates of its own. Captioned clips also carry opensOn (the opening still your avatar gets rendered into), motion (what happens in the clip), shotSize, and energy. These are SELECTION aids: use them to pick a clip and to describe it to the user, never as the prompt for generate_reaction_video. Narrow with shotSize/energy before paging. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first.
        Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). This is the catalogue to start from when the workspace has no templates of its own. Captioned clips also carry opensOn (the opening still your avatar gets rendered into) and motion (what happens in the clip). These are SELECTION aids: read them to pick a clip and to describe it to the user, never as the prompt for generate_reaction_video. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first.
      • WORDINGlist_reaction_templatesdescription changedUGC Reactions
        List reaction TEMPLATES (the source motion clips) usable in this workspace: platform stock plus your own imported/uploaded ones. Each has an id, name, category, duration, thumbnail, and status. Captioned clips also carry opensOn (the opening still your avatar gets rendered into), motion (what happens in the clip), shotSize, and energy; older clips may not have them yet. These are SELECTION aids: use them to pick a clip and to describe it to the user, never as the prompt for generate_reaction_video. Filter a large library with shotSize and energy before paging. Find a templateId here for generate_reaction_frames.
        List reaction TEMPLATES (the source motion clips) usable in this workspace: platform stock plus your own imported/uploaded ones. Each has an id, name, category, duration, thumbnail, and status. Captioned clips also carry opensOn (the opening still your avatar gets rendered into) and motion (what happens in the clip); older clips may not have them yet. These are SELECTION aids: read them to pick a clip and to describe it to the user, never as the prompt for generate_reaction_video. Find a templateId here for generate_reaction_frames.

      v5.2.0

      2026-07-21

      A prioritised defect list, worked top down.

        v5.1.0

        2026-07-21

        `regenerate_reaction_frame` now accepts a `frameId` as well as a `generationId`, and needs exactly one of them.

        • ADDEDregenerate_reaction_frameparam made optional: generationIdUGC Reactions
        • ADDEDregenerate_reaction_frameoptional param added: frameIdUGC Reactions
        • WORDINGregenerate_reaction_framedescription changedUGC Reactions
          Redo the frame of a reaction_frame generation the user was not happy with, by its generationId. Re-runs frame generation on the same avatar + source and charges another frame credit. Poll the same generation until it succeeds with a fresh frame, then get approval before generate_reaction_video.
          Redo a frame the user was not happy with. Identify it with EITHER frameId (any frame from list_reaction_frames, including ones a person made in the dashboard) OR generationId (a frame this API started); pass exactly one. Re-runs frame generation on the same avatar + source and charges another frame credit. Poll the same generation until it succeeds with a fresh frame, then get approval before generate_reaction_video.
        • WORDINGregenerate_reaction_frameparam description changed: generationIdUGC Reactions
          The generationId of a frame you started through the agent API.

        v5.0.0

        2026-07-21

        BREAKING: `shotSize`, `energy` and `holdsProduct` are gone from `list_reaction_templates` and `list_inspiration_reactions`, as fields and as filters. A clip now describes itself with two pieces of prose and nothing else: `opensOn`, the opening still your avatar is rendered into, and `motion`, what happens across the clip.

        v4.10.0

        2026-07-21

        Fixes for defects a paid field test found, where ten agents used the surface with real credits. Every one of these sat at a seam between two tools rather than inside either of them.

        v4.9.1

        2026-07-21

        Three text-heavy lists advertise a smaller maximum page. `list_reaction_templates` caps at 25, `list_products` and `list_generations` at 40, instead of the surface-wide 100. A template row now carries an opening-frame description and a motion summary, a product row carries a 400-character description plus its linked collections, and a generation row echoes its whole input and outputs — so a page of 100 measured 112KB, 80KB and 80KB, against a 60KB ceiling. That is the same context blowup the pagination work was done to prevent, rebuilt by the fields added since.

        • WORDINGlist_generationsparam description changed: limitGenerations
          Per page (max 40; lower than other tools because these rows carry their full input and outputs).
        • WORDINGlist_productsparam description changed: limitLibrary
          Per page (max 100). Each tool documents its own default.
          Per page (max 40; lower than other tools because these rows carry long descriptions). Each tool documents its own default.
        • WORDINGlist_reaction_templatesparam description changed: limitUGC Reactions
          Per page (max 100). Each tool documents its own default.
          Per page (max 25; lower than other tools because these rows carry long descriptions). Each tool documents its own default.

        v4.9.0

        2026-07-21

        `list_reaction_templates` stops offering templates you cannot generate from. Anything still importing, failed, or over 30s awaiting a crop is now hidden by default, because `generate_reaction_frames` refuses those anyway: picking one cost the agent a call and returned an error telling it to go and crop in the dashboard. Pass `includeUnusable` to see them, and the response says how many were hidden.

        v4.8.0

        2026-07-21

        Reaction videos now report what they actually cost, and cannot quietly cost a fortune. `creditsSpent` was measured as the balance before minus the balance after. On a team plan that balance is a single shared pool, so a teammate spending during your call inflated your number, a refund deflated it, and the clamp at zero could report a paid video as free. It is now summed from the price each clip was charged, which was already known before the debit.

        v4.7.0

        2026-07-20

        Paged reads now say where you are, and `list_collection_images` stops under-reporting. It returned `total` as the length of the page it had just handed back, so asking for 5 images from a 200-image collection was answered "total: 5" and an agent reasonably concluded it had seen everything and built the whole deck from those five. The real count was already being computed one call down and discarded. It now reports the collection size and carries `page` and `pages` like every other paged read. `list_slideshows` gained the `page` it was missing alongside its `total` and `pages`.

          v4.6.4

          2026-07-20

          Two import defects found by running the flow as a new user would.

            v4.6.3

            2026-07-20

            Second field-test pass. `list_reaction_video_modes` now flags exactly one mode as `isDefault` — the one you get when `mode` is omitted — with `isFamilyDefault` marking the clone and prompt defaults separately. Flagging both meant an agent that wanted a clone, omitted `mode`, and passed a prompt got prompt-mode Seedance at 1.5 credits per second instead of clone at 1, in the wrong family, with nothing in the response naming which family ran.

            • WORDINGget_generationparam description changed: workspaceGenerations
              Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
            • WORDINGget_slideshowparam description changed: workspaceSlideshows
              Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
            • WORDINGlist_avatar_imagesparam description changed: workspaceStudio
              Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
            • WORDINGlist_avatarsparam description changed: workspaceAvatars
              Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
            • WORDINGlist_collection_imagesparam description changed: workspaceStudio
              Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
            • WORDINGlist_collectionsparam description changed: workspaceLibrary
              Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
            • WORDINGlist_draft_avatarsparam description changed: workspaceAvatars
              Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
            • WORDINGlist_generationsparam description changed: workspaceGenerations
              Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
            • WORDINGlist_inspiration_reactionsparam description changed: workspaceUGC Reactions
              Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
            • WORDINGlist_productsparam description changed: workspaceLibrary
              Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
            • WORDINGlist_reaction_framesparam description changed: workspaceUGC Reactions
              Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
            • WORDINGlist_reaction_templatesparam description changed: workspaceUGC Reactions
              Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
            • WORDINGlist_reaction_videosparam description changed: workspaceUGC Reactions
              Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
            • WORDINGlist_slideshowsparam description changed: workspaceSlideshows
              Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
            • WORDINGread_social_postparam description changed: workspaceStudio
              Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
            • WORDINGsearch_pinterestparam description changed: workspaceStudio
              Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.

            v4.6.2

            2026-07-20

            Fixes from a field test where ten agents used the surface as a new user would.

            • WORDINGget_slideshowparam description changed: limitSlideshows
              Per page (default 50, max 100).
              Per page (max 100). Each tool documents its own default.
            • WORDINGlist_avatar_imagesparam description changed: limitStudio
              Per page (default 50, max 100).
              Per page (max 100). Each tool documents its own default.
            • WORDINGlist_avatarsparam description changed: limitAvatars
              Per page (default 50, max 100).
              Per page (max 100). Each tool documents its own default.
            • WORDINGlist_collection_imagesparam description changed: limitStudio
              Per page (default 50, max 100).
              Per page (max 100). Each tool documents its own default.
            • WORDINGlist_collectionsparam description changed: limitLibrary
              Per page (default 50, max 100).
              Per page (max 100). Each tool documents its own default.
            • WORDINGlist_draft_avatarsparam description changed: limitAvatars
              Per page (default 50, max 100).
              Per page (max 100). Each tool documents its own default.
            • WORDINGlist_inspiration_reactionsparam description changed: limitUGC Reactions
              Per page (default 50, max 100).
              Per page (max 100). Each tool documents its own default.
            • WORDINGlist_productsparam description changed: limitLibrary
              Per page (default 50, max 100).
              Per page (max 100). Each tool documents its own default.
            • WORDINGlist_reaction_framesparam description changed: limitUGC Reactions
              Per page (default 50, max 100).
              Per page (max 100). Each tool documents its own default.
            • WORDINGlist_reaction_templatesparam description changed: limitUGC Reactions
              Per page (default 50, max 100).
              Per page (max 100). Each tool documents its own default.
            • WORDINGlist_reaction_videosparam description changed: limitUGC Reactions
              Per page (default 50, max 100).
              Per page (max 100). Each tool documents its own default.
            • WORDINGlist_slideshowsparam description changed: limitSlideshows
              Per page (default 50, max 100).
              Per page (max 100). Each tool documents its own default.

            v4.6.1

            2026-07-20

            Wording, to state an intent the code already enforced. `opensOn` and `motion` exist so an agent can CHOOSE a clip, and the tool descriptions now say that outright, including that `motion` must never be pasted into `prompt`.

            • WORDINGgenerate_reaction_videodescription changedUGC Reactions
              PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames. mode picks the family: a CLONE mode (one_to_one_*) reproduces the template motion and needs a template-backed frame (no prompt); a PROMPT mode (default seedance_2_0_fast) animates from text and needs a prompt. Duration is auto unless durationSeconds is set (ignored by clone modes, which follow the source clip). Async: returns one reaction_video generation per frame to poll; the clip is output.url. Charges per second of video and reports creditsSpent/creditsRemaining.
              PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames. mode picks the family: a CLONE mode (one_to_one_*) copies the motion straight from the source clip and takes no prompt; a PROMPT mode (default seedance_2_0_fast) animates from text and needs a prompt. In PROMPT mode the source template supplied only the first frame — the movement comes from what the USER asked for, so write `prompt` from their words. Never paste the template `motion` text in as the prompt: that field exists to help you CHOOSE a clip, and using it would animate the reference performance instead of the one the user described. Duration is auto unless durationSeconds is set (ignored by clone modes, which follow the source clip). Async: returns one reaction_video generation per frame to poll; the clip is output.url. Charges per second of video and reports creditsSpent/creditsRemaining.
            • WORDINGlist_inspiration_reactionsdescription changedUGC Reactions
              Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). This is the catalogue to start from when the workspace has no templates of its own. Captioned clips also carry opensOn (the opening still your avatar gets rendered into), motion (what happens in the clip), shotSize, and energy, so pick on those rather than the name, and narrow with shotSize/energy before paging. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first.
              Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). This is the catalogue to start from when the workspace has no templates of its own. Captioned clips also carry opensOn (the opening still your avatar gets rendered into), motion (what happens in the clip), shotSize, and energy. These are SELECTION aids: use them to pick a clip and to describe it to the user, never as the prompt for generate_reaction_video. Narrow with shotSize/energy before paging. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first.
            • WORDINGlist_reaction_templatesdescription changedUGC Reactions
              List reaction TEMPLATES (the source motion clips) usable in this workspace: platform stock plus your own imported/uploaded ones. Each has an id, name, category, duration, thumbnail, and status. Captioned clips also carry opensOn (the opening still your avatar gets rendered into), motion (what happens in the clip), shotSize, and energy, so pick on those rather than guessing from the name; older clips may not have them yet. Filter a large library with shotSize and energy before paging. Find a templateId here for generate_reaction_frames.
              List reaction TEMPLATES (the source motion clips) usable in this workspace: platform stock plus your own imported/uploaded ones. Each has an id, name, category, duration, thumbnail, and status. Captioned clips also carry opensOn (the opening still your avatar gets rendered into), motion (what happens in the clip), shotSize, and energy; older clips may not have them yet. These are SELECTION aids: use them to pick a clip and to describe it to the user, never as the prompt for generate_reaction_video. Filter a large library with shotSize and energy before paging. Find a templateId here for generate_reaction_frames.

            v4.6.0

            2026-07-20

            The curated inspiration library is now described too, which matters more for a new account than the template library does. A fresh workspace owns no templates, so `list_inspiration_reactions` IS the catalogue you start from, and it was returning names and thumbnails only. 4.5.0 gave templates `opensOn` and `motion` while leaving the surface a first-time user actually reaches untouched.

            • ADDEDlist_inspiration_reactionsoptional param added: shotSizeUGC Reactions
            • ADDEDlist_inspiration_reactionsoptional param added: energyUGC Reactions
            • WORDINGlist_inspiration_reactionsdescription changedUGC Reactions
              Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first.
              Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). This is the catalogue to start from when the workspace has no templates of its own. Captioned clips also carry opensOn (the opening still your avatar gets rendered into), motion (what happens in the clip), shotSize, and energy, so pick on those rather than the name, and narrow with shotSize/energy before paging. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first.

            v4.5.1

            2026-07-20

            Wording only. `list_collections` was already returning `summary`, one line saying what a collection's images actually show, distilled from their AI captions. Nothing declared it or mentioned it, so agents kept choosing collections from a name and a count, which is the exact guessing the summaries exist to remove. A folder called "August" tells you nothing; "62 lifestyle shots of a woman in athleisure in bright home interiors" tells you whether to open it. The field is now named in the response type and the description tells the agent to read it before opening a collection.

            • WORDINGlist_collectionsdescription changedLibrary
              List the workspace's image collections (the user's own saved images): id, name, image count, and dashboardUrl. To feature a collection's images in a deck, browse it with list_collection_images and cast the ones you want with set_slide_background (type collection). Call this BEFORE building a deck that should feature the user's own images.
              List the workspace's image collections (the user's own saved images): id, name, image count, dashboardUrl, and summary, one line saying what the images actually show. Read the summary to pick which collection is worth opening rather than guessing from its name, then browse that one with list_collection_images and cast the images you want with set_slide_background (type collection). Call this BEFORE building a deck that should feature the user's own images.

            v4.5.0

            2026-07-20

            The agent can see what a reaction clip actually looks like. `list_reaction_templates` used to return a name, a category and a duration, and its own description admitted the agent could not watch the motion, so choosing a template meant guessing from a title. Half the library's titles were the creator's scraped caption, which for one real template read in full as "this dress is so prettyyy".

            • ADDEDlist_reaction_templatesoptional param added: shotSizeUGC Reactions
            • ADDEDlist_reaction_templatesoptional param added: energyUGC Reactions
            • WORDINGlist_reaction_templatesdescription changedUGC Reactions
              List reaction TEMPLATES (the source motion clips) usable in this workspace: platform stock plus your own imported/uploaded ones. Each has an id, name, category, duration, thumbnail, and status. You cannot watch the motion, so describe it from name/category if the user must choose. Find a templateId here for generate_reaction_frames.
              List reaction TEMPLATES (the source motion clips) usable in this workspace: platform stock plus your own imported/uploaded ones. Each has an id, name, category, duration, thumbnail, and status. Captioned clips also carry opensOn (the opening still your avatar gets rendered into), motion (what happens in the clip), shotSize, and energy, so pick on those rather than guessing from the name; older clips may not have them yet. Filter a large library with shotSize and energy before paging. Find a templateId here for generate_reaction_frames.

            v4.4.0

            2026-07-20

            Every list tool can now be asked for a page. A worked avatar accumulates one image per reaction frame ever rendered, and `list_avatar_images` returned all of them at once: 254 images came back as a 96KB response that buried an agent's context outright, mid-task. It now returns 30 per page with `total` and `pages`, and it captions only the page it hands back rather than the whole pool.

            • ADDEDget_slideshowoptional param added: variantSlideshows
            • ADDEDget_slideshowoptional param added: pageSlideshows
            • ADDEDget_slideshowoptional param added: limitSlideshows
            • ADDEDlist_avatar_imagesoptional param added: pageStudio
            • ADDEDlist_avatar_imagesoptional param added: limitStudio
            • ADDEDlist_collection_imagesoptional param added: limitStudio
            • ADDEDlist_collectionsoptional param added: pageLibrary
            • ADDEDlist_collectionsoptional param added: limitLibrary
            • ADDEDlist_generationsoptional param added: pageGenerations
            • ADDEDlist_productsoptional param added: pageLibrary
            • ADDEDlist_productsoptional param added: limitLibrary
            • WORDINGlist_avatar_imagesdescription changedStudio
              List a saved avatar's generated photos (urls + captions). Reusing them is free; use set_slide_background type 'avatar' to cast one.
              List a saved avatar's generated photos (urls + captions), newest first, 30 per page. A worked avatar can hold hundreds, so this is paged: read total/pages and ask for the next page rather than expecting everything at once. The captions describe each shot, so use them to pick a specific pose or framing — that is how you cast a first frame for generate_reaction_frames via referenceImageUrl. Reusing them is free; use set_slide_background type 'avatar' to cast one.
            • WORDINGlist_collection_imagesparam description changed: pageStudio
              Page number (default 1, 30 per page).
              Page number (default 1).

            v4.3.1

            2026-07-20

            Wording only. `list_reaction_frames` advertised a `hasVideo` field it no longer returns. Every frame is created inside a video shell, so that flag was true for every frame and told an agent nothing. The description now names what the tool actually returns: `videoStage`, and `isAnimated`, which is false when nothing has been animated from that frame yet and it is free to use.

            • WORDINGlist_reaction_framesdescription changedUGC Reactions
              List the reaction FRAMES on the workspace board, newest first, including ones a person made in the dashboard rather than through an agent. Each has a frameId, image, the avatar it used, its source template, and hasVideo. Use this to act on existing work: "animate the frame I made this morning" starts here, then pass the frameId to generate_reaction_video.
              List the reaction FRAMES on the workspace board, newest first, including ones a person made in the dashboard rather than through an agent. Each has a frameId, image, the avatar it used, its source template, the videoStage of the shell it lives in, and isAnimated (false means nothing has been animated from it yet, so it is free to use). Use this to act on existing work: "animate the frame I made this morning" starts here, then pass the frameId to generate_reaction_video.

            v4.3.0

            2026-07-20

            Agents can now see reaction work they did not start. `list_reaction_frames` and `list_reaction_videos` read the workspace board itself rather than the agent's own ledger, so frames and clips a person made in the dashboard are visible too. That closes the gap behind a very ordinary request: animate the frame I made this morning. Frames come back with the avatar and source template that produced them and whether a video was already started; videos come back with their stage and a playable url once finished. Managing and deleting still live in the dashboard.

            • ADDEDlist_reaction_framesnew toolUGC Reactions
              List the reaction FRAMES on the workspace board, newest first, including ones a person made in the dashboard rather than through an agent. Each has a frameId, image, the avatar it used, its source template, and hasVideo. Use this to act on existing work: "animate the frame I made this morning" starts here, then pass the frameId to generate_reaction_video.
            • ADDEDlist_reaction_videosnew toolUGC Reactions
              List the reaction VIDEOS in this workspace, newest first, agent-made or not. Each has a videoId, name, stage, the avatar, and a playable videoUrl once stage is "complete". Use it to report what is finished or still rendering. Managing and deleting videos stays in the dashboard.

            v4.2.0

            2026-07-20

            Agents can put a local image on a slide. `request_slide_image_upload` mints a short-lived presigned R2 URL for a local image file, the same supply-chain shape as `request_reaction_upload`: PUT the raw bytes straight to storage (never as a tool argument), then `set_slide_background` with type `url` and the returned `fileUrl`. `set_slide_background` also gained durability on plain image urls: an external `url` background is now re-hosted to our storage automatically, so a slide never points at a link that can rot, while Pinterest picks keep their `pinterest` provenance and images already on our storage pass through untouched.

            • ADDEDrequest_slide_image_uploadnew toolStudio
              Get a short-lived presigned R2 upload URL for a LOCAL image file (too large to pass as a tool argument). PUT the raw bytes to uploadUrl with the given Content-Type, then call set_slide_background with background.type "url" and background.url = the returned fileUrl. Costs no credits.
            • WORDINGset_slide_backgrounddescription changedStudio
              Set one slide's background: a Pinterest url, a collection image, an avatar photo, any image url, or a solid color. Image picks are gated server-side (browser-displayable, 720px+ short side). The dashboard updates live. If this is the deck's first build edit it charges 1 credit and returns creditsSpent/creditsRemaining.
              Set one slide's background: a Pinterest url, a collection image, an avatar photo, any image url, or a solid color. For a LOCAL image file, call request_slide_image_upload first, PUT the bytes, then pass the returned fileUrl here as type 'url'. External urls are re-hosted to durable storage automatically. Image picks are gated server-side (browser-displayable, 720px+ short side). The dashboard updates live. If this is the deck's first build edit it charges 1 credit and returns creditsSpent/creditsRemaining.
            • WORDINGset_slide_backgroundparam description changed: background.typeStudio
              Where this background comes from. 'pinterest' = a url from search_pinterest; 'collection'/'avatar' = a url from the matching list tool (id required); 'url' = any other image url; 'color' = solid background.
              Where this background comes from. 'pinterest' = a url from search_pinterest; 'collection'/'avatar' = a url from the matching list tool (id required); 'url' = any other image url, INCLUDING a fileUrl from request_slide_image_upload (an external url is re-hosted to durable storage automatically); 'color' = solid background. To use a LOCAL image file, call request_slide_image_upload first, PUT the bytes, then set type 'url' with the returned fileUrl.
            • WORDINGset_slide_backgroundparam description changed: background.urlStudio
              The image url (all types except color).
              The image url (types 'pinterest'/'collection'/'avatar'/'url').

            v4.1.0

            2026-07-19

            UGC reactions come to the agent surface: create reaction videos over chat instead of clicking through the dashboard, following the exact two-phase flow the app already uses. Eight tools ship in a new UGC Reactions group. The supply chain first: `import_reaction_template` turns a TikTok/Instagram link, a local file (uploaded to a presigned URL from `request_reaction_upload`), or a curated `list_inspiration_reactions` clip into a workspace template, with one uniform rule on every path (a clip up to 30s is ready immediately; 30 to 120s imports in full but must be cropped in the dashboard first; longer is rejected). Then the two phases: `generate_reaction_frames` renders one or more avatars into the source pose, one frame per avatar, and `generate_reaction_video` animates an approved frame, either cloning the reference motion (default `one_to_one_standard`, Kling motion-control) or from a text prompt (default `seedance_2_0_fast`). `regenerate_reaction_frame` redoes a weak frame; `list_reaction_templates` and `list_reaction_video_modes` are the discovery reads. The frame is a deliberate checkpoint: the tools and the skill push the agent to show it and get the user's approval before spending the far larger video credits. Reaction work is async and polled through the existing `get_generation` ledger, which gains three kinds (`reaction_import`, `reaction_frame`, `reaction_video`); a 30 to 120s import surfaces as `needs_action` until cropped. Bulk creation only. Managing, cropping, and deleting templates and videos all stay in the dashboard, the same human-in-the-loop line the delete removal in 4.0.0 drew.

            • ADDEDgenerate_reaction_framesnew toolUGC Reactions
              PHASE 1 of a UGC reaction: render one or more avatars into the source pose, ONE frame per avatar. Source is exactly one of templateId, inspirationId (auto-saved to a template first), or referenceImageUrl. Async: returns one reaction_frame generation per avatar to poll; the finished frame is output.url and output.id is the frameId. Charges the image-model cost per avatar as frames render (gemini_flash unless imageModel is set). STOP after this: show the frame(s) to the user and get approval BEFORE generate_reaction_video, because video credits are far higher.
            • ADDEDgenerate_reaction_videonew toolUGC Reactions
              PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames. mode picks the family: a CLONE mode (one_to_one_*) reproduces the template motion and needs a template-backed frame (no prompt); a PROMPT mode (default seedance_2_0_fast) animates from text and needs a prompt. Duration is auto unless durationSeconds is set (ignored by clone modes, which follow the source clip). Async: returns one reaction_video generation per frame to poll; the clip is output.url. Charges per second of video and reports creditsSpent/creditsRemaining.
            • ADDEDimport_reaction_templatenew toolUGC Reactions
              Import a reaction TEMPLATE from exactly one source: sourceUrl (a TikTok/Instagram link), uploadedFileUrl (from request_reaction_upload, the local-file path), or inspirationId (a curated clip). Async: returns a reaction_import generation to poll with get_generation. succeeded = ready to use; needs_action = the source is 30-120s and must be cropped in the dashboard first (open dashboardUrl); >120s is rejected. Costs no credits. Managing, cropping, and deleting templates all happen in the dashboard.
            • ADDEDlist_inspiration_reactionsnew toolUGC Reactions
              Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first.
            • ADDEDlist_reaction_templatesnew toolUGC Reactions
              List reaction TEMPLATES (the source motion clips) usable in this workspace: platform stock plus your own imported/uploaded ones. Each has an id, name, category, duration, thumbnail, and status. You cannot watch the motion, so describe it from name/category if the user must choose. Find a templateId here for generate_reaction_frames.
            • ADDEDlist_reaction_video_modesnew toolUGC Reactions
              List the video modes for the reaction video phase, with per-second credit cost and whether each needs a prompt or supports audio. Two families: CLONE modes reproduce a template motion (default one_to_one_standard, Kling motion-control, no prompt); PROMPT modes animate the frame from text (default seedance_2_0_fast). Use a clone mode only when the user wants to reproduce the reference video motion.
            • ADDEDregenerate_reaction_framenew toolUGC Reactions
              Redo the frame of a reaction_frame generation the user was not happy with, by its generationId. Re-runs frame generation on the same avatar + source and charges another frame credit. Poll the same generation until it succeeds with a fresh frame, then get approval before generate_reaction_video.
            • ADDEDrequest_reaction_uploadnew toolUGC Reactions
              Get a short-lived presigned R2 upload URL for a LOCAL video file (a video is too large for a tool argument). PUT the raw bytes to uploadUrl with the given Content-Type, then pass the returned fileUrl to import_reaction_template as uploadedFileUrl. Costs no credits.
            • ADDEDlist_generationsenum values added to kind: reaction_import, reaction_frame, reaction_videoGenerations

            v4.0.0

            2026-07-19

            Agents can no longer delete library objects. Founder ruling: an agent over the public API creates and organizes, but destroying content stays a human decision in the dashboard. `delete_draft_avatar` is REMOVED from the agent surface entirely, its MCP tool and its `DELETE /avatars/drafts/:id` REST twin both gone. This is the breaking removal behind the major bump. Draft avatars are now resolved one of two ways: approve the ones to keep with `approve_avatar`, and manage or discard the rest from the dashboard. The `create_avatar` and `list_draft_avatars` guidance now says exactly that. Nothing else about the avatar flow changes: drafts still never enter the library without human approval, and the underlying dashboard delete path is untouched. Note the in-session build primitive `remove_slide` is NOT a delete of a library object (it edits an in-progress deck) and is unaffected.

            • BREAKINGdelete_draft_avatartool removed

            v3.0.1

            2026-07-19

            Dogfood fixes. `create_variant` now tells the truth about what it is: a COPY of the base deck that YOU must differentiate, re-casting a fresh image and rewriting the copy on each slide the same way the dashboard's Director shuffles a variant. Four behavior fixes, no schema changes: `create_avatar` with an `idempotencyKey` is now truly idempotent (a same-key retry returns the ORIGINAL drafts with `creditsSpent: 0` instead of generating new avatars and mis-reporting a charge); a first Studio build edit that fails its image gate no longer charges silently (validation runs before the charge, so the credit lands only on the first edit that actually applies and always reports `creditsSpent`/`creditsRemaining`); agent-built decks now stamp `createdVia: "mcp"`; and the avatar auto-namer is heritage-aware (no more "Kenji Park" for a South Asian persona).

            • WORDINGcreate_variantdescription changedStudio
              Add a variant to a slideshow: a COPY of the base deck you then tweak into an A/B version by passing its variantIndex to set_slide_background / set_slide_texts. Costs 1 credit (same as a dashboard-generated variant); returns the new variantIndex and creditsSpent/creditsRemaining. Editing the variant afterwards is free.
              Add a variant to a slideshow: a COPY of the base deck, returned with a new variantIndex. Differentiate it the same way the dashboard shuffles variants, by passing that variantIndex to set_slide_background / set_slide_texts per slide: re-cast a FRESH image on each slide (search_pinterest + a new pick for Pinterest slides; a different image from the same collection/avatar for those) and REWRITE the copy. Keep uploaded, plain-url, and AI-generated images as-is. Costs 1 credit (same as a dashboard-generated variant); returns creditsSpent/creditsRemaining. Editing the variant afterwards is free.

            v3.0.0

            2026-07-19

            Slideshow creation on MCP is now the agent's own hand-build via Studio, not the server's one-shot composer. The founder thesis taken to its conclusion: a frontier harness out-sees the server's small vision model, so it art-directs the deck itself. `create_slideshow` (the one-shot prompt/remix composer) is REMOVED from the agent surface and stays a dashboard-only convenience; this is the breaking change behind the major bump. In its place the agent has every creation surface, all at the same dashboard-parity price of 1 credit per deck or variant: build from an idea with the Studio tools; remix a TikTok or Instagram post with the new `read_social_post` (it scrapes the source; you hand-build the remix); and make A/B variants with the new `create_variant` (a copy of the base you then tweak). Every Studio build op gains an optional `variantIndex` so you can target a specific variant. The 1-credit charge lands on the first real build edit (never the empty blank deck), is idempotent per deck, and reports `creditsSpent`/`creditsRemaining`. `list_collections` and `list_products` guidance now points at the Studio cast path.

            • BREAKINGcreate_slideshowtool removed
            • ADDEDcreate_variantnew toolStudio
              Add a variant to a slideshow: a COPY of the base deck you then tweak into an A/B version by passing its variantIndex to set_slide_background / set_slide_texts. Costs 1 credit (same as a dashboard-generated variant); returns the new variantIndex and creditsSpent/creditsRemaining. Editing the variant afterwards is free.
            • ADDEDread_social_postnew toolStudio
              Read a TikTok Photo Mode or Instagram carousel post so YOU can remix it: returns the caption, slide count, and each slide image url. This is the SOURCE, not a deck. There is no server-side remix; LOOK at the images, then create_blank_slideshow and hand-build - write your own copy in the same structure and cast fresh images. Costs no credits (the deck costs 1 credit on your first build edit).
            • ADDEDadd_slideoptional param added: variantIndexStudio
            • ADDEDremove_slideoptional param added: variantIndexStudio
            • ADDEDreorder_slidesoptional param added: variantIndexStudio
            • ADDEDset_captionoptional param added: variantIndexStudio
            • ADDEDset_slide_backgroundoptional param added: variantIndexStudio
            • ADDEDset_slide_textsoptional param added: variantIndexStudio
            • WORDINGcreate_blank_slideshowdescription changedStudio
              Create an empty slideshow with N blank slides, ready to be built slide by slide with set_slide_background and set_slide_texts. Use when YOU are doing the creative work; use create_slideshow when the server-side Director should. Costs no credits.
              Create an empty slideshow with N blank slides, then build it slide by slide with set_slide_background and set_slide_texts. This is how an agent creates a deck: YOU do the creative work. The empty deck is free; the deck costs 1 credit, charged on your first set_slide_background or set_slide_texts (same price as a dashboard-made deck). Later edits are free.
            • WORDINGget_slideshowdescription changedSlideshows
              Read a slideshow's full anatomy: every variant with status, caption, and per-slide texts + background image url + provenance (backgroundSource: ai | pinterest | collection | avatar | image). Use it to review what was generated; for the visually composed slides (text on image), send the user the dashboardUrl.
              Read a slideshow's full anatomy: every variant with status, caption, and per-slide texts + background image url + provenance (backgroundSource: ai | pinterest | collection | avatar | image). Variant status is pending | processing | ready | failed (the generation ledger maps ready to succeeded, pending to queued, processing to running). Use it to review what was generated; for the visually composed slides (text on image), send the user the dashboardUrl.
            • WORDINGget_slideshowparam description changed: slideshowIdSlideshows
              The slideshow (project) id from create_slideshow or list_slideshows.
              The slideshow (project) id from list_slideshows or create_blank_slideshow.
            • WORDINGlist_collectionsdescription changedLibrary
              List the workspace's image collections (the user's own saved images): id, name, image count, and dashboardUrl. Pass an id as create_slideshow collectionId to mention that collection — mentioning is the ONLY way the user's own images enter a slideshow's casting (its images then contend where they fit; products carry their own photo collections via linkedCollections). Call this BEFORE creating a slideshow that should feature the user's own images.
              List the workspace's image collections (the user's own saved images): id, name, image count, and dashboardUrl. To feature a collection's images in a deck, browse it with list_collection_images and cast the ones you want with set_slide_background (type collection). Call this BEFORE building a deck that should feature the user's own images.
            • WORDINGlist_productsdescription changedLibrary
              List the workspace's registered products: id, name, description, url, dashboardUrl, and linkedCollections (the product's OWN photo collections, each with its own dashboardUrl). Pass an id as create_slideshow productId to weave that product into ONE slide in a soft peer-recommendation voice; for hand-built decks, browse a linked collection with list_collection_images and cast a real product image on the product slide. Call this BEFORE creating a slideshow that should plug a product.
              List the workspace's registered products: id, name, description, url, dashboardUrl, and linkedCollections (the product's OWN photo collections, each with its own dashboardUrl). To plug a product, weave it into ONE slide in a soft peer-recommendation voice: browse a linked collection with list_collection_images and cast a real product image on that slide with set_slide_background. Call this BEFORE building a deck that should plug a product.
            • WORDINGset_slide_backgrounddescription changedStudio
              Set one slide's background: a Pinterest url, a collection image, an avatar photo, any image url, or a solid color. Image picks are gated server-side (browser-displayable, 720px+ short side). The dashboard updates live.
              Set one slide's background: a Pinterest url, a collection image, an avatar photo, any image url, or a solid color. Image picks are gated server-side (browser-displayable, 720px+ short side). The dashboard updates live. If this is the deck's first build edit it charges 1 credit and returns creditsSpent/creditsRemaining.
            • WORDINGset_slide_textsdescription changedStudio
              Replace one slide's text boxes (1-5 texts with placement top/center/bottom and role heading/subheading/body/cta - role sets the font size, positions are computed server-side exactly like the dashboard). Optionally mark isProductSlide.
              Replace one slide's text boxes (1-5 texts with placement top/center/bottom and role heading/subheading/body/cta - role sets the font size, positions are computed server-side exactly like the dashboard). Optionally mark isProductSlide. If this is the deck's first build edit it charges 1 credit and returns creditsSpent/creditsRemaining.

            v2.2.0

            2026-07-17

            REST is now a true transport twin of MCP. All 28 public operations are available under `/api/v2`, including workspaces, credits, transactions, library discovery, image browsing, Pinterest search, blank-deck creation, and every granular Studio edit. One canonical operation manifest drives generated REST references and a bidirectional CI gate: an MCP-only tool, a REST-only endpoint, or an undocumented method/path change now fails before merge.

            • ADDEDadd_slideREST endpoint added: POST /slideshows/:slideshowId/slidesStudio
            • ADDEDapprove_avatarREST endpoint added: POST /avatars/:id/approveAvatars
            • ADDEDcreate_avatarREST endpoint added: POST /avatarsAvatars
            • ADDEDcreate_blank_slideshowREST endpoint added: POST /slideshows/blankStudio
            • ADDEDcreate_slideshowREST endpoint added: POST /slideshowsSlideshows
            • ADDEDdelete_draft_avatarREST endpoint added: DELETE /avatars/drafts/:idAvatars
            • ADDEDget_creditsREST endpoint added: GET /creditsCore
            • ADDEDget_generationREST endpoint added: GET /generations/:idGenerations
            • ADDEDget_meREST endpoint added: GET /meCore
            • ADDEDget_slideshowREST endpoint added: GET /slideshows/:idSlideshows
            • ADDEDlist_avatar_imagesREST endpoint added: GET /avatars/:avatarId/imagesStudio
            • ADDEDlist_avatarsREST endpoint added: GET /avatarsAvatars
            • ADDEDlist_collection_imagesREST endpoint added: GET /collections/:collectionId/imagesStudio
            • ADDEDlist_collectionsREST endpoint added: GET /collectionsLibrary
            • ADDEDlist_draft_avatarsREST endpoint added: GET /avatars/draftsAvatars
            • ADDEDlist_generationsREST endpoint added: GET /generationsGenerations
            • ADDEDlist_image_modelsREST endpoint added: GET /image-modelsAvatars
            • ADDEDlist_productsREST endpoint added: GET /productsLibrary
            • ADDEDlist_slideshowsREST endpoint added: GET /slideshowsSlideshows
            • ADDEDlist_transactionsREST endpoint added: GET /transactionsCore
            • ADDEDlist_workspacesREST endpoint added: GET /workspacesCore
            • ADDEDremove_slideREST endpoint added: DELETE /slideshows/:slideshowId/slides/:slideIndexStudio
            • ADDEDrename_avatarREST endpoint added: PATCH /avatars/:idAvatars
            • ADDEDreorder_slidesREST endpoint added: PUT /slideshows/:slideshowId/slides/orderStudio
            • ADDEDsearch_pinterestREST endpoint added: POST /pinterest/searchStudio
            • ADDEDset_captionREST endpoint added: PUT /slideshows/:slideshowId/captionStudio
            • ADDEDset_slide_backgroundREST endpoint added: PUT /slideshows/:slideshowId/slides/:slideIndex/backgroundStudio
            • ADDEDset_slide_textsREST endpoint added: PUT /slideshows/:slideshowId/slides/:slideIndex/textsStudio
            • WORDINGcreate_blank_slideshowdescription changedStudio
              Create an empty slideshow with N blank slides, ready to be built slide by slide with set_slide_background and set_slide_texts. Use when YOU are doing the creative work; use create_slideshow when the server pipeline should. Costs no credits.
              Create an empty slideshow with N blank slides, ready to be built slide by slide with set_slide_background and set_slide_texts. Use when YOU are doing the creative work; use create_slideshow when the server-side Director should. Costs no credits.
            • WORDINGcreate_slideshowdescription changedSlideshows
              Create a TikTok photo slideshow from a prompt OR by remixing a TikTok/Instagram post url (exactly one). The server pipeline writes the slide copy, searches Pinterest, and a taste-tuned vision judge casts each background from the Pinterest results plus any collections the brief mentions (weak batches trigger one automatic re-search). Collections are never used unless mentioned via collectionId or a product's linked photos. Costs no credits. ASYNC: returns a gen_ id immediately; poll get_generation until terminal (typically 1-3 minutes), then read the result with get_slideshow. Free plan allows 1 project.
              Create a TikTok photo slideshow from a prompt OR by remixing a TikTok/Instagram post url (exactly one). The server's Director engine composes the deck in one agentic loop: it writes the slide copy, searches Pinterest, looks at the candidate images, and casts each background from what it saw plus any collections the brief mentions. It repairs its own gaps before finishing; if it cannot finish, the generation reports failed honestly instead of shipping a broken deck. Collections are never used unless mentioned via collectionId or a product's linked photos. Costs no credits. ASYNC: returns a gen_ id immediately; poll get_generation until terminal (typically 1-3 minutes), then read the result with get_slideshow. Free plan allows 1 project.
            • WORDINGcreate_slideshowparam description changed: promptSlideshows
              Describe the slideshow: topic, angle, audience. The pipeline writes the slide copy and casts the images. Exactly one of prompt or sourceUrl.
              Describe the slideshow: topic, angle, audience. The Director engine writes the slide copy and casts the images. Exactly one of prompt or sourceUrl.
            • WORDINGcreate_slideshowparam description changed: sourceUrlSlideshows
              A TikTok Photo Mode or Instagram post URL to remix: the pipeline rewrites the copy in the same structure and re-casts every image. Exactly one of prompt or sourceUrl.
              A TikTok Photo Mode or Instagram post URL to remix: the Director rewrites the copy in the same structure and casts entirely new images. Exactly one of prompt or sourceUrl.

            v2.1.0

            2026-07-17

            Library results now open what they name. `list_collections` returns a workspace-qualified `dashboardUrl` for every collection, while `list_products` returns one for every product and each linked collection. Product links land on a stable `/w/<slug>/products/<id>` route whose edit dialog survives refresh, login, and browser history.

            • WORDINGlist_collectionsdescription changedLibrary
              List the workspace's image collections (the user's own saved images): id, name, image count. Pass an id as create_slideshow collectionId to mention that collection — mentioning is the ONLY way the user's own images enter a slideshow's casting (its images then contend where they fit; products carry their own photo collections via linkedCollections). Call this BEFORE creating a slideshow that should feature the user's own images.
              List the workspace's image collections (the user's own saved images): id, name, image count, and dashboardUrl. Pass an id as create_slideshow collectionId to mention that collection — mentioning is the ONLY way the user's own images enter a slideshow's casting (its images then contend where they fit; products carry their own photo collections via linkedCollections). Call this BEFORE creating a slideshow that should feature the user's own images.
            • WORDINGlist_productsdescription changedLibrary
              List the workspace's registered products: id, name, description, url, and linkedCollections (the product's OWN photo collections). Pass an id as create_slideshow productId to weave that product into ONE slide in a soft peer-recommendation voice; for hand-built decks, browse a linked collection with list_collection_images and cast a real product image on the product slide. Call this BEFORE creating a slideshow that should plug a product.
              List the workspace's registered products: id, name, description, url, dashboardUrl, and linkedCollections (the product's OWN photo collections, each with its own dashboardUrl). Pass an id as create_slideshow productId to weave that product into ONE slide in a soft peer-recommendation voice; for hand-built decks, browse a linked collection with list_collection_images and cast a real product image on the product slide. Call this BEFORE creating a slideshow that should plug a product.

            v2.0.0

            2026-07-17

            Workspace intent is now deterministic. Every credential pins one default workspace for reads at consent time, while every workspace-scoped write must name its target explicitly. Dashboard links carry the workspace in the path (`/w/<slug>/...`), and dashboard navigation can no longer retarget an MCP connection behind the user's back. This is a clean development reset: reconnect existing MCP clients at `/api/v2/mcp`; v1 credentials and endpoints are not migrated.

            • BREAKINGadd_slideparam made required: workspaceStudio
            • BREAKINGapprove_avatarparam made required: workspaceAvatars
            • BREAKINGcreate_avatarparam made required: workspaceAvatars
            • BREAKINGcreate_blank_slideshowparam made required: workspaceStudio
            • BREAKINGcreate_slideshowparam made required: workspaceSlideshows
            • BREAKINGdelete_draft_avatarparam made required: workspaceAvatars
            • BREAKINGremove_slideparam made required: workspaceStudio
            • BREAKINGrename_avatarparam made required: workspaceAvatars
            • BREAKINGreorder_slidesparam made required: workspaceStudio
            • BREAKINGset_captionparam made required: workspaceStudio
            • BREAKINGset_slide_backgroundparam made required: workspaceStudio
            • BREAKINGset_slide_textsparam made required: workspaceStudio
            • WORDINGadd_slideparam description changed: workspaceStudio
              Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.
            • WORDINGapprove_avatarparam description changed: workspaceAvatars
              Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.
            • WORDINGcreate_avatarparam description changed: workspaceAvatars
              Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.
            • WORDINGcreate_blank_slideshowparam description changed: workspaceStudio
              Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.
            • WORDINGcreate_slideshowdescription changedSlideshows
              Create a TikTok photo slideshow from a prompt OR by remixing a TikTok/Instagram post url (exactly one). The server pipeline writes the slide copy, searches Pinterest, and a taste-tuned vision judge casts each background from the Pinterest results plus the project's pinned collection (weak batches trigger one automatic re-search). Collections are never used unless pinned via collectionId or a product's linked photos. Costs no credits. ASYNC: returns a gen_ id immediately; poll get_generation until terminal (typically 1-3 minutes), then read the result with get_slideshow. Free plan allows 1 project.
              Create a TikTok photo slideshow from a prompt OR by remixing a TikTok/Instagram post url (exactly one). The server pipeline writes the slide copy, searches Pinterest, and a taste-tuned vision judge casts each background from the Pinterest results plus any collections the brief mentions (weak batches trigger one automatic re-search). Collections are never used unless mentioned via collectionId or a product's linked photos. Costs no credits. ASYNC: returns a gen_ id immediately; poll get_generation until terminal (typically 1-3 minutes), then read the result with get_slideshow. Free plan allows 1 project.
            • WORDINGcreate_slideshowparam description changed: workspaceSlideshows
              Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.
            • WORDINGdelete_draft_avatarparam description changed: workspaceAvatars
              Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.
            • WORDINGget_medescription changedCore
              Who am I, which workspace am I pointed at, and what does my credential allow. Call this first. credential.workspaceScope "all" means every workspace you can currently access (grantedWorkspaceIds stays empty); "listed" pins the credential to exactly grantedWorkspaceIds. Workspace-scoped tools accept a per-call workspace (id or exact name) to target any workspace within that grant.
              Who am I, which workspace did this read resolve to, and what does my credential allow. Call this first. credential.defaultWorkspaceId is immutable for the connection. credential.workspaceScope "all" means every workspace you can currently access (grantedWorkspaceIds stays empty); "listed" pins the credential to exactly grantedWorkspaceIds. Reads may omit workspace and use the connection default; every workspace-scoped write must pass workspace explicitly.
            • WORDINGlist_workspacesdescription changedCore
              List the workspaces this credential can act in, and which is active. Each has an id, name, and stable slug. Pass any of them as the workspace parameter on workspace-scoped tools; the slug is what appears in dashboardUrl links.
              List the live workspaces this credential can act in, its immutable defaultWorkspaceId, and the workspace resolved for this request. Each has an id, name, and stable slug. Pass the slug or id as workspace on every write; the slug appears in dashboardUrl links.
            • WORDINGremove_slideparam description changed: workspaceStudio
              Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.
            • WORDINGrename_avatarparam description changed: workspaceAvatars
              Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.
            • WORDINGreorder_slidesparam description changed: workspaceStudio
              Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.
            • WORDINGset_captionparam description changed: workspaceStudio
              Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.
            • WORDINGset_slide_backgroundparam description changed: workspaceStudio
              Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.
            • WORDINGset_slide_textsparam description changed: workspaceStudio
              Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
              Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.

            v1.6.2

            2026-07-17

            Pinning is now a product concept only. create_slideshow's collectionId no longer pins the collection onto the project; it records the same explicit mention an @mention in the dashboard prompt box creates, and the images join casting through that path. Products keep their own photo collections via linkedCollections, resolved live when the deck is built. Nothing structural changed: the param name, type, and optionality are identical, and existing calls keep working.

            • WORDINGcreate_slideshowparam description changed: collectionIdSlideshows
              Pin a collection: its images join every slide's casting pool and the vision judge uses them where they fit (product slides prefer them). Pinning is the ONLY way the user's own images enter casting — unpinned collections never contend. Must belong to the workspace.
              Mention a collection: its images join the casting pool and are used where they fit. Equivalent to @mentioning the collection in the dashboard prompt box (there is no project-level pinning; products carry their own photo collections via linkedCollections). Must belong to the workspace.
            • WORDINGlist_collectionsdescription changedLibrary
              List the workspace's image collections (the user's own saved images): id, name, image count. Pass an id as create_slideshow collectionId to pin that collection — pinning is the ONLY way the user's own images enter a slideshow's casting (its images then contend for every slide, and product slides prefer them). Call this BEFORE creating a slideshow that should feature the user's own images.
              List the workspace's image collections (the user's own saved images): id, name, image count. Pass an id as create_slideshow collectionId to mention that collection — mentioning is the ONLY way the user's own images enter a slideshow's casting (its images then contend where they fit; products carry their own photo collections via linkedCollections). Call this BEFORE creating a slideshow that should feature the user's own images.

            v1.6.1

            2026-07-17

            Products now hand agents their imagery. list_products returns each product's linkedCollections (its own photo collections, with names), and the tool descriptions teach the path: mention or weave a product, browse its linked collection with list_collection_images, and cast a real product image on the plug slide. This is the resolver behind product mentions.

            • WORDINGlist_productsdescription changedLibrary
              List the workspace's registered products: id, name, description, url. Pass an id as create_slideshow productId to weave that product into ONE slide in a soft peer-recommendation voice. Call this BEFORE creating a slideshow that should plug a product.
              List the workspace's registered products: id, name, description, url, and linkedCollections (the product's OWN photo collections). Pass an id as create_slideshow productId to weave that product into ONE slide in a soft peer-recommendation voice; for hand-built decks, browse a linked collection with list_collection_images and cast a real product image on the product slide. Call this BEFORE creating a slideshow that should plug a product.

            v1.6.0

            2026-07-15

            The agent gets its own hands. Ten Studio tools expose the slideshow editor's creation moves one at a time: search_pinterest returns raw image urls for up to 8 queries, list_collection_images and list_avatar_images show the library's actual photos, create_blank_slideshow starts an empty deck, and set_slide_background, set_slide_texts, add_slide, remove_slide, reorder_slides, and set_caption build it piece by piece with the dashboard updating live. Image picks pass the same physical gates as the pipeline (browser-displayable, 720px minimum). Nothing about create_slideshow changed; Studio exists so a frontier agent can do the taste work itself, looking at every candidate with its own eyes.

            • ADDEDadd_slidenew toolStudio
              Insert a blank slide (append by default). Decks cap at 12 slides.
            • ADDEDcreate_blank_slideshownew toolStudio
              Create an empty slideshow with N blank slides, ready to be built slide by slide with set_slide_background and set_slide_texts. Use when YOU are doing the creative work; use create_slideshow when the server pipeline should. Costs no credits.
            • ADDEDlist_avatar_imagesnew toolStudio
              List a saved avatar's generated photos (urls + captions). Reusing them is free; use set_slide_background type 'avatar' to cast one.
            • ADDEDlist_collection_imagesnew toolStudio
              List a collection's actual images (urls + AI captions of what each shows), 30 per page. Use to hand-pick a specific image for set_slide_background.
            • ADDEDremove_slidenew toolStudio
              Remove a slide by position. A deck keeps at least one slide.
            • ADDEDreorder_slidesnew toolStudio
              Reorder slides with a permutation of current positions, e.g. [2,0,1].
            • ADDEDsearch_pinterestnew toolStudio
              Search Pinterest directly (up to 8 queries, default 12 images each) and get raw image urls back. Search for SCENES, not topics. LOOK at the images yourself before picking - that is the whole point of this tool - then set_slide_background with the winner. Costs no credits.
            • ADDEDset_captionnew toolStudio
              Set the slideshow's post caption.
            • ADDEDset_slide_backgroundnew toolStudio
              Set one slide's background: a Pinterest url, a collection image, an avatar photo, any image url, or a solid color. Image picks are gated server-side (browser-displayable, 720px+ short side). The dashboard updates live.
            • ADDEDset_slide_textsnew toolStudio
              Replace one slide's text boxes (1-5 texts with placement top/center/bottom and role heading/subheading/body/cta - role sets the font size, positions are computed server-side exactly like the dashboard). Optionally mark isProductSlide.

            v1.5.0

            2026-07-15

            The casting brain traded cleverness for taste. Slideshow backgrounds now come from exactly two places, Pinterest and the collection you pinned, and nothing from the library is ever used unless you pinned it (via collectionId or a product's linked photos). In exchange the picker got much better eyes. Every slide auditions up to 12 candidates against a camera-roll rubric that rejects infographics, baked-in text, staged stock, brand-logo shots, and anything under 600px, and when an entire search comes back weak the judge can veto it and trigger one automatic re-search on a backup query. Generated variants now go through the same judged casting instead of picking at random.

            • WORDINGcreate_slideshowdescription changedSlideshows
              Create a TikTok photo slideshow from a prompt OR by remixing a TikTok/Instagram post url (exactly one). The server pipeline writes the slide copy, searches Pinterest, and a vision judge casts each background from Pinterest + the user's collections. Costs no credits. ASYNC: returns a gen_ id immediately; poll get_generation until terminal (typically 1-3 minutes), then read the result with get_slideshow. Free plan allows 1 project.
              Create a TikTok photo slideshow from a prompt OR by remixing a TikTok/Instagram post url (exactly one). The server pipeline writes the slide copy, searches Pinterest, and a taste-tuned vision judge casts each background from the Pinterest results plus the project's pinned collection (weak batches trigger one automatic re-search). Collections are never used unless pinned via collectionId or a product's linked photos. Costs no credits. ASYNC: returns a gen_ id immediately; poll get_generation until terminal (typically 1-3 minutes), then read the result with get_slideshow. Free plan allows 1 project.
            • WORDINGcreate_slideshowparam description changed: collectionIdSlideshows
              Pin a collection: its images join every slide's casting pool and the vision judge uses them where they fit (product slides prefer them). Other workspace collections still contend automatically by name. Must belong to the workspace.
              Pin a collection: its images join every slide's casting pool and the vision judge uses them where they fit (product slides prefer them). Pinning is the ONLY way the user's own images enter casting — unpinned collections never contend. Must belong to the workspace.
            • WORDINGlist_collectionsdescription changedLibrary
              List the workspace's image collections (the user's own saved images): id, name, image count. Pass an id as create_slideshow collectionId to pin that collection — its images then contend for every slide and product slides prefer them. Call this BEFORE creating a slideshow that should feature the user's own images.
              List the workspace's image collections (the user's own saved images): id, name, image count. Pass an id as create_slideshow collectionId to pin that collection — pinning is the ONLY way the user's own images enter a slideshow's casting (its images then contend for every slide, and product slides prefer them). Call this BEFORE creating a slideshow that should feature the user's own images.

            v1.4.0

            2026-07-12

            Agents can now see the workspace library. Two new tools, `list_collections` and `list_products`, surface the user's own image collections and registered products with real ids, so an agent can pin a collection (`create_slideshow` `collectionId`) or weave a product (`productId`) instead of hoping the pipeline guesses right. Behind the scenes the slideshow casting brain got smarter about the user's own images: products remember which collections hold their photos and auto-pin them on product slides, product-slide collection hints always survive the per-deck fetch budget, and image formats browsers cannot display (HEIC and friends) are filtered out of casting before they can ship as a black slide.

            • ADDEDlist_collectionsnew toolLibrary
              List the workspace's image collections (the user's own saved images): id, name, image count. Pass an id as create_slideshow collectionId to pin that collection — its images then contend for every slide and product slides prefer them. Call this BEFORE creating a slideshow that should feature the user's own images.
            • ADDEDlist_productsnew toolLibrary
              List the workspace's registered products: id, name, description, url. Pass an id as create_slideshow productId to weave that product into ONE slide in a soft peer-recommendation voice. Call this BEFORE creating a slideshow that should plug a product.
            • WORDINGget_slideshowdescription changedSlideshows
              Read a slideshow's full anatomy: every variant with status, caption, and per-slide texts + background image url + provenance (backgroundSource: ai | pinterest | collection | image). Use it to review what was generated; for the visually composed slides (text on image), send the user the dashboardUrl.
              Read a slideshow's full anatomy: every variant with status, caption, and per-slide texts + background image url + provenance (backgroundSource: ai | pinterest | collection | avatar | image). Use it to review what was generated; for the visually composed slides (text on image), send the user the dashboardUrl.

            v1.3.0

            2026-07-12

            Every made thing now hands you its door, and links read like English. Avatar drafts, approvals, and renames return `dashboardUrl` alongside the data, the same field slideshows already carry, and the generation poll now carries it on every check (not just at creation) so a job you come back to later still has a link. Every workspace gains a stable, human-readable `slug` (e.g. `client-beta`) that appears in those links instead of a raw id, so a pasted link says where it lands; you can target a workspace by slug, name, or id, and list/read responses now echo the resolved `workspace: {id, name, slug}` so an empty result is distinguishable from a filter that never matched. Links are canonical (production domain) and carry `ref=agent` so agent-driven visits are measurable.

            • ADDEDcreate_slideshownew toolSlideshows
              Create a TikTok photo slideshow from a prompt OR by remixing a TikTok/Instagram post url (exactly one). The server pipeline writes the slide copy, searches Pinterest, and a vision judge casts each background from Pinterest + the user's collections. Costs no credits. ASYNC: returns a gen_ id immediately; poll get_generation until terminal (typically 1-3 minutes), then read the result with get_slideshow. Free plan allows 1 project.
            • ADDEDget_slideshownew toolSlideshows
              Read a slideshow's full anatomy: every variant with status, caption, and per-slide texts + background image url + provenance (backgroundSource: ai | pinterest | collection | image). Use it to review what was generated; for the visually composed slides (text on image), send the user the dashboardUrl.
            • ADDEDlist_slideshowsnew toolSlideshows
              List slideshow projects in the active workspace, latest activity first: id, name, variant count, whether one is still generating, and the dashboard url.
            • ADDEDlist_generationsenum values added to kind: slideshow_variantGenerations
            • WORDINGapprove_avatardescription changedAvatars
              Approve a draft avatar by its avatarId, promoting it into the library (optionally rename). Only approve drafts the USER chose to keep.
              Approve a draft avatar by its avatarId, promoting it into the library (optionally rename). Only approve drafts the USER chose to keep. Returns dashboardUrl for the saved avatar.
            • WORDINGcreate_avatardescription changedAvatars
              Generate draft avatar(s) from appearance traits + an optional scene prompt. Returns drafts that are NOT saved to the library; the user must approve them. Any traits you omit are randomized. Costs credits per image; the result reports creditsSpent and creditsRemaining. Drafts are billed once at creation, never expire, and cost nothing to keep unapproved.
              Generate draft avatar(s) from appearance traits + an optional scene prompt. Returns drafts that are NOT saved to the library; the user must approve them. Any traits you omit are randomized. Costs credits per image; the result reports creditsSpent and creditsRemaining. Drafts are billed once at creation, never expire, and cost nothing to keep unapproved. Each draft carries dashboardUrl, the dashboard door to that draft.
            • WORDINGget_generationdescription changedGenerations
              Check on an ASYNCHRONOUS generation you started, by its gen_ id: its normalized state and the finished asset urls once it succeeds. Poll until state is terminal (succeeded/failed/canceled). Avatars are created synchronously by create_avatar and are NOT polled here.
              Check on an ASYNCHRONOUS generation you started, by its gen_ id: its normalized state and the finished asset urls once it succeeds. Poll until state is terminal (succeeded/failed/canceled); slideshow generations typically take 1-3 minutes. Avatars are created synchronously by create_avatar and are NOT polled here.
            • WORDINGlist_generationsdescription changedGenerations
              List recent ASYNC generations in the active workspace, newest first. Avatar creation is synchronous and never appears here; this feed serves async verticals as they ship. Optionally filter by kind or state.
              List recent ASYNC generations in the active workspace, newest first (slideshow creations appear here). Avatar creation is synchronous and never appears. Optionally filter by kind or state.
            • WORDINGlist_workspacesdescription changedCore
              List the workspaces this credential can act in, and which is active. Pass any listed id or exact name as the workspace parameter on workspace-scoped tools to act in that workspace.
              List the workspaces this credential can act in, and which is active. Each has an id, name, and stable slug. Pass any of them as the workspace parameter on workspace-scoped tools; the slug is what appears in dashboardUrl links.

            v1.1.0

            2026-07-11

            Spend attribution, workspace targeting, and a wider trait catalog. Your agent can now read the credit ledger behind the shared balance (`list_transactions`, with `mine: true` to isolate its own spend), aim any workspace-scoped tool at a specific workspace (`workspace`, by id or exact name), page through drafts, and see who created each avatar. The trait catalog gains ages 50s to 70+, gray and silver hair, traditional wear (Kurta, Sari, Sherwani, Hijab with modest outfit), Blazer, Messy tousled hair, and Gray-Blue eyes; none of these are ever rolled by the randomizer, so a "surprise me" avatar keeps the same register as before. Batch creation now samples a distinct scene per image, and every tool description was rewritten for zero ambiguity.

            • ADDEDlist_transactionsnew toolCore
              The credit ledger behind get_credits, newest first: every charge, grant, and refund that moved the balance. Negative amount = spend. Entries made through the agent API carry attribution (which credential and client). On a shared team balance, pass mine: true to reconcile exactly what this credential spent.
            • ADDEDapprove_avataroptional param added: workspaceAvatars
            • ADDEDcreate_avatarenum values added to traits.ageBand: 50s, 60s, 70+Avatars
            • ADDEDcreate_avatarenum values added to traits.hairColor: Salt & Pepper, Gray, Silver, WhiteAvatars
            • ADDEDcreate_avatarenum values added to traits.hairStyle: Messy tousledAvatars
            • ADDEDcreate_avatarenum values added to traits.eyeColor: Gray-BlueAvatars
            • ADDEDcreate_avatarenum values added to traits.outfitStyle: Blazer, Kurta, Sari, Sherwani, Hijab with modest outfitAvatars
            • ADDEDcreate_avataroptional param added: workspaceAvatars
            • ADDEDdelete_draft_avataroptional param added: workspaceAvatars
            • ADDEDget_generationoptional param added: workspaceGenerations
            • ADDEDlist_avatarsoptional param added: workspaceAvatars
            • ADDEDlist_draft_avatarsoptional param added: pageAvatars
            • ADDEDlist_draft_avatarsoptional param added: limitAvatars
            • ADDEDlist_draft_avatarsoptional param added: workspaceAvatars
            • ADDEDlist_generationsoptional param added: workspaceGenerations
            • ADDEDrename_avataroptional param added: workspaceAvatars
            • WORDINGcreate_avatardescription changedAvatars
              Generate draft avatar(s) from appearance traits + an optional scene prompt. Returns drafts that are NOT saved to the library; the user must approve them. Any traits you omit are randomized. Costs credits per image; the result reports creditsSpent and creditsRemaining.
              Generate draft avatar(s) from appearance traits + an optional scene prompt. Returns drafts that are NOT saved to the library; the user must approve them. Any traits you omit are randomized. Costs credits per image; the result reports creditsSpent and creditsRemaining. Drafts are billed once at creation, never expire, and cost nothing to keep unapproved.
            • WORDINGcreate_avatarparam description changed: notesAvatars
              Free-text scene / pose / mood. Anything that is NOT a fixed trait.
              Free-text scene / pose / mood. Anything that is NOT a fixed trait. Scene wishes are best effort, not guaranteed: view the returned image before presenting it.
            • WORDINGcreate_avatarparam description changed: countAvatars
              How many draft variations to generate (default 1).
              How many draft variations to generate (default 1). Every draft in a call shares this ONE trait spec; count gives look variations of the same persona, not distinct people. For distinct personas, make one call per persona.
            • WORDINGcreate_avatarparam description changed: namesAvatars
              A name for each draft, index-aligned with count. YOU (the AI) should pick trait-appropriate names; omit to let the server auto-name.
              A name for each draft, index-aligned with count. YOU (the AI) should pick trait-appropriate names; omit to let the server auto-name. Fewer names than count is fine: the remaining drafts get server-generated names.
            • WORDINGget_creditsdescription changedCore
              Current spendable credit balance for this account.
              Current spendable credit balance for this account. On a team plan this is a live shared pool that teammates and their agents also draw from, so it can change between your calls; use list_transactions to attribute movements.
            • WORDINGget_medescription changedCore
              Who am I, which workspace am I pointed at, and what does my credential allow. Call this first.
              Who am I, which workspace am I pointed at, and what does my credential allow. Call this first. credential.workspaceScope "all" means every workspace you can currently access (grantedWorkspaceIds stays empty); "listed" pins the credential to exactly grantedWorkspaceIds. Workspace-scoped tools accept a per-call workspace (id or exact name) to target any workspace within that grant.
            • WORDINGlist_draft_avatarsdescription changedAvatars
              List draft avatars awaiting approval in the active workspace.
              List draft avatars awaiting approval in the active workspace, newest first (paginated).
            • WORDINGlist_generationsdescription changedGenerations
              List recent generations in the active workspace, newest first. Optionally filter by kind or state.
              List recent ASYNC generations in the active workspace, newest first. Avatar creation is synchronous and never appears here; this feed serves async verticals as they ship. Optionally filter by kind or state.
            • WORDINGlist_workspacesdescription changedCore
              List the workspaces this credential can act in, and which is active.
              List the workspaces this credential can act in, and which is active. Pass any listed id or exact name as the workspace parameter on workspace-scoped tools to act in that workspace.