Skip to main content
Glama

Update a post

update_post

Edits a draft, review or scheduled post: text, link, hashtags, replies, media, media per network, targets, date or status. Only the fields given are changed; overrides and mediaOverrides are each replaced as a whole when given (pass every entry to keep), kept when omitted. Use it instead of schedule_post to fix or reschedule an existing post (no duplicate is created), and instead of cancel_post when the post should still go out. Setting status "scheduled" publishes without approval and needs the publish scope, so only do it when the user asked. A published post cannot be edited.

Input Schema

NameRequiredDescriptionDefault
idYesId of the post to edit, from get_schedule or schedule_post.
bodyNoMain text of the post. Per-network overrides go in `overrides`; leave it as an empty string when every target has its own text there (never write quote marks as the text).
linkNoLink appended after the text (becomes a preview card on Bluesky, Mastodon, Threads, Facebook and LinkedIn without media).
mediaNoImages (4 on x, bluesky and mastodon, 10 on facebook, 20 on instagram, threads and linkedin, 35 on tiktok) or one video, for every target without its own entry in `mediaOverrides`. Instagram and Threads also take a carousel of up to 20 images and videos, mixed. Instagram takes JPEG images and MP4 or MOV videos only.
repeatNoPublishes the post again every day, week or month at the same time (Europe/Paris), counted from scheduledAt: once an occurrence goes out, the next one is created with the same content. null stops the series. TikTok settings chosen in the app apply to every occurrence.
statusNodraft: saved without a date. review (default when scheduledAt is set): waits for an approval in the app. scheduled: published automatically at scheduledAt, without approval (needs the publish scope); with scheduledAt "now" it goes out within a minute.
tiktokNoThe user's TikTok settings for every TikTok target, required to schedule a TikTok post (status scheduled); without them the post waits in review for the user to pick them in Broadcast. While TikTok's audit of Broadcast is pending they are optional: the post goes out private (SELF_ONLY), interactions off. By publishing, the user accepts TikTok's Music Usage Confirmation (and Branded Content Policy when brandedContent is true).
repliesNoReplies Broadcast posts under the post right after it goes out, from the same account. On x, bluesky, threads and mastodon they form a thread: each one replies to the one before. On linkedin, facebook and instagram only the first one goes out, as a comment under the post (text only; e.g. the link, kept out of the post). None on tiktok, youtube or an instagram story. Up to 24. On X each reply costs credits like a post (10 with a link). If one fails, the post stays published, the replies carry on from that one on the automatic retries, and the target's `replies` says where they stopped. null or [] removes them. When the post's text is longer than a thread network takes, put its first part in `overrides` for that network and the rest in replies. Per network, `noReplies` turns them off.
xThreadNoDeprecated: same as `replies` (ignored when `replies` is given).
accountsNoTarget account ids (see GET /accounts / list_accounts).
hashtagsNoHashtags appended on their own line, with or without the leading #.
noRepliesNoAccount ids or platform names that get no replies (e.g. ["linkedin"] to keep the thread on x and bluesky only). On update_post it replaces the list; omit it to keep it.
overridesNoText replacing `body` for one network, keyed by account id or platform name (e.g. a shorter text for x). On update_post it replaces every override at once.
platformsNoAlternative to `accounts`: every connected account of these networks.
sourceUrlNoOptional https address of the conversation or session making this call (for instance a Claude Code session link), shown as a link in the user's activity log. Omit it when unknown; never invent one.
scheduledAtNoISO 8601 date-time with offset (e.g. 2026-10-14T09:00:00+02:00), or "now". Required for status review and scheduled.
firstCommentNoDeprecated: a single reply, same as `replies: [{ text }]` (ignored when `replies` is given).
instagramStoryNotrue: every Instagram target is published as a story instead of a post (exactly one image or one video of 60 s max; no caption, no replies; gone after 24 h). Or per Instagram account: an object keyed by account id (e.g. {"<id>": true}), the accounts left out staying posts. Default false. A story takes the target's own media when it has some in `mediaOverrides`.
mediaOverridesNoReplaces every per-network media list at once, like `overrides`: a target left out goes back to `media`; {} removes them all. Omit it to keep them.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changed
    • changedInput schema / properties / firstComment / description
      Previous value: -"Optional reply Broadcast posts under the post right after it goes out, from the same account (e.g. the link, kept out of the post on LinkedIn, or the rest of a thread). Only on x, bluesky, linkedin, threads, mastodon, facebook and instagram; ignored elsewhere. Limits: 280 on x (links count 23), 300 on bluesky, 500 on threads and mastodon, 1250 elsewhere. On X it costs credits like one more post. If it fails, the post stays published and the target's comment.error says why."New value: +"Deprecated: a single reply, same as `replies: [{ text }]` (ignored when `replies` is given)."
    • changedInput schema / properties / instagramStory / description
      Previous value: -"true: every Instagram target is published as a story instead of a post (exactly one image or one video of 60 s max; no caption, no first comment; gone after 24 h). Or per Instagram account: an object keyed by account id (e.g. {\"<id>\": true}), the accounts left out staying posts. Default false. A story takes the target's own media when it has some in `mediaOverrides`."New value: +"true: every Instagram target is published as a story instead of a post (exactly one image or one video of 60 s max; no caption, no replies; gone after 24 h). Or per Instagram account: an object keyed by account id (e.g. {\"<id>\": true}), the accounts left out staying posts. Default false. A story takes the target's own media when it has some in `mediaOverrides`."
    • addedInput schema / properties / noReplies
      Added value: +{
      +  "description": "Account ids or platform names that get no replies (e.g. [\"linkedin\"] to keep the thread on x and bluesky only). On update_post it replaces the list; omit it to keep it.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / replies
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "media": {
      +            "description": "This reply's own media: 4 images or one video (a carousel of 20 images and videos on threads). Only sent in threads: a comment goes without its media.",
      +            "items": {
      +              "additionalProperties": false,
      +              "properties": {
      +                "alt": {
      +                  "description": "Alternative text describing the image for people who cannot see it (what it shows, in the post's language; no \"image of\"). Sent on bluesky, mastodon, x, linkedin, threads, facebook and instagram (not on instagram stories, reels or videos); ignored elsewhere. Omitted: the alt given to upload_media for this key. May differ per network in `mediaOverrides`.",
      +                  "maxLength": 1000,
      +                  "type": "string"
      +                },
      +                "key": {
      +                  "description": "Media key returned by POST /media (or the upload_media tool).",
      +                  "minLength": 1,
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "key"
      +              ],
      +              "type": "object"
      +            },
      +            "maxItems": 20,
      +            "type": "array"
      +          },
      +          "text": {
      +            "description": "The reply's text. Limits as each network counts them: 280 on x (a link counts 23), 300 on bluesky, 500 on threads and mastodon, 1250 on linkedin, 2200 on instagram, 8000 on facebook.",
      +            "maxLength": 8000,
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "text"
      +        ],
      +        "type": "object"
      +      },
      +      "maxItems": 24,
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Replies Broadcast posts under the post right after it goes out, from the same account. On x, bluesky, threads and mastodon they form a thread: each one replies to the one before. On linkedin, facebook and instagram only the first one goes out, as a comment under the post (text only; e.g. the link, kept out of the post). None on tiktok, youtube or an instagram story. Up to 24. On X each reply costs credits like a post (10 with a link). If one fails, the post stays published, the replies carry on from that one on the automatic retries, and the target's `replies` says where they stopped. null or [] removes them. When the post's text is longer than a thread network takes, put its first part in `overrides` for that network and the rest in replies. Per network, `noReplies` turns them off."
      +}
    • addedInput schema / properties / xThread
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "media": {
      +            "items": {
      +              "additionalProperties": false,
      +              "properties": {
      +                "alt": {
      +                  "description": "Alternative text describing the image for people who cannot see it (what it shows, in the post's language; no \"image of\"). Sent on bluesky, mastodon, x, linkedin, threads, facebook and instagram (not on instagram stories, reels or videos); ignored elsewhere. Omitted: the alt given to upload_media for this key. May differ per network in `mediaOverrides`.",
      +                  "maxLength": 1000,
      +                  "type": "string"
      +                },
      +                "key": {
      +                  "description": "Media key returned by POST /media (or the upload_media tool).",
      +                  "minLength": 1,
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "key"
      +              ],
      +              "type": "object"
      +            },
      +            "maxItems": 4,
      +            "type": "array"
      +          },
      +          "text": {
      +            "maxLength": 1000,
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "text"
      +        ],
      +        "type": "object"
      +      },
      +      "maxItems": 24,
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Deprecated: same as `replies` (ignored when `replies` is given)."
      +}
  2. Changed2 schema fields changed
    • changedInput schema / properties / media / items / properties / alt / description
      Previous value: -"Alternative text for images."New value: +"Alternative text describing the image for people who cannot see it (what it shows, in the post's language; no \"image of\"). Sent on bluesky, mastodon, x, linkedin, threads, facebook and instagram (not on instagram stories, reels or videos); ignored elsewhere. Omitted: the alt given to upload_media for this key. May differ per network in `mediaOverrides`."
    • changedInput schema / properties / mediaOverrides / additionalProperties / items / properties / alt / description
      Previous value: -"Alternative text for images."New value: +"Alternative text describing the image for people who cannot see it (what it shows, in the post's language; no \"image of\"). Sent on bluesky, mastodon, x, linkedin, threads, facebook and instagram (not on instagram stories, reels or videos); ignored elsewhere. Omitted: the alt given to upload_media for this key. May differ per network in `mediaOverrides`."
  3. Changed6 schema fields changed
    • addedInput schema / properties / instagramStory / anyOf
      Added value: +[
      +  {
      +    "type": "boolean"
      +  },
      +  {
      +    "additionalProperties": {
      +      "type": "boolean"
      +    },
      +    "propertyNames": {
      +      "type": "string"
      +    },
      +    "type": "object"
      +  }
      +]
    • changedInput schema / properties / instagramStory / description
      Previous value: -"true: every Instagram target is published as a story instead of a post (exactly one image or one video of 60 s max; no caption, no first comment; gone after 24 h). Default false."New value: +"true: every Instagram target is published as a story instead of a post (exactly one image or one video of 60 s max; no caption, no first comment; gone after 24 h). Or per Instagram account: an object keyed by account id (e.g. {\"<id>\": true}), the accounts left out staying posts. Default false. A story takes the target's own media when it has some in `mediaOverrides`."
    • removedInput schema / properties / instagramStory / type
      Removed value: -"boolean"
    • changedInput schema / properties / media / description
      Previous value: -"Images (up to 10 for most networks, 20 on Instagram, Threads and LinkedIn) or one video. Instagram and Threads also take a carousel of up to 20 images and videos, mixed: then target only them. Instagram takes JPEG images and MP4 or MOV videos only."New value: +"Images (4 on x, bluesky and mastodon, 10 on facebook, 20 on instagram, threads and linkedin, 35 on tiktok) or one video, for every target without its own entry in `mediaOverrides`. Instagram and Threads also take a carousel of up to 20 images and videos, mixed. Instagram takes JPEG images and MP4 or MOV videos only."
    • addedInput schema / properties / mediaOverrides
      Added value: +{
      +  "additionalProperties": {
      +    "items": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "alt": {
      +          "description": "Alternative text for images.",
      +          "maxLength": 1000,
      +          "type": "string"
      +        },
      +        "key": {
      +          "description": "Media key returned by POST /media (or the upload_media tool).",
      +          "minLength": 1,
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "key"
      +      ],
      +      "type": "object"
      +    },
      +    "maxItems": 35,
      +    "type": "array"
      +  },
      +  "description": "Replaces every per-network media list at once, like `overrides`: a target left out goes back to `media`; {} removes them all. Omit it to keep them.",
      +  "propertyNames": {
      +    "type": "string"
      +  },
      +  "type": "object"
      +}
    • changedInput schema / properties / overrides / description
      Previous value: -"Text replacing `body` for one network, keyed by account id or platform name (e.g. a shorter text for x)."New value: +"Text replacing `body` for one network, keyed by account id or platform name (e.g. a shorter text for x). On update_post it replaces every override at once."
  4. Changed2 schema fields changed
    • changedInput schema / properties / tiktok / description
      Previous value: -"The user's TikTok settings for every TikTok target, required to schedule a TikTok post (status scheduled); without them the post waits in review for the user to pick them in Broadcast. By publishing, the user accepts TikTok's Music Usage Confirmation (and Branded Content Policy when brandedContent is true)."New value: +"The user's TikTok settings for every TikTok target, required to schedule a TikTok post (status scheduled); without them the post waits in review for the user to pick them in Broadcast. While TikTok's audit of Broadcast is pending they are optional: the post goes out private (SELF_ONLY), interactions off. By publishing, the user accepts TikTok's Music Usage Confirmation (and Branded Content Policy when brandedContent is true)."
    • changedInput schema / properties / tiktok / properties / privacy / description
      Previous value: -"Who can see the post, as the user chose it: PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR or SELF_ONLY. Never pick it for them: ask when you do not know."New value: +"Who can see the post, as the user chose it: PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR or SELF_ONLY. Never pick it for them: ask when you do not know. Until TikTok approves Broadcast (audit pending), every TikTok post is published as SELF_ONLY whatever is sent here: tell the user."
  5. Changed1 schema field changed
    • changedInput schema / properties / body / description
      Previous value: -"Main text of the post. Per-network overrides go in `overrides`; it may be empty (\"\") when every target has an override."New value: +"Main text of the post. Per-network overrides go in `overrides`; leave it as an empty string when every target has its own text there (never write quote marks as the text)."
  6. Changed3 schema fields changed
    • addedInput schema / properties / instagramStory
      Added value: +{
      +  "description": "true: every Instagram target is published as a story instead of a post (exactly one image or one video of 60 s max; no caption, no first comment; gone after 24 h). Default false.",
      +  "type": "boolean"
      +}
    • changedInput schema / properties / media / description
      Previous value: -"Images (up to 10 for most networks) or one video. Not both."New value: +"Images (up to 10 for most networks, 20 on Instagram, Threads and LinkedIn) or one video. Instagram and Threads also take a carousel of up to 20 images and videos, mixed: then target only them. Instagram takes JPEG images and MP4 or MOV videos only."
    • addedInput schema / properties / tiktok
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "The user's TikTok settings for every TikTok target, required to schedule a TikTok post (status scheduled); without them the post waits in review for the user to pick them in Broadcast. By publishing, the user accepts TikTok's Music Usage Confirmation (and Branded Content Policy when brandedContent is true).",
      +  "properties": {
      +    "allowComment": {
      +      "description": "Allow comments. Default false.",
      +      "type": "boolean"
      +    },
      +    "allowDuet": {
      +      "description": "Allow duets (videos). Default false.",
      +      "type": "boolean"
      +    },
      +    "allowStitch": {
      +      "description": "Allow stitches (videos). Default false.",
      +      "type": "boolean"
      +    },
      +    "brandedContent": {
      +      "description": "Promotes a third party: labelled \"Paid partnership\"; cannot be SELF_ONLY.",
      +      "type": "boolean"
      +    },
      +    "privacy": {
      +      "description": "Who can see the post, as the user chose it: PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR or SELF_ONLY. Never pick it for them: ask when you do not know.",
      +      "enum": [
      +        "PUBLIC_TO_EVERYONE",
      +        "MUTUAL_FOLLOW_FRIENDS",
      +        "FOLLOWER_OF_CREATOR",
      +        "SELF_ONLY"
      +      ],
      +      "type": "string"
      +    },
      +    "yourBrand": {
      +      "description": "Promotes the user's own business: labelled \"Promotional content\".",
      +      "type": "boolean"
      +    }
      +  },
      +  "required": [
      +    "privacy"
      +  ],
      +  "type": "object"
      +}
  7. Changed1 schema field changed
    • addedInput schema / properties / sourceUrl
      Added value: +{
      +  "description": "Optional https address of the conversation or session making this call (for instance a Claude Code session link), shown as a link in the user's activity log. Omit it when unknown; never invent one.",
      +  "format": "uri",
      +  "type": "string"
      +}
  8. Changed2 schema fields changed
    • changedInput schema / properties / body / description
      Previous value: -"Main text of the post. Per-network overrides go in `overrides`."New value: +"Main text of the post. Per-network overrides go in `overrides`; it may be empty (\"\") when every target has an override."
    • removedInput schema / properties / body / minLength
      Removed value: -1
  9. Changed2 schema fields changed
    • changedInput schema / properties / firstComment / description
      Previous value: -"Optional reply Broadcast posts under the post right after it goes out, from the same account (e.g. the link, kept out of the post on LinkedIn, or the rest of a thread). Only on x, bluesky, linkedin, threads, facebook and instagram; ignored elsewhere. Limits: 280 on x (links count 23), 300 on bluesky, 1250 elsewhere. On X it costs credits like one more post. If it fails, the post stays published and the target's comment.error says why."New value: +"Optional reply Broadcast posts under the post right after it goes out, from the same account (e.g. the link, kept out of the post on LinkedIn, or the rest of a thread). Only on x, bluesky, linkedin, threads, mastodon, facebook and instagram; ignored elsewhere. Limits: 280 on x (links count 23), 300 on bluesky, 500 on threads and mastodon, 1250 elsewhere. On X it costs credits like one more post. If it fails, the post stays published and the target's comment.error says why."
    • changedInput schema / properties / link / description
      Previous value: -"Link appended after the text (becomes a preview card on Bluesky, Facebook and LinkedIn without media)."New value: +"Link appended after the text (becomes a preview card on Bluesky, Mastodon, Threads, Facebook and LinkedIn without media)."
  10. Changed1 schema field changed
    • changedInput schema / properties / platforms / items / enum
      Previous value: -[
      -  "bluesky",
      -  "x",
      -  "facebook",
      -  "instagram",
      -  "tiktok",
      -  "linkedin",
      -  "mastodon",
      -  "threads"
      -]New value: +[
      +  "bluesky",
      +  "x",
      +  "facebook",
      +  "instagram",
      +  "tiktok",
      +  "linkedin",
      +  "mastodon",
      +  "threads",
      +  "youtube"
      +]
  11. Changed2 schema fields changed
    • changedInput schema / properties / firstComment / description
      Previous value: -"Optional reply Broadcast posts under the post right after it goes out, from the same account (e.g. the link, kept out of the post on LinkedIn, or the rest of a thread). Only on x, bluesky and linkedin; ignored elsewhere. Limits: 280 on x (links count 23), 300 on bluesky, 1250 on linkedin. On X it costs credits like one more post. If it fails, the post stays published and the target's comment.error says why."New value: +"Optional reply Broadcast posts under the post right after it goes out, from the same account (e.g. the link, kept out of the post on LinkedIn, or the rest of a thread). Only on x, bluesky, linkedin, threads, facebook and instagram; ignored elsewhere. Limits: 280 on x (links count 23), 300 on bluesky, 1250 elsewhere. On X it costs credits like one more post. If it fails, the post stays published and the target's comment.error says why."
    • changedInput schema / properties / platforms / items / enum
      Previous value: -[
      -  "bluesky",
      -  "x",
      -  "facebook",
      -  "instagram",
      -  "tiktok",
      -  "linkedin",
      -  "mastodon"
      -]New value: +[
      +  "bluesky",
      +  "x",
      +  "facebook",
      +  "instagram",
      +  "tiktok",
      +  "linkedin",
      +  "mastodon",
      +  "threads"
      +]
  12. First observed

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only give the generic safety profile (not read-only, not idempotent, not destructive), so the description carries the real behavioral load and does: it discloses PATCH-style partial updates vs. whole-list replacement for `overrides`/`mediaOverrides`, that omitted collections are kept, that publishing via "scheduled" bypasses approval and requires the publish scope, and that published posts are immutable. These are non-obvious state and permission consequences beyond anything in the annotations or schema.

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

