Skip to main content
Glama

Create a post

create_post
Destructive

Create a post and either publish it now, schedule it, queue it, or save it as a draft. action "now" — and a schedule less than 15 minutes ahead, which is a publish under another name — does NOT publish by itself: the post is saved as a draft that waits for the user, who confirms it with the Publish button on the post card or on Ravenpost (the result says where), and nothing goes out until they do. A schedule further ahead, and the posting queue, go out at their time with no further step. Once it goes out the post is public on the selected networks, and that cannot be undone from here: delete_post removes only Ravenpost's copy, and a post on Instagram, TikTok, Threads and YouTube cannot be taken down through Ravenpost at all. Only a draft stays private. Each call creates a new post, so never repeat a call that succeeded — one waiting for the user's confirmation included. With more than one workspace, ASK THE USER which one to post to and give workspaceId — the connected accounts differ per workspace and posting to the wrong one is not undoable. Accounts, media and queue slots must all come from that same workspace. action="queue" schedules at the workspace's next free posting-queue slot (see list_queue_slots) — no scheduledAt needed; it errors if the workspace has no slots defined. Targets are account ids from list_accounts (cross-posting to several is allowed — but one X account per post: every X account publishes the same text, and X forbids the same post on several accounts). Caption limit is the tightest selected account — each account's captionMax in list_accounts. X's depends on the account: 280 characters, or 25,000 with X Premium, counted as X counts (every link is 23, each emoji or symbol such as → − • … is 2); a caption over it is rejected, naming the account. X refuses two more things a caption can hold, and so does this tool, before anything is written: more than one $cashtag in a post (each reply of a thread is a post of its own — write other tickers without the $), and, in a thread reply, an @mention of anybody the first post did not mention. For media, first upload with upload_media and pass the returned media ids. type is Instagram’s format model (IMAGE/CAROUSEL/REEL/STORY) reused as the shared vocabulary. Instagram honors all four, and Instagram video must be posted as REEL (or STORY) — an IMAGE/CAROUSEL post with a video will be rejected at publish time. Facebook honors STORY (published to Page Stories, which have NO caption — the text is dropped) and treats every other type as a normal feed post. TikTok, X, and Telegram ignore type entirely. See platform_limits.formats for which types each platform honors. thread: extra posts published as replies after the main one, forming a chain. Supported on X, Bluesky, Mastodon, Threads, Telegram and Discord; a platform without a thread model publishes just the caption. The caption is post 1 and carries the media. Limits come from the strictest selected platform (X is tightest at 280 chars per post, or 25,000 for an account on X Premium, and 25 follow-ups) and going over is rejected, not truncated. replyTo (X only): reply to an existing tweet — pass the tweet id or its URL (x.com//status/) and the post is published as a reply under it instead of a standalone tweet (a thread then continues under that reply). X takes a reply from an app only when the post it answers is the account's own, or @mentions the account, or quotes one of its posts; a reply to anybody else's post fails at publish time. Non-X targets ignore it and publish a normal post, so for a pure reply target only the X account. quote (X only): quote-tweet an existing tweet — pass the tweet id or its URL and it is embedded as a card under this post. X takes it on the same terms as a reply: the account's own post, or one that @mentions it — quoting anybody else's post fails at publish time. Can be combined with replyTo. Non-X targets ignore it. Telegram renders a markdown subset in captions (text links, bold, italic, code, strikethrough) as native formatting; every other platform publishes the caption as plain text, so markdown would show literally there — only use it when all targets are Telegram (see platform_limits.captionFormatting). Threads takes text-only posts, one image/video, or a carousel of up to 20 items, and ignores type. Its 500-character limit is the tightest after X, so a mixed X+Threads selection is still capped at 280 (unless the X account has X Premium). LinkedIn publishes the caption as plain text — its reserved characters are escaped for you, so write normal prose; markdown is not rendered and a bare link does NOT produce a preview card. LinkedIn ignores type, allows text-only posts, and takes either one video or up to 20 images. audio attaches a track from Instagram’s catalog to a reel (find one with list_audio). It applies only to type="REEL" on Instagram accounts connected via Facebook — other platforms and other types ignore it, and the worker logs that it was dropped rather than failing. TikTok and Facebook have NO music API at all: for them the audio has to already be part of the video file. reelCover and trialReel are an Instagram reel’s own options: its cover (a library JPEG, or a frame of the video) and a trial — a reel shown to non-followers first. Both apply only to type="REEL" on Instagram, on either connection; anywhere else they are dropped. firstComment is posted as a comment on the Instagram post right after it goes out — Instagram only and never on a STORY; every other network ignores it, and the result warns when it reaches none of the selected accounts. tiktok carries TikTok’s required per-post choices, keyed by account id — most importantly privacyLevel, which TikTok makes mandatory. Leave it out and TikTok targets publish privately. Pinterest needs a board: set board (a board name or an id from list_boards) whenever a Pinterest account is targeted — a pin belongs to a board and there is no default, so without it the post is created but fails to publish. link is the pin’s destination URL, which is the point of a pin, and title is its headline (the caption becomes the description, max 800 chars).

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": {
      "caption": "<caption>",
      "accountIds": "<accountIds>",
      "action": "<action>"
    },
    "name": "create_post"
  }
}

