Skip to main content
Glama

Update post

update_post
Destructive

Changes a post before it publishes: its title, brief, scheduled_at or AI label, and per target (by target_id) the caption, media, cover, public title, mode, own time, account or AI label. Any change to an approved post sends it back to needs approval; a person must approve it again, and is told it changed after they approved it. The one exception: moving an approved post later and changing nothing else (scheduled_at, or targets[].scheduled_at alone, every platform at its old time or later and in the future; not "next_slot") keeps its approval, and the person sees that in History. A post with approval.overdue missed its time while waiting for approval: it moves with scheduled_at "next_slot" or one of its suggested_times, which the person can pick from. On a post with changes requested (approval.changes in get_post), the asked changes are made here: it goes back to needs approval and the notes are marked addressed for the person. Edits apply in order; if one is refused, the earlier ones stay. Refused for targets already posted or publishing. Captions may contain {link}, replaced by the brand site link with UTM tags. Facebook and LinkedIn captions must contain {link} unless the first_comment does; Instagram and TikTok must not contain links ("Link in bio" is the usual line). Threads takes one hashtag at most, Instagram 5 and 20 @ mentions. Google Business Profile takes 1,500 characters and no hashtags; put its link on the button (google.button) rather than in the text, and keep phone numbers and emails out of it (Google may remove the post). TikTok takes 2,200 characters on a video and 4,000 on a photo post. X counts 280 its own way (a link is 23, an emoji or a Chinese, Japanese or Korean character 2), and X posts with a link ({link}, a URL or a bare domain like example.com) are capped per calendar month (UTC) by plan: get_workspace gives x_link_posts used and left. The brand rules from get_brand apply too.

Input Schema

NameRequiredDescriptionDefault
briefNo
titleNo
post_idYes
targetsNo
ai_generatedNoTrue when the content is AI-made or AI-edited and looks realistic. Instagram gets its AI info label; YouTube gets its altered or synthetic content declaration; TikTok drafts must be labelled by hand in the app; Threads and Facebook have no label.
scheduled_atNoISO 8601 with an offset, e.g. 2026-10-06T09:00:00-07:00 for 9am in Los Angeles. A time without an offset is read as UTC. The workspace's time zone is in get_workspace. Or "next_slot": each platform takes the next of its posting times in the next 30 days that no other post of this brand takes on that platform (taken means the exact same time, so a post at 09:05 leaves 09:00 free). A platform's posting times are the brand's own for it (brands[].platform_posting_weeks in get_workspace), else the workspace's posting_week. Platforms on the same times go out together, at the first time free on all of them; one on other times gets its own time on its target. The answer gives the post's time (scheduled_at, local_time) and each target's. Refused when there are no posting times or all are taken. With "next_slot", every platform not yet out is placed again, replacing any own time it had.

Output Schema

