Skip to main content
Glama

Update posts

batch_update_posts
Destructive

Updates caption, title, description, first comment, and platform-specific settings on multiple posts in a single call. Equivalent to calling update_post for each post but batched — use this when editing more than one post. To give every post the same text, set caption/title/description/first_comment once at the top level and list the posts in video_post_ids (or in updates, where an entry's own value wins over the top-level one). Posts on the same upload share one video_settings row, so shared fields (caption, title, description) are written once per upload. Does NOT support thumbnail operations — use update_post for those. Captions over a platform's limit are rejected for the whole upload group. Posts that failed for an over-limit caption are re-queued once the caption is fixed; their result includes the new status.

Input Schema

NameRequiredDescriptionDefault
titleNoShared title for every post in the call (an entry's own title wins).
captionNoShared caption for every post in the call (an entry's own caption wins).
updatesNoPer-post edits (max 50 posts in total with video_post_ids). Each entry targets one video_post_id and may set any combination of text/settings fields.
descriptionNoShared description for every post in the call (an entry's own description wins).
first_commentNoShared first comment for every post in the call (an entry's own first_comment wins).
video_post_idsNoPosts that get the top-level caption/title/description/first_comment and nothing else. Use with or instead of updates.
idempotency_keyNoOptional client-generated key (e.g., a UUID) to make retries safe. Identical calls with the same key within 10 minutes return the original result instead of running the write twice.
follow_up_commentsNoUp to 4 more comments after the first comment (5 per post in total), posted on the same platforms as the first comment. Shared by every post of the upload; passing it replaces the current list, [] clears it. Not posted on X, which only gets the first comment. On Threads, Bluesky, Mastodon and Pixelfed each one replies to the previous comment, so they read as a thread.
first_comment_delay_minutesNoMinutes after the post goes live to post the first comment. 0 = right away (default). Up to 10080 (7 days). Shared by every post of the upload.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / updates / items / properties / platform_settings / description
      Previous value: -"AI-generated label, by platform: TikTok isAigc, Instagram isAiGenerated, Facebook isAiGenerated (Reels, photos and carousels), YouTube containsSyntheticMedia; when the user wants content labelled as AI-generated, set it on each of these platforms the upload has a post on. Same for a paid partnership / sponsored post: Instagram isPaidPartnership (plus brandPartners, up to 2 brand usernames; needs Facebook Login for Instagram), TikTok commercialContentDisclosure + isBrandedContent, YouTube hasPaidProductPlacement. Partial per-platform settings blob. Shallow-merged into the platform's slice. snake_case keys are converted to camelCase. See update_post for platform-specific shapes (e.g. channelIds on Discord, from list_discord_channels; poll or document on LinkedIn text posts; poll ({ options, durationMinutes }, plus multiple on Mastodon) on X, Threads and Mastodon text posts, where the caption is the question; poll ({ question, options, multiple }, plus durationMinutes on Discord) on Telegram and Discord text posts; altText on Instagram single image posts or altTexts (keyed by image upload id) on Instagram carousels; trialReel (boolean) and trialGraduationStrategy (SS_PERFORMANCE, the default, shares to followers automatically if it performs well; MANUAL means the user shares it from the Instagram app) on Instagram Reels; subreddit (bare name or r/name for a subreddit, u_username for the user's own profile; a bare name is always a subreddit), title (Reddit-only post title, max 300 chars), nsfw and flairId on Reddit)."New value: +"AI-generated label, by platform: TikTok isAigc, Instagram isAiGenerated, Facebook isAiGenerated (Reels, photos and carousels), YouTube containsSyntheticMedia; when the user wants content labelled as AI-generated, set it on each of these platforms the upload has a post on. Same for a paid partnership / sponsored post: Instagram isPaidPartnership (plus brandPartners, up to 2 brand usernames; needs Facebook Login for Instagram), TikTok commercialContentDisclosure + isBrandedContent, YouTube hasPaidProductPlacement. Partial per-platform settings blob. Shallow-merged into the platform's slice. snake_case keys are converted to camelCase. See update_post for platform-specific shapes (e.g. channelIds on Discord, from list_discord_channels; poll or document on LinkedIn text posts; poll ({ options, durationMinutes }, plus multiple on Mastodon) on X, Threads and Mastodon text posts, where the caption is the question; poll ({ question, options, multiple }, plus durationMinutes on Discord) on Telegram and Discord text posts; altText on Instagram single image posts or altTexts (keyed by image upload id) on Instagram carousels; poll ({ options, extended }) or commentPrompt on Instagram feed posts, carousels and Reels, and storyCaption on Instagram Stories (all beta); trialReel (boolean) and trialGraduationStrategy (SS_PERFORMANCE, the default, shares to followers automatically if it performs well; MANUAL means the user shares it from the Instagram app) on Instagram Reels; subreddit (bare name or r/name for a subreddit, u_username for the user's own profile; a bare name is always a subreddit), title (Reddit-only post title, max 300 chars), nsfw and flairId on Reddit)."
  2. Changed1 schema field changed
    • changedInput schema / properties / updates / items / properties / platform_settings / description
      Previous value: -"AI-generated label, by platform: TikTok isAigc, Instagram isAiGenerated, Facebook isAiGenerated (Reels, photos and carousels), YouTube containsSyntheticMedia; when the user wants content labelled as AI-generated, set it on each of these platforms the upload has a post on. Same for a paid partnership / sponsored post: Instagram isPaidPartnership (plus brandPartners, up to 2 brand usernames; needs Facebook Login for Instagram), TikTok commercialContentDisclosure + isBrandedContent, YouTube hasPaidProductPlacement. Partial per-platform settings blob. Shallow-merged into the platform's slice. snake_case keys are converted to camelCase. See update_post for platform-specific shapes (e.g. channelIds on Discord, from list_discord_channels; poll or document on LinkedIn text posts; poll ({ options, durationMinutes }, plus multiple on Mastodon) on X, Threads and Mastodon text posts, where the caption is the question; poll ({ question, options, multiple }, plus durationMinutes on Discord) on Telegram and Discord text posts; altText on Instagram single image posts or altTexts (keyed by image upload id) on Instagram carousels; subreddit (bare name or r/name for a subreddit, u_username for the user's own profile; a bare name is always a subreddit), title (Reddit-only post title, max 300 chars), nsfw and flairId on Reddit)."New value: +"AI-generated label, by platform: TikTok isAigc, Instagram isAiGenerated, Facebook isAiGenerated (Reels, photos and carousels), YouTube containsSyntheticMedia; when the user wants content labelled as AI-generated, set it on each of these platforms the upload has a post on. Same for a paid partnership / sponsored post: Instagram isPaidPartnership (plus brandPartners, up to 2 brand usernames; needs Facebook Login for Instagram), TikTok commercialContentDisclosure + isBrandedContent, YouTube hasPaidProductPlacement. Partial per-platform settings blob. Shallow-merged into the platform's slice. snake_case keys are converted to camelCase. See update_post for platform-specific shapes (e.g. channelIds on Discord, from list_discord_channels; poll or document on LinkedIn text posts; poll ({ options, durationMinutes }, plus multiple on Mastodon) on X, Threads and Mastodon text posts, where the caption is the question; poll ({ question, options, multiple }, plus durationMinutes on Discord) on Telegram and Discord text posts; altText on Instagram single image posts or altTexts (keyed by image upload id) on Instagram carousels; trialReel (boolean) and trialGraduationStrategy (SS_PERFORMANCE, the default, shares to followers automatically if it performs well; MANUAL means the user shares it from the Instagram app) on Instagram Reels; subreddit (bare name or r/name for a subreddit, u_username for the user's own profile; a bare name is always a subreddit), title (Reddit-only post title, max 300 chars), nsfw and flairId on Reddit)."
  3. Changed1 schema field changed
    • changedInput schema / properties / follow_up_comments / description
      Previous value: -"Up to 4 more comments after the first comment (5 per post in total), posted on the same platforms as the first comment. Shared by every post of the upload; passing it replaces the current list, [] clears it. On X, Threads, Bluesky, Mastodon and Pixelfed each one replies to the previous comment, so they read as a thread."New value: +"Up to 4 more comments after the first comment (5 per post in total), posted on the same platforms as the first comment. Shared by every post of the upload; passing it replaces the current list, [] clears it. Not posted on X, which only gets the first comment. On Threads, Bluesky, Mastodon and Pixelfed each one replies to the previous comment, so they read as a thread."
  4. Changed2 schema fields changed
    • addedInput schema / properties / first_comment_delay_minutes
      Added value: +{
      +  "description": "Minutes after the post goes live to post the first comment. 0 = right away (default). Up to 10080 (7 days). Shared by every post of the upload.",
      +  "maximum": 10080,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedInput schema / properties / follow_up_comments
      Added value: +{
      +  "description": "Up to 4 more comments after the first comment (5 per post in total), posted on the same platforms as the first comment. Shared by every post of the upload; passing it replaces the current list, [] clears it. On X, Threads, Bluesky, Mastodon and Pixelfed each one replies to the previous comment, so they read as a thread.",
      +  "items": {
      +    "properties": {
      +      "delay_minutes": {
      +        "description": "Minutes after the post goes live. 0 = right after the post (about a minute later, after the first comment).",
      +        "maximum": 10080,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "skip_platforms": {
      +        "description": "Platforms that skip this comment, e.g. [\"twitter\", \"linkedin\"].",
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "text": {
      +        "description": "The comment text.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 4,
      +  "type": "array"
      +}
  5. Changed1 schema field changed
    • changedInput schema / properties / updates / items / properties / platform_settings / description
      Previous value: -"AI-generated label, by platform: TikTok isAigc, Instagram isAiGenerated, Facebook isAiGenerated (Reels, photos and carousels), YouTube containsSyntheticMedia; when the user wants content labelled as AI-generated, set it on each of these platforms the upload has a post on. Partial per-platform settings blob. Shallow-merged into the platform's slice. snake_case keys are converted to camelCase. See update_post for platform-specific shapes (e.g. channelIds on Discord, from list_discord_channels; poll or document on LinkedIn text posts; poll ({ options, durationMinutes }, plus multiple on Mastodon) on X, Threads and Mastodon text posts, where the caption is the question; poll ({ question, options, multiple }, plus durationMinutes on Discord) on Telegram and Discord text posts; altText on Instagram single image posts or altTexts (keyed by image upload id) on Instagram carousels; subreddit (bare name or r/name for a subreddit, u_username for the user's own profile; a bare name is always a subreddit), title (Reddit-only post title, max 300 chars), nsfw and flairId on Reddit)."New value: +"AI-generated label, by platform: TikTok isAigc, Instagram isAiGenerated, Facebook isAiGenerated (Reels, photos and carousels), YouTube containsSyntheticMedia; when the user wants content labelled as AI-generated, set it on each of these platforms the upload has a post on. Same for a paid partnership / sponsored post: Instagram isPaidPartnership (plus brandPartners, up to 2 brand usernames; needs Facebook Login for Instagram), TikTok commercialContentDisclosure + isBrandedContent, YouTube hasPaidProductPlacement. Partial per-platform settings blob. Shallow-merged into the platform's slice. snake_case keys are converted to camelCase. See update_post for platform-specific shapes (e.g. channelIds on Discord, from list_discord_channels; poll or document on LinkedIn text posts; poll ({ options, durationMinutes }, plus multiple on Mastodon) on X, Threads and Mastodon text posts, where the caption is the question; poll ({ question, options, multiple }, plus durationMinutes on Discord) on Telegram and Discord text posts; altText on Instagram single image posts or altTexts (keyed by image upload id) on Instagram carousels; subreddit (bare name or r/name for a subreddit, u_username for the user's own profile; a bare name is always a subreddit), title (Reddit-only post title, max 300 chars), nsfw and flairId on Reddit)."
  6. Changed7 schema fields changed
    • addedInput schema / properties / caption
      Added value: +{
      +  "description": "Shared caption for every post in the call (an entry's own caption wins).",
      +  "type": "string"
      +}
    • addedInput schema / properties / description
      Added value: +{
      +  "description": "Shared description for every post in the call (an entry's own description wins).",
      +  "type": "string"
      +}
    • addedInput schema / properties / first_comment
      Added value: +{
      +  "description": "Shared first comment for every post in the call (an entry's own first_comment wins).",
      +  "type": "string"
      +}
    • addedInput schema / properties / title
      Added value: +{
      +  "description": "Shared title for every post in the call (an entry's own title wins).",
      +  "type": "string"
      +}
    • changedInput schema / properties / updates / description
      Previous value: -"Array of per-post edits (max 50). Each entry targets one video_post_id and may set any combination of text/settings fields."New value: +"Per-post edits (max 50 posts in total with video_post_ids). Each entry targets one video_post_id and may set any combination of text/settings fields."
    • addedInput schema / properties / video_post_ids
      Added value: +{
      +  "description": "Posts that get the top-level caption/title/description/first_comment and nothing else. Use with or instead of updates.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • removedInput schema / required
      Removed value: -[
      -  "updates"
      -]
  7. Changed1 schema field changed
    • changedInput schema / properties / updates / items / properties / platform_settings / description
      Previous value: -"Partial per-platform settings blob. Shallow-merged into the platform's slice. snake_case keys are converted to camelCase. See update_post for platform-specific shapes (e.g. isAigc on TikTok, isAiGenerated on Instagram and Facebook, containsSyntheticMedia on YouTube for the AI-generated label; channelIds on Discord, from list_discord_channels; poll or document on LinkedIn text posts; poll ({ options, durationMinutes }, plus multiple on Mastodon) on X, Threads and Mastodon text posts, where the caption is the question; poll ({ question, options, multiple }, plus durationMinutes on Discord) on Telegram and Discord text posts; altText on Instagram single image posts or altTexts (keyed by image upload id) on Instagram carousels; subreddit (bare name or r/name for a subreddit, u_username for the user's own profile; a bare name is always a subreddit), title (Reddit-only post title, max 300 chars), nsfw and flairId on Reddit)."New value: +"AI-generated label, by platform: TikTok isAigc, Instagram isAiGenerated, Facebook isAiGenerated (Reels, photos and carousels), YouTube containsSyntheticMedia; when the user wants content labelled as AI-generated, set it on each of these platforms the upload has a post on. Partial per-platform settings blob. Shallow-merged into the platform's slice. snake_case keys are converted to camelCase. See update_post for platform-specific shapes (e.g. channelIds on Discord, from list_discord_channels; poll or document on LinkedIn text posts; poll ({ options, durationMinutes }, plus multiple on Mastodon) on X, Threads and Mastodon text posts, where the caption is the question; poll ({ question, options, multiple }, plus durationMinutes on Discord) on Telegram and Discord text posts; altText on Instagram single image posts or altTexts (keyed by image upload id) on Instagram carousels; subreddit (bare name or r/name for a subreddit, u_username for the user's own profile; a bare name is always a subreddit), title (Reddit-only post title, max 300 chars), nsfw and flairId on Reddit)."
  8. Changed1 schema field changed
    • changedInput schema / properties / updates / items / properties / platform_settings / description
      Previous value: -"Partial per-platform settings blob. Shallow-merged into the platform's slice. snake_case keys are converted to camelCase. See update_post for platform-specific shapes (e.g. isAigc on TikTok, isAiGenerated on Instagram and Facebook, containsSyntheticMedia on YouTube for the AI-generated label; channelIds on Discord, from list_discord_channels; poll or document on LinkedIn text posts; subreddit (bare name or r/name for a subreddit, u_username for the user's own profile; a bare name is always a subreddit), title (Reddit-only post title, max 300 chars), nsfw and flairId on Reddit)."New value: +"Partial per-platform settings blob. Shallow-merged into the platform's slice. snake_case keys are converted to camelCase. See update_post for platform-specific shapes (e.g. isAigc on TikTok, isAiGenerated on Instagram and Facebook, containsSyntheticMedia on YouTube for the AI-generated label; channelIds on Discord, from list_discord_channels; poll or document on LinkedIn text posts; poll ({ options, durationMinutes }, plus multiple on Mastodon) on X, Threads and Mastodon text posts, where the caption is the question; poll ({ question, options, multiple }, plus durationMinutes on Discord) on Telegram and Discord text posts; altText on Instagram single image posts or altTexts (keyed by image upload id) on Instagram carousels; subreddit (bare name or r/name for a subreddit, u_username for the user's own profile; a bare name is always a subreddit), title (Reddit-only post title, max 300 chars), nsfw and flairId on Reddit)."
  9. Changed2 schema fields changed
    • changedInput schema / properties / updates / items / properties / platform_settings / description
      Previous value: -"Partial per-platform settings blob. Shallow-merged into the platform's slice. snake_case keys are converted to camelCase. See update_post for platform-specific shapes (e.g. isAigc on TikTok, isAiGenerated on Instagram and Facebook, containsSyntheticMedia on YouTube for the AI-generated label; channelIds on Discord, from list_discord_channels; poll or document on LinkedIn text posts)."New value: +"Partial per-platform settings blob. Shallow-merged into the platform's slice. snake_case keys are converted to camelCase. See update_post for platform-specific shapes (e.g. isAigc on TikTok, isAiGenerated on Instagram and Facebook, containsSyntheticMedia on YouTube for the AI-generated label; channelIds on Discord, from list_discord_channels; poll or document on LinkedIn text posts; subreddit (bare name or r/name for a subreddit, u_username for the user's own profile; a bare name is always a subreddit), title (Reddit-only post title, max 300 chars), nsfw and flairId on Reddit)."
    • changedInput schema / properties / updates / items / properties / title / description
      Previous value: -"New title (YouTube, Facebook, Pinterest, Tumblr, Reddit)."New value: +"New shared title of the upload (YouTube, Facebook, Pinterest, Tumblr, and Reddit when its platform_settings.title is empty). Changes every platform's title on the same upload; for a Reddit-only title use platform_settings.title on the Reddit post."
  10. Changed2 schema fields changed
    • changedInput schema / properties / updates / items / properties / description / description
      Previous value: -"New description (YouTube, Facebook, Pinterest, Tumblr post text)."New value: +"New description (YouTube, Facebook, Pinterest, Tumblr and Reddit post text)."
    • changedInput schema / properties / updates / items / properties / title / description
      Previous value: -"New title (YouTube, Facebook, Pinterest, Tumblr)."New value: +"New title (YouTube, Facebook, Pinterest, Tumblr, Reddit)."
  11. Changed1 schema field changed
    • changedInput schema / properties / updates / items / properties / platform_settings / description
      Previous value: -"Partial per-platform settings blob. Shallow-merged into the platform's slice. snake_case keys are converted to camelCase. See update_post for platform-specific shapes (e.g. isAigc on TikTok, isAiGenerated on Instagram and Facebook, containsSyntheticMedia on YouTube for the AI-generated label; channelIds on Discord, from list_discord_channels)."New value: +"Partial per-platform settings blob. Shallow-merged into the platform's slice. snake_case keys are converted to camelCase. See update_post for platform-specific shapes (e.g. isAigc on TikTok, isAiGenerated on Instagram and Facebook, containsSyntheticMedia on YouTube for the AI-generated label; channelIds on Discord, from list_discord_channels; poll or document on LinkedIn text posts)."
  12. First observed

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true and openWorldHint=true, and the description goes well beyond them: it discloses that posts on the same upload share one video_settings row, that an over-limit caption rejects the whole upload group, and that failed posts are re-queued with a new `status` once fixed. These are non-obvious side effects and failure modes that materially change how an agent should batch edits. It stops short of describing permission requirements or partial-failure semantics for non-caption errors.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is front-loaded with purpose, then usage, then constraints, then failure behavior — a sensible order with no filler sentences. It is on the long side and repeats the precedence rule that the schema also states per field, which keeps it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter batch mutation with no output schema, the description covers the grouping model, the override precedence, the caption-limit failure path, and the re-queue outcome, which is most of what an agent needs. It does not describe the shape of the returned per-post results beyond the `status` field, leaving some ambiguity about how partial failures are reported.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning on precedence ('an entry's own value wins over the top-level one') and on the division of labor between video_post_ids and updates. That precedence rule is the single most error-prone aspect of this tool and is stated in prose rather than left to per-field schema text.

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

Purpose5/5

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

The description opens with a specific verb and resource ('Updates caption, title, description, first comment, and platform-specific settings on multiple posts') and immediately distinguishes itself from the single-post sibling by calling itself the batched equivalent of update_post. It also carves out an explicit non-capability (thumbnails), so an agent can route correctly without opening the schema.

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

Usage Guidelines5/5

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

It states the selection condition directly ('use this when editing more than one post') and names the alternative for the excluded case ('Does NOT support thumbnail operations — use update_post for those'). It also explains the two input modes (top-level shared values vs. per-entry overrides in updates), which is the main usage decision an agent faces here.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.