Skip to main content
Glama

Edit a post

update_post
Destructive

Change a post that has not gone out — caption, media, time, per-platform options; anything left out is kept. The reply is a NEW post with a new id and a new link; replaced names the old one, which is gone. add_media_ids and files append to what the post holds; media_ids replaces it. A picture the person added in the approval card is already on the post. Editing an approved or rejected post puts it back in the approval queue, and message says which of the two happened. A post already tried is not editable: retry_delivery handles the delivery that failed. Send a draft with is_draft: false — creating it again instead posts the words twice.

Input Schema

NameRequiredDescriptionDefault
filesNoFiles the user attached to this conversation, appended after what the post holds.
captionNoThe new text. It must still fit every target's own limit — X is 280 as X counts it — or the edit is refused and the post keeps its old words.
post_idYesThe post to change — an id list_posts returned, never one built from memory. Every edit gives the post a NEW id (the answer's `id`); use that one next time. An id an edit retired is refused with `error_code: replaced` and `replaced_by`, the current id. An id this project does not hold is refused with `error_code: not_found`; read the list again rather than trying another id.
is_draftNo`false` sends a draft: it leaves the drawer and goes out at its time, or now, or to the approval queue — whichever the project does. This is how a draft is finished; creating the post again instead leaves the draft behind and publishes the words twice. `true` puts a post that has not gone out back into the drawer. Omit to keep it as it is.
media_idsNoReplaces the attachments; omit to keep them.
scheduled_atNoNew time (Z or an offset); "next_slot" hands it to the project's queue; null clears it, and it goes out now — or once approved, on a project that holds agent posts.
add_media_idsNoAppended after what the post already holds.
platform_configurationsNoReplaces the per-platform options; omit to keep them.

Output Schema

NameRequiredDescriptionDefault
idNo
okNoPresent and false only on a refusal.
errorNoWhat was refused, in a sentence, when `ok` is false.
shownNoWhere this post is already on screen, and that a receipt call now would show it a second time.
statusNopending_approval | scheduled | processing | draft
captionNo
messageNoAbout this post, written to be passed on: why it is held, or that a draft goes nowhere until someone sends it.
missingNoWhat the post still lacks before it can go out.
repeatedNoThis idempotency_key was already used — `id` is that earlier post, nothing new was written.
replacedNoupdate_post: the id of the post this one replaced. That post and its approval link are gone; this post's link stands in for them.
timezoneNo
plans_urlNoPublic page explaining what the plans include. Sent with free_first_post, with publishing_needs_plan, and on a refusal with error_code needs_plan.
publishesNoWhat has to happen before it goes out. Null on a draft or a rejected post.
retriableNoFalse when asking again cannot change the answer.
attach_nowNoThis host cannot send the file: the person adds it in the card, which offers its drop zone straight away.
created_atNo
error_codeNoMachine reason for a refusal.
plans_linkNoThe same page as a ready-made Markdown link. On a refusal with error_code needs_plan, include it in the reply as-is — it is where the person activates a plan.
upload_urlNoOn a held post: where a picture is POSTed as multipart form-data with a `file` field, no key needed. An environment that holds the file can run `upload_curl`; the person's card uses the same door.
connect_urlNoWhere an account is connected. On a refusal about an account that is not there.
needs_mediaNoA draft with no picture or video for a destination that needs one; `missing` names them. It cannot be sent as it stands — attach media with update_post, or the person adds it in xpost.
release_urlNoAfter POSTing every file to upload_url, POST this once and the post goes out. In the card the person presses it instead.
replaced_byNoThe id the post has now, when you asked with one an edit retired. An edit gives a post a new id: get_delivery_receipt and get_post_metrics answer for this current version (and `asked_for` is the id you sent); update_post and delete_post refuse with error_code `replaced`. Use this id from here on.
upload_curlNoThe upload as one shell command, YOUR_FILE replaced by the path.
preview_linkNoA post nobody has to approve, as a ready-made Markdown link to it — the post as each network will draw it, its slot if it has one, and the receipt per account once it has gone. A DRAFT gets one too: it has no slot and nothing is waiting, and the link is the only way the person can see what was written without going to look for it. Give it to the person.
queued_postsNoHow many posts are scheduled, none of them going anywhere beyond the free first one. Sent with publishing_needs_plan on a scheduled post.
scheduled_atNoThe slot it got. NULL when it waits on approval — never a stand-in time.
approval_linkNoA ready-made Markdown link to the post as a page, with Approve and Reject on it.
free_post_nowNoRefused only because it was scheduled. The same call with no scheduled_at publishes now, free.
pace_warningsNoAccounts getting more posts in one day than the network likes — it may treat that as spam. Nothing is held. Mention it to the person once and offer to spread the rest out; don't stop to ask on every post.
awaiting_mediaNoCreated without its picture (media_pending). It cannot be approved until one is on it.
drafts_waitingNoHow many drafts are now waiting, none of them on its way anywhere. Sent with publishing_needs_plan.
free_post_rideNoWith free_first_post: this post reached another of their accounts as part of the same free first post, sent in the same reply. One free delivery per account, within a few minutes of the first.
replaced_draftNoThis post FINISHED a draft that held the same words for the same accounts: that draft is gone and this post stands in for it. Say there is one copy.
connect_messageNo
free_first_postNoThis post is the user's one free post — no plan was needed for it.
upload_max_bytesNoThe most `upload_url` takes in one request; bigger files go through the card.
releases_on_mediaNoHeld for its picture only: it goes out on its own once every picture is on it. Nothing to approve.
first_post_messageNoAbout that, written to be passed on; it carries the next step.
x_trial_link_limitNoX will not receive this post: the trial's posts with a link on X are used up. Every other account still gets it. Without the link, X gets it as usual.
x_monthly_link_limitNoX will not receive this post: this month's posts with a link on X are used up on their plan. Every other account still gets it. Without the link, X gets it as usual.
publishing_needs_planNoNothing here can publish beyond the one free post: sending needs an xpost subscription. Nothing REFUSES a draft or a scheduled post any more — a queue may be filled without one — so this is the only warning, and it is worth passing on as it is written rather than discovered one slot at a time.
free_post_awaiting_approvalNoRefused because their free first post is already waiting for their approval; approval_link opens it. Nothing needs buying.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / properties / replaced_by / description
      Previous value: -"With error_code `replaced`: the id the post has now. An edit gives a post a new id; use this one."New value: +"The id the post has now, when you asked with one an edit retired. An edit gives a post a new id: get_delivery_receipt and get_post_metrics answer for this current version (and `asked_for` is the id you sent); update_post and delete_post refuse with error_code `replaced`. Use this id from here on."
  2. Changed1 schema field changed
    • addedOutput schema / properties / x_monthly_link_limit
      Added value: +{
      +  "description": "X will not receive this post: this month's posts with a link on X are used up on their plan. Every other account still gets it. Without the link, X gets it as usual.",
      +  "type": "boolean"
      +}
  3. Changed1 schema field changed
    • addedOutput schema / properties / pace_warnings
      Added value: +{
      +  "description": "Accounts getting more posts in one day than the network likes — it may treat that as spam. Nothing is held. Mention it to the person once and offer to spread the rest out; don't stop to ask on every post.",
      +  "items": {
      +    "additionalProperties": {},
      +    "properties": {
      +      "account_id": {
      +        "type": "string"
      +      },
      +      "new_account": {
      +        "type": "boolean"
      +      },
      +      "platform": {
      +        "type": "string"
      +      },
      +      "posts_within_a_day": {
      +        "type": "number"
      +      },
      +      "same_site": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "domain": {
      +            "type": "string"
      +          },
      +          "posts": {
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "suggested_per_day": {
      +        "type": "number"
      +      },
      +      "username": {
      +        "type": "string"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  4. Changed1 schema field changed
    • changedOutput schema / properties / free_post_ride / description
      Previous value: -"With free_first_post: this post reached another of their accounts as part of the same free first post, written minutes earlier. One free delivery per account, within half an hour of the first."New value: +"With free_first_post: this post reached another of their accounts as part of the same free first post, sent in the same reply. One free delivery per account, within a few minutes of the first."
  5. Changed2 schema fields changed
    • changedInput schema / properties / post_id / description
      Previous value: -"The post to change — an id list_posts returned, never one built from memory. An id this project does not hold is refused with `error_code: not_found`; read the list again rather than trying another id."New value: +"The post to change — an id list_posts returned, never one built from memory. Every edit gives the post a NEW id (the answer's `id`); use that one next time. An id an edit retired is refused with `error_code: replaced` and `replaced_by`, the current id. An id this project does not hold is refused with `error_code: not_found`; read the list again rather than trying another id."
    • addedOutput schema / properties / replaced_by
      Added value: +{
      +  "description": "With error_code `replaced`: the id the post has now. An edit gives a post a new id; use this one.",
      +  "type": "string"
      +}
  6. Changed3 schema fields changed
    • changedOutput schema / properties / drafts_waiting / description
      Previous value: -"How many drafts this project now holds, none of them on its way anywhere. Sent with publishing_needs_plan."New value: +"How many drafts are now waiting, none of them on its way anywhere. Sent with publishing_needs_plan."
    • changedOutput schema / properties / publishing_needs_plan / description
      Previous value: -"Nothing on this project can publish beyond its one free post: sending needs a plan. Nothing REFUSES a draft or a scheduled post any more — a queue may be filled without one — so this is the only warning, and it is worth passing on as it is written rather than discovered one slot at a time."New value: +"Nothing here can publish beyond the one free post: sending needs an xpost subscription. Nothing REFUSES a draft or a scheduled post any more — a queue may be filled without one — so this is the only warning, and it is worth passing on as it is written rather than discovered one slot at a time."
    • changedOutput schema / properties / queued_posts / description
      Previous value: -"How many posts are scheduled on this project, none of them going anywhere beyond the free first one. Sent with publishing_needs_plan on a scheduled post."New value: +"How many posts are scheduled, none of them going anywhere beyond the free first one. Sent with publishing_needs_plan on a scheduled post."
  7. Changed1 schema field changed
    • addedOutput schema / properties / plans_link
      Added value: +{
      +  "description": "The same page as a ready-made Markdown link. On a refusal with error_code needs_plan, include it in the reply as-is — it is where the person activates a plan.",
      +  "type": "string"
      +}
  8. Changed1 schema field changed
    • changedInput schema / properties / scheduled_at / description
      Previous value: -"New time (Z or an offset); \"next_slot\" hands it to the project's queue; null clears it so it goes out once approved."New value: +"New time (Z or an offset); \"next_slot\" hands it to the project's queue; null clears it, and it goes out now — or once approved, on a project that holds agent posts."
  9. Changed1 schema field changed
    • addedOutput schema / properties / shown
      Added value: +{
      +  "description": "Where this post is already on screen, and that a receipt call now would show it a second time.",
      +  "type": "string"
      +}
  10. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the annotations: it discloses that the response is a NEW post with a new id, that the old id is retired (`replaced`, error_code: replaced / not_found), that editing an approved or rejected post re-enters the approval queue with `message` reporting which, and that an over-limit caption is refused while keeping the old words. These are exactly the consequences destructiveHint=true and idempotentHint=false imply but do not spell out.

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?

Front-loaded with the purpose and the id-replacement consequence, and most sentences carry non-obvious information. However, the draft double-post warning appears nearly verbatim twice, and the description is long enough that some density could be trimmed without losing meaning.

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?

An output schema exists so return values need not be explained, and the description nonetheless previews the meaningful response fields (`replaced`, `id`, `message`) and the error codes an agent must handle. For a destructive, non-idempotent, nested-parameter edit tool, nothing needed for correct invocation is missing.

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 baseline is 3; the description still adds real semantics by contrasting the three media paths (`add_media_ids`/`files` append, `media_ids` replaces) and by noting that a picture added in the approval card is already on the post. `scheduled_at` and `platform_configurations` are only gestured at, so it stops short of full parameter coverage.

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 and resource ("Change a post") plus the crucial qualifier "that has not gone out", and enumerates the editable facets (caption, media, time, per-platform options). It also implies the boundary against create_post and retry_delivery so an agent can tell it apart without opening schemas.

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?

Explicitly routes away from this tool in two cases and names the sibling to use instead: a failed post goes to retry_delivery, and finishing a draft must be done with `is_draft: false` rather than calling create_post again ("posts the words twice"). Both the when and the when-not are stated.

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.