Input Schema

NameRequiredDescriptionDefault
linkNoThe URL this post points at. Facebook publishes it as a link preview card (used when the post has no media); Pinterest makes it the pin's destination, which is the whole point of a pin. Every other platform ignores it. Empty string clears it.
typeNoInstagram format; defaults to IMAGE
audioNoInstagram reel audio — a catalog track from list_audio. Requires type="REEL" and an Instagram account connected via Facebook; ignored otherwise.
boardNoPinterest only, and REQUIRED for a Pinterest target: the board this pin goes to — its name (matched case-insensitively) or its id from list_boards. Pinterest has no default board, so a Pinterest post without one fails at publish time. Other platforms ignore it.
quoteNoX quote: tweet id or tweet URL to quote — embedded as a card under this post; combinable with replyTo. X only takes it when that post is the account's own or @mentions it (X targets only; other platforms ignore it)
titleNoPinterest only: the pin title (max 100 chars), which Pinterest shows above the description. Defaults to the caption’s first line. Other platforms ignore it.
actionYesnow = publish once the user confirms it (on the post card or on Ravenpost); schedule = at scheduledAt (less than 15 minutes ahead waits for their confirmation too); queue = the next free posting-queue slot; draft = save it, unpublished
threadNoThread: follow-up posts replied in order after the caption (X, Bluesky, Mastodon, Threads, Telegram, Discord; limits come from the strictest selected platform — at most 25 entries, each ≤280 chars on X, or 25,000 on X Premium)
tiktokNoTikTok posting options, keyed by TikTok account id. Omit and TikTok targets publish privately (SELF_ONLY) — TikTok requires the creator to choose a visibility per post, so nothing wider is assumed on their behalf.
captionYesThe post caption / text body
replyToNoX reply: tweet id or tweet URL to reply to — the post publishes as a reply under that tweet instead of a standalone tweet. X only takes it when that post is the account's own or @mentions it (X targets only; other platforms ignore it)
hashtagsNoHashtags to append to the caption (with or without a leading #)
mediaIdsNoOrdered media asset ids (from upload_media)
timezoneNoIANA timezone for the schedule
communityNoX only: post into a Community — its id or URL (x.com/i/communities/<id>). Empty string clears it.
reelCoverNoInstagram reel cover — an image OR a frame of the video, not both. Only for type="REEL" on an Instagram account, either connection; other types and platforms ignore it and it is dropped there. Leave it out for Instagram’s default, the first frame.
trialReelNoInstagram trial reel: shown to non-followers first, and to followers only once it graduates — MANUAL means the user graduates it by hand in the Instagram app, SS_PERFORMANCE that Instagram graduates it if it performs well. Only for type="REEL" on an Instagram account; other types and platforms ignore it. Instagram decides which accounts may post one (public professional accounts it can recommend) and answers only when the reel is published: if it refuses, the post fails — it is never sent as a normal reel instead. Set it only when the user asks for a trial.
accountIdsYesTarget social account ids (from list_accounts)
scheduledAtNoISO 8601 datetime — required when action is "schedule"
workspaceIdNoWhich workspace to act in — an id from list_workspaces. Optional with a single workspace; REQUIRED once there are several, where guessing would mean posting one client's content to another client's accounts. Ask the user which one before publishing.
firstCommentNoInstagram only: a comment posted on the Instagram post from the same account right after it goes out — hashtags, or a link the caption should not carry. Feed posts, carousels and reels only: Instagram takes no comment on a STORY, and no other network gets one, so anything X, Threads, LinkedIn or the others should carry belongs in their caption. If Instagram refuses the comment, the post stays published without it and nothing reports that afterwards. preview_post takes the same argument and warns where it would not be posted.
collaboratorsNoInstagram only: co-author usernames (max 3). They get an invite, and once they accept the post appears on their profile too. Feed posts and reels only — never a STORY — and ONLY on an Instagram account whose connection is "FACEBOOK_LOGIN" (see list_accounts). On any other Instagram account they are dropped: the post still publishes, without them, and nothing reports it afterwards — so do not promise the user co-authors without checking. preview_post takes the same argument and warns when they would be dropped.
replySettingsNoX only: who may reply to this post. Omit for X's default (everyone).

Output Schema

NameRequiredDescriptionDefault
okNo
postNo
previewNo
awaitingConfirmationNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedInput schema / properties / firstComment
      Added value: +{
      +  "description": "Instagram only: a comment posted on the Instagram post from the same account right after it goes out — hashtags, or a link the caption should not carry. Feed posts, carousels and reels only: Instagram takes no comment on a STORY, and no other network gets one, so anything X, Threads, LinkedIn or the others should carry belongs in their caption. If Instagram refuses the comment, the post stays published without it and nothing reports that afterwards. preview_post takes the same argument and warns where it would not be posted.",
      +  "type": "string"
      +}
  2. First observed

TDQS

A4.6/5.0
Behavior5/5

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

Annotations mark it destructive and non-idempotent; the description goes far beyond by explaining the confirmation gate (action "now" and sub-15-minute schedules save as a draft awaiting the user's Publish click), the irreversibility of publishing, and that delete_post removes only Ravenpost's copy while Instagram/TikTok/Threads/YouTube posts cannot be taken down at all. It also warns never to repeat a successful call, directly operationalizing idempotentHint=false.

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

Conciseness2/5

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

One enormous paragraph of roughly a thousand words; the critical routing fact (now/schedule saves a draft awaiting confirmation) is buried mid-sentence behind an em-dash aside in the second sentence. Large portions restate schema descriptions (audio, reelCover, trialReel, tiktok, firstComment) and could be delegated to platform_limits, which exists as a sibling.

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 23-parameter tool with nested objects and many cross-platform branches, the description covers the interaction surfaces an agent must get right: workspace selection, confirmation flow, per-platform type honouring, thread and caption limits, reply/quote constraints, Pinterest board requirement, and which options get silently dropped. Output schema handles return values.

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 per-field meaning is already documented, but the description adds cross-parameter rules the schema cannot express: caption limit derives from the tightest selected account's captionMax, one X account per post, queue needs defined workspace slots, all assets must come from the same workspace, and type is honoured only by Instagram/Facebook. It somewhat duplicates the schema on audio, reelCover, trialReel and tiktok rather than extending it.

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+resource and immediately enumerates the four distinct modes (publish now, schedule, queue, draft), which is exactly the axis an agent needs to disambiguate create_post from schedule_post and publish_post. Platform-specific scope and target semantics are stated concretely.

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?

Explicit when/when-not guidance throughout: use upload_media first for media, list_accounts/list_boards/list_queue_slots/list_audio for inputs, ask the user which workspace when several exist, and only target the X account for pure replies. It also names the alternative paths (preview_post, delete_post) and says what they do not do.

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.