Conciseness5/5

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

Three sentences, front-loaded with purpose then the update contract then routing and the dangerous-path caution. The field enumeration is long but functional, and every clause either routes the agent or prevents a specific mistake; nothing is padding.

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 19-parameter mutation tool with no output schema and nested objects, the description covers the highest-risk behaviors — partial update semantics, duplicate avoidance, and the scope-gated publish path. It does not itself explain the per-network specifics (tiktok settings, instagramStory, repeat), but those are fully described in the schema, so the remaining gap is small.

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

Parameters5/5

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

Schema coverage is already 100%, so the baseline is 3, but the description adds semantics the schema does not: the update contract ("only the fields given are changed", overrides replaced wholesale when given, kept when omitted — with the concrete instruction to pass every entry to keep). That is exactly the operational meaning an agent needs to avoid accidentally wiping per-network overrides on a partial edit.

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?

States a specific verb (edits) plus the resource (an existing post) and enumerates the editable surfaces: text, link, hashtags, replies, media, media per network, targets, date, status. It also scopes the tool to three states (draft, review, scheduled) and explicitly says a published post cannot be edited, so an agent can distinguish it from schedule_post and cancel_post without opening a 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?

Names both alternatives and the condition that selects each: use instead of schedule_post to fix or reschedule without creating a duplicate, and instead of cancel_post when the post should still go out. It further gated the risky path (status "scheduled" publishes without approval, needs publish scope, only when the user asked), which is exactly the when/when-not guidance an agent needs.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources