Skip to main content
Glama

Edit a scheduled post (caption, first comments, platforms)

update_scheduled_post
DestructiveIdempotent

[PUBLISHES to social accounts · publish scope] CHANGES WHAT A SCHEDULED POST WILL PUBLISH on real accounts, keeping its slot, accounts, options, labels and draft. firstComment sets per-platform first comments (linkedin, facebook, instagram, threads, youtube; null removes; X/Bluesky have none); text / platformText change the caption; applyAutoFirstComment: true adds the brand's auto first comment where none is set; removePlatforms drops platforms from this booking (e.g. a duplicate TikTok); labels replaces the post's own labels (e.g. ["repost:evergreen"]; alone it never touches the booking, status "labeled"). Updated in place when the platform scheduler allows it, otherwise re-booked at the same slot (status "rebooked", new postId). Refused within 5 minutes of the slot. Repeating the same edit returns "unchanged". Needs the publish scope (or admin) and the Pro plan or higher; each publish counts against the plan's direct posts for the month. Confirm the new text with the user first. (Wraps PATCH /api/v2/posts/{id}.)

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "id": "<id>"
    },
    "name": "update_scheduled_post"
  }
}

Input Schema

NameRequiredDescriptionDefault
idYesThe post: `convexPostId` from POST /api/v2/publish, or `posts[].id` from GET /api/v2/content/{id}.
textNoThe caption (every platform without its own).
labelsNoSets this post's own labels ([] or null clears; labelMode add appends), e.g. ["repost:evergreen"]. flayr metadata: sent alone it never touches the booking (status "labeled") and works on posted posts too. With booking edits, metadata is saved after a successful edit. Normalized "key:value" labels (keys and values are lower-cased, spaces become "-"). Linked keys: campaign:<media campaign id>, experiment:<experiment id> (+ variant:<name> or the experiment's compareKey), type:<post type> (short, long-form, carousel, image, text, reel, story, poem, timelapse…). Free keys work too: cut:opus, lane:tech, parent:pantheon-part-1, ab:<pair id> (an A/B pair). Labels are copied onto every post made from the draft, and compared in GET /api/v2/analytics/experiments.
labelModeNoDefault set. add atomically appends labels to the post and matching instances; other instances stay unchanged.
scheduledAtNoMove the post to this time (ISO 8601 with Z or an offset, e.g. "2026-11-19T15:00:00Z"); more than 5 minutes in the future. Send it on its own: no other field with it.
firstCommentNoThe first comment the post publishes, per platform: a string sets it, null or "" removes it; platforms not named keep theirs. X and Bluesky have no first comment at the platform scheduler and are refused (422). A Facebook / Instagram Story never gets one. flayr's own "Posted with flayr.social" line on a comment is kept. Also saved on the post's draft, so a later edit never puts the old one back.
platformTextNoPer-platform captions, merged into the draft's: { "linkedin": "…" } sets one, null / "" clears it; null clears them all.
instanceLabelsNoInternal labels per platform/account instance. An array of {platform, accountId?, labels}; accountId is the Zernio connected account id. Omit accountId when unknown. instanceKey is derived as canonical platform + ":account:" + URL-encoded account id, or ":pending" when unknown (twitter canonicalizes to x). Replaces the instance set when editing; [] clears it. Never published.
removePlatformsNoPlatform ids to drop from this booking (e.g. a duplicate ["tiktok"]). Each must be on the post; dropping every platform is refused (use DELETE). The booking is rebuilt from the draft.
applyAutoFirstCommentNoAdd the brand's auto first comment where the post has none.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changed
    • addedInput schema / properties / instanceLabels
      Added value: +{
      +  "description": "Internal labels per platform/account instance. An array of {platform, accountId?, labels}; accountId is the Zernio connected account id. Omit accountId when unknown. instanceKey is derived as canonical platform + \":account:\" + URL-encoded account id, or \":pending\" when unknown (twitter canonicalizes to x). Replaces the instance set when editing; [] clears it. Never published.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "accountId": {
      +        "maxLength": 200,
      +        "type": "string"
      +      },
      +      "labels": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "maxItems": 30,
      +        "type": "array"
      +      },
      +      "platform": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "platform",
      +      "labels"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 20,
      +  "type": "array"
      +}
    • addedInput schema / properties / labelMode
      Added value: +{
      +  "description": "Default set. add atomically appends labels to the post and matching instances; other instances stay unchanged.",
      +  "enum": [
      +    "set",
      +    "add"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / labels
      Added value: +{
      +  "description": "Sets this post's own labels ([] or null clears; labelMode add appends), e.g. [\"repost:evergreen\"]. flayr metadata: sent alone it never touches the booking (status \"labeled\") and works on posted posts too. With booking edits, metadata is saved after a successful edit. Normalized \"key:value\" labels (keys and values are lower-cased, spaces become \"-\"). Linked keys: campaign:<media campaign id>, experiment:<experiment id> (+ variant:<name> or the experiment's compareKey), type:<post type> (short, long-form, carousel, image, text, reel, story, poem, timelapse…). Free keys work too: cut:opus, lane:tech, parent:pantheon-part-1, ab:<pair id> (an A/B pair). Labels are copied onto every post made from the draft, and compared in GET /api/v2/analytics/experiments.",
      +  "items": {
      +    "pattern": "^[a-z0-9][a-z0-9_-]{0,31}:[a-z0-9][a-z0-9._\\-/+]{0,79}$",
      +    "type": "string"
      +  },
      +  "maxItems": 30,
      +  "type": [
      +    "array",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / scheduledAt
      Added value: +{
      +  "description": "Move the post to this time (ISO 8601 with Z or an offset, e.g. \"2026-11-19T15:00:00Z\"); more than 5 minutes in the future. Send it on its own: no other field with it.",
      +  "format": "date-time",
      +  "type": "string"
      +}
  2. First observed

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare destructive/openWorld/idempotent, and the description goes well beyond them: it discloses two distinct execution paths (in-place vs. rebooked at the same slot with a new postId), the status strings returned ("rebooked", "labeled", "unchanged"), the 5-minute refusal window, per-month plan quota consumption, and that changes hit real accounts. It is consistent with destructiveHint=true and idempotentHint=true.

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?

The most consequential facts — what is mutated, permission/plan requirements — are front-loaded in the first sentence, and the backtick-quoted parameter names make it scannable. It is still a single very dense paragraph with parenthetical asides and some redundancy against the schema, but little of it is genuinely wasted.

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

Completeness5/5

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

For a 10-parameter, nested-object mutation with no output schema, the description covers everything an agent needs: permissions, plan/quota consequences, the rebook-vs-in-place outcome, return status values, refusal windows, and the confirmation requirement. Nothing material about calling it correctly is left unstated.

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

Parameters3/5

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

The input schema is fully documented at 100% coverage, so the baseline applies. The description restates the salient parameters (text/platformText, firstComment, applyAutoFirstComment, removePlatforms, labels) and adds a useful orientation — e.g. that firstComment is per-platform and X/Bluesky have none — but most of that detail is already in the schema text and it omits scheduledAt, labelMode, and instanceLabels entirely.

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 opening clause names a specific verb and object — "CHANGES WHAT A SCHEDULED POST WILL PUBLISH on real accounts" — and immediately delimits what is preserved (slot, accounts, options, labels, draft), which cleanly separates it from reschedule_post, cancel_scheduled_post, and edit_post_labels. The title reinforces it with the three editable areas.

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 clear operative context: it is for editing a scheduled post (not a published one), it is refused within 5 minutes of the slot, requires `publish` scope and Pro plan, and repeating an edit is a no-op. It also instructs to confirm new text with the user first. It never names sibling alternatives (e.g. use reschedule_post to move time, or DELETE to remove all platforms), so the routing guidance is contextual rather than exclusionary.

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