GhostfeedGhostfeed MCPv5.3.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.

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.