Skip to main content
Glama

update_post

Update an existing post. Only draft and scheduled posts can be updated.

Per-platform options (youtube, pinterest, instagram, tiktok, google_business) are accepted here, same shape as in create_post. Pass an object — never a JSON-encoded string. For YouTube Shorts, the title lives at youtube.title; the video description lives in content (or content.youtube for a per-platform override). They are not the same field — changing the caption does NOT rename the Short.

X threads: To convert an existing draft into a chained X thread, pass x.thread_parts as a 2–25 entry array of { text } objects (each ≤ 280 chars). Pass x.thread_parts: null to revert to single-tweet mode. Do NOT shove "1/", "2/" into content — that's a single tweet, not a thread.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
xNoX (Twitter) options, including thread mode via `thread_parts`.
idYesThe post ID to update
tiktokNoTikTok options
blueskyNoBluesky options, including thread mode via `thread_parts`.
contentNoUpdated post caption / body text. For YouTube Shorts this becomes the video description, NOT the title — to rename the Short, use `youtube.title`. String or object with platform keys: { "default": "fallback", "linkedin": "long" }.
threadsNoThreads options: thread mode via `thread_parts`, location tag via `location_id`.
youtubeNoYouTube Shorts options. Only applies when type is 'reel' and youtube is among the selected channels. A custom Shorts thumbnail is set with the top-level `video_cover` (a `youtube` override for a YouTube-only image); it shows on Shorts only on channels where YouTube has enabled custom Shorts thumbnails (Partner Program channels first, since July 2026), other channels show a frame from the video.
channelsNoUpdated channel IDs. Note: `linkedin` (personal profile) and `linkedin_page` (company page) are independent channels.
facebookNoFacebook options
link_urlNoURL to share as a rich preview card on platforms that support link-share posts (LinkedIn and Facebook). Renders as a tile with thumbnail/title/description instead of plain text. Ignored on platforms that don't support link shares, and ignored on posts that already have media attached (media wins).
linkedinNoLinkedIn Profile options
mastodonNoMastodon options, including thread mode via `thread_parts`.
instagramNoInstagram options
media_idsNo
pinterestNo
user_tagsNoInstagram only. Tag public accounts at x/y positions on a PHOTO (not video/reels/stories). For a single image omit image_index; for a carousel, set image_index to the slide each tag belongs to. Private/non-existent usernames are rejected at publish time. Ignored by other platforms.
link_titleNoOptional title for the link-share preview. LinkedIn uses this when set; Facebook ignores it and fetches OG metadata server-side. Omit to let LinkedIn auto-fetch the page title.
media_urlsNoExternal image/video/PDF URLs — flat array or per-platform object. Max 10 total (Pinterest: max 5 images per carousel pin), each file ≤ 100 MB. Entries are URL strings or { url, alt } objects (alt = accessibility description, delivered to Mastodon/Bluesky/X/Pinterest/Instagram (images)/LinkedIn (images)). For larger files (up to 1 GB): upload_media with method 'url' first, then pass the returned media id in `media`.
location_idNoInstagram only. Facebook Place ID for a single physical venue (with a street address) to tag the post's location. Find it via the location search in the OmniSocials dashboard. Ignored by other platforms.
video_coverNoReplaces the stored video cover wholesale; pass null to remove it; omit to leave it untouched. facebook.thumbnail_type / thumb_offset / cover_url merge into overrides.facebook on their own.
scheduled_atNoUpdated scheduled date (ISO 8601)
collaboratorsNoInstagram only. Up to 3 public Instagram usernames to invite as co-authors (the 'Collab' feature). Works on image, carousel, and reel posts — NOT Stories. Invited users get an invite in the Instagram app; once they accept, the post also appears on their profile and feed. A leading '@' is stripped; usernames are case-insensitive. Private or non-existent usernames are rejected by Instagram at publish time. Ignored by other platforms.
linkedin_pageNoLinkedIn Company Page options
linkedin_pollNoNon-sponsored LinkedIn poll(s) — independent per channel, keyed by `linkedin` (personal profile) / `linkedin_page` (company page). A poll is mutually exclusive with media and a link share on that channel's post — a poll takes priority over both at publish time. Still requires `content.linkedin` (or `content.default`) as that channel's caption; the poll itself only carries the question/options/duration. On update_post, set a channel's key to `null` to clear that channel's poll and revert it to a normal post — send the full desired state for both channels, since the whole object replaces wholesale.
google_businessNoGoogle Business Profile options. Use to publish EVENT or OFFER posts, attach a CTA button, or both. Shape mirrors Google's LocalPost resource (see https://developers.google.com/my-business/reference/rest/v4/accounts.locations.localPosts#LocalPost). Google Business caption rules (enforced at scheduling — text that violates these will return a `validation_error` 400 before the post is saved): • Phone numbers in the caption are rejected — use a CALL button instead. • Inline URLs / bare domains / emails are rejected — use LEARN_MORE / BOOK / SHOP / SIGN_UP / ORDER buttons instead. • Caption max 1500 characters. • Media is optional (text-only posts are allowed). If attached: exactly one JPEG/PNG/WebP image (no video, no carousels). • The workspace must have a Google Business location selected (Settings → Organisation → Workspaces → Google Business) before scheduling — otherwise returns a 400.
link_descriptionNoOptional description for the link-share preview. LinkedIn uses this when set; Facebook auto-fetches the OG description.
link_thumbnail_urlNoOptional thumbnail image URL for the preview card. Currently applied on Facebook; reserved for LinkedIn.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedInput schema / properties / pinterest / properties / product_tags
      Added value: +{
      +  "description": "Products to tag on the Pin, so people can shop the items in the image. Up to 24 product Pins of the connected Pinterest account, each as a Pin ID string or a Pin link (https://www.pinterest.com/pin/<id>/). Get the IDs with list_pinterest_products. Only the account's own product Pins can be tagged (public, with a link on a website the account claimed on Pinterest); products of other merchants cannot. The tags are added right after the Pin is published; a product Pinterest refuses never fails the post, and get_post shows the outcome (product_tags_result). On update_post the pinterest object replaces the stored one, so leave product_tags out to remove the tags.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "maxItems": 24,
      +  "type": "array"
      +}
  2. Changed5 schema fields changed
    • addedInput schema / properties / facebook / properties / cover_url
      Added value: +{
      +  "description": "Custom thumbnail image URL (JPEG/PNG, max 10 MB). Used with thumbnail_type 'from-library'.",
      +  "type": "string"
      +}
    • addedInput schema / properties / facebook / properties / thumb_offset
      Added value: +{
      +  "description": "Frame timestamp in MILLISECONDS from the start of the video (e.g. 3000 = 0:03). Used with thumbnail_type 'from-video'.",
      +  "type": "number"
      +}
    • addedInput schema / properties / facebook / properties / thumbnail_type
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "from-video",
      +        "from-library"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Video thumbnail for Facebook feed videos and reels: 'from-video' uses the frame at thumb_offset, 'from-library' uploads the image at cover_url. Applied after the video is live; a thumbnail failure never fails the post. On update_post, null removes the Facebook override."
      +}
    • addedInput schema / properties / video_cover
      Added value: +{
      +  "anyOf": [
      +    {
      +      "description": "Video thumbnail for a post whose media is ONE video. Applied on Instagram (feed videos and reels), Facebook (feed videos and reels), LinkedIn Profile and Page, TikTok, Pinterest and YouTube Shorts. YouTube Shorts: the cover shows on Shorts only on channels where YouTube has enabled custom Shorts thumbnails (rolling out since July 2026, Partner Program channels first); on other channels YouTube stores it as the default thumbnail but shows a frame from the video on Shorts. Say that it depends on the channel; do not promise it. TikTok only takes a frame: a 'custom' cover is skipped there, so add a tiktok override with type 'frame' when the user wants a specific TikTok frame. The per-platform reel fields (instagram.thumb_offset / cover_url, tiktok.video_cover_timestamp_ms, pinterest.video_cover) keep working and win over the base cover for their platform. get_post reads it back as `video_cover`.",
      +      "properties": {
      +        "cover_url": {
      +          "description": "Public image URL, JPEG or PNG (type 'custom').",
      +          "type": "string"
      +        },
      +        "overrides": {
      +          "additionalProperties": {
      +            "anyOf": [
      +              {
      +                "properties": {
      +                  "cover_url": {
      +                    "description": "Public image URL, JPEG or PNG (type 'custom').",
      +                    "type": "string"
      +                  },
      +                  "thumb_offset": {
      +                    "description": "Milliseconds into the video (type 'frame'). 3000 = 0:03.",
      +                    "maximum": 9007199254740991,
      +                    "minimum": 0,
      +                    "type": "integer"
      +                  },
      +                  "type": {
      +                    "description": "'frame' uses the video frame at thumb_offset; 'custom' uploads the image at cover_url.",
      +                    "enum": [
      +                      "frame",
      +                      "custom"
      +                    ],
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "type"
      +                ],
      +                "type": "object"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "description": "Per-platform overrides keyed by platform id (instagram, facebook, linkedin, linkedin_page, tiktok, pinterest, youtube). An override wins over the base cover for that platform.",
      +          "propertyNames": {
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "thumb_offset": {
      +          "description": "Milliseconds into the video (type 'frame'). 3000 = 0:03.",
      +          "maximum": 9007199254740991,
      +          "minimum": 0,
      +          "type": "integer"
      +        },
      +        "type": {
      +          "description": "'frame' uses the video frame at thumb_offset; 'custom' uploads the image at cover_url.",
      +          "enum": [
      +            "frame",
      +            "custom"
      +          ],
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "type"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Replaces the stored video cover wholesale; pass null to remove it; omit to leave it untouched. facebook.thumbnail_type / thumb_offset / cover_url merge into overrides.facebook on their own."
      +}
    • changedInput schema / properties / youtube / description
      Previous value: -"YouTube Shorts options. Only applies when type is 'reel' and youtube is among the selected channels."New value: +"YouTube Shorts options. Only applies when type is 'reel' and youtube is among the selected channels. A custom Shorts thumbnail is set with the top-level `video_cover` (a `youtube` override for a YouTube-only image); it shows on Shorts only on channels where YouTube has enabled custom Shorts thumbnails (Partner Program channels first, since July 2026), other channels show a frame from the video."
  3. First observed

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already establish it as a non-read-only, non-destructive, non-open-world mutation. The description goes beyond that by disclosing the draft/scheduled-only constraint and the thread ↔ single-post conversion mechanics (including null-to-revert), which are behavior an agent needs. It does not state merge-vs-replace semantics at the top level, leaving some mutation detail to the schema.

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?

Three tightly scoped, bold-headed blocks front-load the eligibility rule and then cover only the genuinely tricky areas (per-platform shape, YouTube title/content, X threads). For a 27-parameter nested tool this is compact, with little wasted wording.

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 high-complexity, 27-param, deeply nested tool with no output schema, the description covers the highest-risk pitfalls, and the 93%-covered schema handles the rest. Safety is covered by annotations, so nothing critical an agent needs to call it correctly appears missing, though fields like media/collaborators are left entirely to the schema.

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 description coverage is 93%, so the baseline is 3 and the schema carries most parameter meaning. The description adds real value over the schema by warning to pass objects rather than JSON-encoded strings and by disambiguating youtube.title from content for Shorts ('changing the caption does NOT rename the Short') and the x.thread_parts 2–25 shape.

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 first sentence names a specific verb (update) and resource (existing post), and immediately constrains the eligibility to draft and scheduled posts. It also specifies what the per-platform options and thread fields do, letting an agent distinguish it from create_post/publish_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 Guidelines4/5

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

The description gives a clear eligibility rule ('Only draft and scheduled posts can be updated') and explains thread-conversion usage ('pass x.thread_parts to convert a draft, null to revert'). It references create_post for shared option shape, but never explicitly states when to choose update_post over create_post or publish_post, so it stops short of full alternative routing.

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