NameRequiredDescriptionDefault
titleYes
statusYes
post_idYes
targetsYes
approvalYes
preview_urlYes
approval_urlYes
scheduled_atYes
allowed_actionsYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changed
    • changedInput schema / properties / targets / items / properties / first_comment / anyOf
      Previous value: -[
      -  {
      -    "description": "Posted as the first comment right after the post: Instagram feed posts and carousels (2,200 characters; not a single video, which is a Reel), Facebook (8,000), LinkedIn (1,250), Threads (500; a reply that counts toward Threads' 250 posts a day) and YouTube (10,000; regular videos and Shorts; posted but not pinned, pin it in YouTube Studio). Not TikTok, X, Bluesky or Pinterest. On LinkedIn and Facebook put the link here ({link}) rather than in the caption; on Instagram links in comments are not clickable either, so say \"Link in bio\". Hashtags: Threads one, Instagram 5 across caption and comment. {link} and the brand rules apply as in captions. A person approves it with the post.",
      -    "maxLength": 20000,
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "description": "Posted as the first comment right after the post: Instagram feed posts and carousels (2,200 characters; not a single video, which is a Reel), Facebook (8,000), LinkedIn (1,250), Threads (500; a reply that counts toward Threads' 250 posts a day) and YouTube (10,000; regular videos and Shorts; posted but not pinned, pin it in YouTube Studio). Not TikTok, X, Bluesky, Pinterest or Google Business Profile. On LinkedIn and Facebook put the link here ({link}) rather than in the caption; on Instagram links in comments are not clickable either, so say \"Link in bio\". Hashtags: Threads one, Instagram 5 across caption and comment. {link} and the brand rules apply as in captions. A person approves it with the post.",
      +    "maxLength": 20000,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / targets / items / properties / first_comment / description
      Previous value: -"Posted as the first comment right after the post: Instagram feed posts and carousels (2,200 characters; not a single video, which is a Reel), Facebook (8,000), LinkedIn (1,250), Threads (500; a reply that counts toward Threads' 250 posts a day) and YouTube (10,000; regular videos and Shorts; posted but not pinned, pin it in YouTube Studio). Not TikTok, X, Bluesky or Pinterest. On LinkedIn and Facebook put the link here ({link}) rather than in the caption; on Instagram links in comments are not clickable either, so say \"Link in bio\". Hashtags: Threads one, Instagram 5 across caption and comment. {link} and the brand rules apply as in captions. A person approves it with the post. null or empty removes it."New value: +"Posted as the first comment right after the post: Instagram feed posts and carousels (2,200 characters; not a single video, which is a Reel), Facebook (8,000), LinkedIn (1,250), Threads (500; a reply that counts toward Threads' 250 posts a day) and YouTube (10,000; regular videos and Shorts; posted but not pinned, pin it in YouTube Studio). Not TikTok, X, Bluesky, Pinterest or Google Business Profile. On LinkedIn and Facebook put the link here ({link}) rather than in the caption; on Instagram links in comments are not clickable either, so say \"Link in bio\". Hashtags: Threads one, Instagram 5 across caption and comment. {link} and the brand rules apply as in captions. A person approves it with the post. null or empty removes it."
    • addedInput schema / properties / targets / items / properties / google
      Added value: +{
      +  "anyOf": [
      +    {
      +      "description": "Google Business Profile only: the post's type, event, offer and button. Left out, a plain update with no button. A person approves it with the post.",
      +      "properties": {
      +        "button": {
      +          "anyOf": [
      +            {
      +              "properties": {
      +                "type": {
      +                  "description": "learn_more, book, order (Order online), shop (Buy) or sign_up.",
      +                  "enum": [
      +                    "learn_more",
      +                    "book",
      +                    "order",
      +                    "shop",
      +                    "sign_up"
      +                  ],
      +                  "type": "string"
      +                },
      +                "url": {
      +                  "description": "https link where the customer does it, or {link} for the brand link.",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "type",
      +                "url"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "The button under the post."
      +        },
      +        "event": {
      +          "anyOf": [
      +            {
      +              "properties": {
      +                "end": {
      +                  "description": "Same form as start; a time on both or neither.",
      +                  "type": "string"
      +                },
      +                "start": {
      +                  "description": "YYYY-MM-DD, or YYYY-MM-DDTHH:MM with a time, in the business’s own time.",
      +                  "type": "string"
      +                },
      +                "title": {
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "title",
      +                "start",
      +                "end"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "An event, or the dates an offer runs. Google removes it once it has ended."
      +        },
      +        "offer": {
      +          "anyOf": [
      +            {
      +              "properties": {
      +                "coupon_code": {
      +                  "type": "string"
      +                },
      +                "redeem_url": {
      +                  "description": "https link, or {link}.",
      +                  "type": "string"
      +                },
      +                "terms": {
      +                  "type": "string"
      +                }
      +              },
      +              "type": "object"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "post_type": {
      +          "description": "update (the default): news about the business. event: needs event. offer: a sale or deal; needs event too (its title and the dates it runs), plus any of offer.",
      +          "enum": [
      +            "update",
      +            "event",
      +            "offer"
      +          ],
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Google Business Profile only: the post's type, event, offer and button. Left out, a plain update with no button. A person approves it with the post. null makes it a plain update again."
      +}
    • changedInput schema / properties / targets / items / properties / media_id / description
      Previous value: -"null with no media_ids makes it a text post (its cover and frame offset go too). Media is optional on Facebook, Threads, LinkedIn, X, Bluesky: leave media_id and media_ids out for a text post. Instagram, TikTok, YouTube, Pinterest need an image or video."New value: +"null with no media_ids makes it a text post (its cover and frame offset go too). Media is optional on Facebook, Threads, LinkedIn, X, Bluesky, Google Business Profile: leave media_id and media_ids out for a text post. Instagram, TikTok, YouTube, Pinterest need an image or video."
    • changedInput schema / properties / targets / items / properties / media_ids / description
      Previous value: -"A carousel: 2 or more media ids in posting order, first is the cover. Give this or media_id, not both. Instagram up to 10 (images and videos), Threads 20, Facebook 10 images, TikTok photo posts 35 images, LinkedIn 20 images, YouTube none."New value: +"A carousel: 2 or more media ids in posting order, first is the cover. Give this or media_id, not both. Instagram up to 10 (images and videos), Threads 20, Facebook 10 images, TikTok photo posts 35 images, LinkedIn 20 images, YouTube, Pinterest and Google Business Profile none."
  2. First observed

TDQS

A4.4/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing side effects that matter: edits to an approved post force re-approval and notify the approver, the moving-later exception preserves approval, overdue posts move only via next_slot or suggested_times, and refused targets leave earlier edits in place. These are exactly the non-obvious behaviors an agent needs before mutating a live post.

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

Conciseness3/5

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

Purpose and edit scope are front-loaded, but the body is a dense wall of platform-specific trivia (character limits, hashtag caps, media rules) that largely duplicates the schema's own descriptions, making the text longer than the decision-making guidance requires.

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?

An output schema exists and annotations already carry the destructive/non-idempotent profile, so return values and safety need no repetition. The description is strong on approval flow and refusals, but is thin on the meaning of a few top-level fields (account_id, mode) that still have to be inferred.

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 on the top-level parameters is partial, and the description compensates by explaining scheduled_at semantics ('next_slot', moving an approved post later, ISO offsets), the per-target field set, and ai_generated's platform labels. brief, title, post_id and account_id are still left largely to the schema, so it does not fully close the gap.

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?

Opens with a specific verb and resource ('Changes a post before it publishes') and then enumerates exactly which parts are editable (title, brief, scheduled_at, AI label, per-target caption/media/cover/title/mode/time/account). This clearly distinguishes it from siblings like create_post, check_post, get_post and cancel_post.

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

Usage Guidelines4/5

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

Gives concrete context for when edits are applied versus refused (targets already posted or publishing), and routes the agent to get_post, get_workspace, get_brand and suggest_cover for dependent data. It does not, however, explicitly contrast update_post with close alternatives such as check_post or request_approval when deciding whether to edit at all.

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