Skip to main content
Glama

Create a post

create_post
Destructive

Create a post to connected accounts — X/Twitter, Instagram, LinkedIn, Facebook, TikTok, YouTube, Threads, Bluesky, Pinterest. CREATING IT SENDS IT: no scheduled_at publishes now, one publishes then; a project may hold it instead (status says). The answer carries message and approval_link or preview_link. accounts takes each account's ref. Media is media_ids, files (attachments from this conversation) or media_pending: true, which holds the post until the picture arrives — the reply's upload_url takes a POST of the file (upload_curl), or the person adds it in the card; then it goes out on its own unless the project holds agent posts. "next_slot" takes the queue; is_draft saves without sending. Undo: update_post or delete_post before it goes out; take_down_post after, where networks allow.

Input Schema

NameRequiredDescriptionDefault
filesNoFiles the user attached to this conversation, as the host hands them over, in post order. They are attached after `media_ids`.
captionNoThe post text. Optional only where no destination prints one: a story, or X/Instagram/LinkedIn publishing media alone. WRITE IT TO FIT EVERY TARGET: one destination over its own limit refuses the WHOLE post and nothing goes out anywhere — X is 280 as X counts it, and list_accounts gives each account its `caption_chars_available`. Words the person wrote are theirs: where they do not fit, say so and ask, never quietly shorten them.
accountsNoWhere it posts: each account's `ref` from list_accounts ("x:someone"). LIST EVERY ACCOUNT THIS POST GOES TO — one post, many accounts; a platform that needs different words gets them in platform_configurations.<platform>.caption, never a post of its own. A person reads this request before approving it, and the ref is what they can check. A ref matching nothing refuses the whole post.
is_draftNoSave as a draft: visible in xpost, publishing nowhere until a person sends it.
media_idsNoMedia ids from upload_media; first is the carousel lead.
scheduled_atNoISO 8601 with Z or an offset, or "next_slot" for the project's own posting schedule (get_project shows `queue`). Omit to publish now — or, on a project that holds agent posts, as soon as it is approved.
media_pendingNoThe picture is still to come: the person adds it in the approval card. Lets a post for Instagram, TikTok, YouTube or Pinterest be created without media; it goes out once the media is on it (or, on a project that holds agent posts, can be approved then).
idempotency_keyNoYour own id for THIS request, unique to it (not to the subject). A retry with the same key returns the post the first call made, as `repeated: true`, instead of a second post.
social_account_idsNoDeprecated name for `accounts`.
platform_configurationsNoPer-platform options keyed by platform: `caption` is that platform's own text (so one post can say it differently on X and on Instagram), `placement` picks "reels"/"stories" where offered. Which keys each account takes is what get_posting_rules answers. Example: {"instagram": {"placement": "stories"}, "x": {"caption": "the short one"}}

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
    • removedInput schema / properties / skip_signature
      Removed value: -{
      -  "description": "Leave the project's signature off this post. Only when the user asked for that in words.",
      -  "type": "boolean"
      -}
  5. 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."
  6. Changed1 schema field changed
    • 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"
      +}
  7. 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."
  8. 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"
      +}
  9. Changed2 schema fields changed
    • changedInput schema / properties / media_pending / description
      Previous value: -"The picture is still to come: the person adds it in the approval card. Lets a post for Instagram, TikTok, YouTube or Pinterest be created without media; it cannot be approved until the media is on it."New value: +"The picture is still to come: the person adds it in the approval card. Lets a post for Instagram, TikTok, YouTube or Pinterest be created without media; it goes out once the media is on it (or, on a project that holds agent posts, can be approved then)."
    • changedInput schema / properties / scheduled_at / description
      Previous value: -"ISO 8601 with Z or an offset, or \"next_slot\" for the project's own posting schedule (get_project shows `queue`). Omit to go out on approval."New value: +"ISO 8601 with Z or an offset, or \"next_slot\" for the project's own posting schedule (get_project shows `queue`). Omit to publish now — or, on a project that holds agent posts, as soon as it is approved."
  10. 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"
      +}
  11. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only say destructiveHint=true and openWorldHint=true; the description adds the critical context of WHAT gets destroyed and WHEN — 'CREATING IT SENDS IT', plus the project-holds-agent-posts exception and the approval/preview flow. The idempotency discussion is consistent with idempotentHint=false: retries only dedupe when the caller supplies its own `idempotency_key`, which the description makes explicit rather than contradicting the annotation.

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 single most important fact ('CREATING IT SENDS IT') is front-loaded in caps, and nearly every clause carries operational information. It is dense and telegraphic to the point of occasional ambiguity ('one publishes then'), which costs it the top score, but there is no filler.

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, open-world mutation tool, the description covers side effects, approval gating, scheduling modes, media staging, partial-caption risk across platforms, and recovery paths. The output schema already documents return shape, so the brief mention of `message`/`approval_link` is sufficient rather than redundant.

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 100%, so the schema already documents every field; the description's added value is relational — `accounts` takes refs from list_accounts, per-platform wording belongs in platform_configurations.<platform>.caption, files attach after media_ids, and the media_pending upload_url POST flow. It stops short of explaining `social_account_ids` (deprecated) or the placement key set, leaving those to the schema.

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 (create a post) and enumerates the exact destinations it reaches, so the agent knows the blast radius before reading a single parameter. It also carves out the boundary against making multiple posts: 'one post, many accounts; a platform that needs different words gets them in platform_configurations.<platform>.caption, never a post of its own.'

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?

Gives explicit when/when-not guidance across the major modes: omit `scheduled_at` to publish now, `next_slot` to take the queue, `is_draft` to save without sending, `media_pending` to hold until media arrives. It also names the correct undo path per timing (update_post/delete_post before it goes out, take_down_post after), which is exactly the alternative-routing 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.