attach_media
ChatGPTSave an already-uploaded object (from create_media_upload) to the media library and return a media id. Works for images and videos (mp4/mov/webm). Images can optionally be reformatted to a publishing format first: the server reads the upload back from storage, stores the reformatted image as a new file and deletes the raw upload at storageKey, which cannot be undone. Videos are always recorded as-is. Omit format (or use "original") to record it unchanged — recording as-is deletes nothing. Pass the SAME workspaceId you gave create_media_upload — a storage key belongs to the workspace it was minted in and is refused anywhere else.
capture_screenshot
ChatGPTTake screenshots of a web page — the workspace's own site, usually — with a headless browser, as a desktop (1440×900 at 2×) and/or a mobile (390×844 at 3×) capture, and save them to the media library as images: shots for create_video, or pictures for a post. Each device costs 2 credits; when the month's credits cover fewer devices than asked, it captures what they cover and says so, and once they are spent it is refused with the balance — tell the user, do not retry. The server fetches whatever public https address is given, so point it only at pages the user named; private and internal addresses are refused. fullPage captures the whole page (as a JPEG) rather than the first screen (PNG). Waits up to wait seconds (default 40) for the capture; a page that takes longer is finished with get_video.
create_media_upload
ChatGPTGet a presigned URL to upload a file straight to storage — no base64 through this channel, no third-party host. Best for large files and production. The URL grants write access to this workspace’s own private storage for 10 minutes; it replaces nothing, and the file joins the media library only when attach_media records it. Flow: (1) call this with the contentType; (2) HTTP PUT the raw file bytes to the returned uploadUrl (e.g. curl -X PUT --data-binary @file -H "Content-Type: <type>" "<uploadUrl>"); (3) call attach_media with the returned storageKey to save it to the media library.
create_post
ChatGPTCreate a post and either publish it now, schedule it, queue it, or save it as a draft. Publishing — now, or when a scheduled or queued time arrives — makes the post public on the selected networks, and it 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. 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/<user>/status/<id>) 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](url) 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). LinkedI…
create_variants
ChatGPTReshape ONE image already in the media library into several platform canvases at once, and return the new asset ids: feed_portrait (1080×1350, 4:5), feed_square (1080×1080), landscape (1080×566, 1.91:1) and story (1080×1920, 9:16 — also what a reel or a TikTok photo wants). Cropping is saliency-based by default: sharp scores regions by saturation, luminance and skin tone and keeps the strongest, so an off-centre subject survives a 4:5 → 9:16 cut. Use crop="centre" for images composed around their middle (posters, screenshots, flat graphics), where a predictable crop beats a guessed one. fit="contain" pads instead of cropping — use it when nothing may be cut off at all. Images only; video is not re-encoded. The source image is left unchanged and every canvas is a new asset. Variants inherit the source’s alt text and folder, and asking for two formats with the same dimensions produces one file, not two. Typical use: upload once, call this with the formats the selected platforms want, then pass the right variant id per post.
create_video
ChatGPTRender a short, muted, branded video (9:16 vertical by default; also square and landscape) from one of the templates in list_video_templates, using the workspace's own pictures, and save it to the media library as an mp4 — returning a media id create_post takes as mediaIds. It fills a fixed template with the user's own pictures and words — no generative model draws anything. It costs 25 of the workspace's monthly credits, taken before rendering and handed back if the render fails; once the month's credits are spent it is refused with the balance — tell the user, do not retry. Render only what the user asked for: confirm the template, the headline and the pictures first when they have not said. Pictures come from the media library: upload_media for a file, capture_screenshot for the website, import_app_screenshots for the App Store or Google Play listing. A shot given by mediaId must be an image. The brand name, tagline and icon are filled in from the brand profile and the workspace unless overridden here; set accent to a #rrggbb colour to give the video the brand's colour. Rendering takes a minute or two on a shared box. The call waits up to wait seconds (default 40) reporting progress, then returns the finished video — or the render's id and status when it needs longer, in which case call get_video with the id. The result names any field the template leaves out. Nothing is posted anywhere: the video sits in the private library until a post carrying it is published.
delete_post
ChatGPTPermanently delete Ravenpost’s copy of a post and cancel any scheduled publish — the post cannot be restored. Use this to remove drafts or duplicate/obsolete scheduled posts. It never takes a post down from a network: a post already published stays live on the platform. The dashboard offers a separate "delete everywhere" on the networks Ravenpost can delete from (a post on Instagram, TikTok, Threads and YouTube cannot be taken down through Ravenpost at all); this tool does not.
get_analytics
ChatGPTGet one workspace's analytics overview: follower counts per connected account (plus a daily follower series for the last 30 days) and engagement on recent posts. A post's source says where it came from: "ravenpost" for one published from here, "platform" for one already on the account and imported so its engagement counts too. An account's followers is null when we collect none for its platform — today TikTok, X, Telegram, LinkedIn, Threads and YouTube, whose APIs either expose no insights or need a permission that is not approved yet (or, for X, charge for every read, so we read none and its numbers are in its own app) — so null means "unknown", never zero. Likewise a post metric that is absent was not collected rather than being 0.
get_post
ChatGPTGet one post by id, including its media, per-account targets and publish status. Clients that render MCP Apps also show it as it looks on each destination platform.
get_video
ChatGPTCheck a render create_video or capture_screenshot started: its status (queued, rendering, ready, failed), progress and, once ready, the media ids and URLs. Reads one row; nothing is changed. Set wait (seconds, up to 45) to hold the call until it settles or the time is up — one call like that beats polling every second.
image_formats
ChatGPTList the supported image formats and their target dimensions (for choosing a format in upload_media).
import_app_screenshots
ChatGPTCopy an app's store listing pictures — its phone screenshots and its icon — from the App Store or Google Play into the media library, returning media ids: the screenshots become shots for create_video (app_showcase especially) and the icon its brand mark (iconMediaId). Reads the listing the workspace's brand profile holds when no url is given. Costs no credits; a picture already imported is reused rather than copied again. Apple's listing is read through its lookup API; Google Play's from its page, best effort.
list_accounts
ChatGPTList the social accounts connected to one workspace (Instagram, TikTok, X, Telegram, LinkedIn, Threads, Bluesky, YouTube and Pinterest; an account connected before its network was withdrawn still lists under its own platform). Returns each account id, platform, username, status, connection and captionMax — that account's own caption budget, which create_post holds its caption to. For X it depends on the account: xPremium true means X Premium and 25,000 characters, false means 280; X counts every link as 23 and each emoji or symbol such as → − • … as 2. Use an account id as a target when creating a post. Accounts belong to a single workspace, so with several workspaces give workspaceId (see list_workspaces) — an account id from one workspace is rejected by a post created in another. connection is only meaningful for Instagram: "FACEBOOK_LOGIN" accounts were connected through a Facebook Page and are the only ones that can browse and attach reel audio (list_audio) or invite collaborators; "INSTAGRAM_LOGIN" accounts — the way Instagram connects today — publish normally but can do neither.
list_audio
ChatGPTSearch Instagram’s audio catalog for tracks that can be attached to a reel, then pass the chosen track’s id as create_post/update_post audio.audioId. Call it WITHOUT a query to get what is currently trending — that is the featured list. accountId must be an Instagram account connected through a Facebook Page ("FACEBOOK_LOGIN" in list_accounts); a directly-connected one cannot reach the catalog and gets an error saying so. Instagram connects directly today, so only an account connected through Facebook earlier can use this. Meta only exposes tracks licensed for third-party use, so this catalog is narrower than the one in the Instagram app — a track the user can pick on their phone may legitimately be missing here. The catalog is Meta’s, shared by every Instagram account — licensed tracks plus original sounds from other creators’ reels — not the user’s own data; searching it only reads and attaches nothing. This is Instagram-only. TikTok and Facebook expose no music API, so there is nothing to list for them.
list_boards
ChatGPTList the boards on one of the user's own connected Pinterest accounts, read live from Pinterest's API with that account's token. It reads that one account only: nothing on Pinterest is created, changed or published, and nothing becomes visible to anyone. Every pin belongs to a board and Pinterest has no default, so a post targeting Pinterest must name one — pass the board name or id as board on create_post/update_post. accountId is a Pinterest account id from list_accounts; other platforms have no boards and are rejected.
list_media
ChatGPTList recent media assets in one workspace (id, url, type, dimensions) — reuse an existing asset id in create_post instead of re-uploading. The library is per workspace, like the accounts.
list_posts
ChatGPTList the posts in one workspace, 50 at a time: newest first, or soonest first when filtered to SCHEDULED. Optionally filtered by status (DRAFT, SCHEDULED, PUBLISHING, PUBLISHED, FAILED). total says how many posts match and totalPages how many pages there are; set page to read further back.
list_queue_slots
ChatGPTList the workspace posting schedule: the recurring weekly queue slots (weekday + local time) that action="queue" publishes into, plus nextFreeSlot — the next slot no post is booked into, which is where action="queue" would put a post now (null when there are no slots, or none is free in the weeks ahead). Slots are defined in dashboard Settings and are workspace-wide (shared by every connected account), so each workspace has its own schedule. weekday 0 = Sunday … 6 = Saturday, in the workspace timezone.
list_video_templates
ChatGPTList the video templates create_video can render, with what each one is for, the fields it reads and the ones it cannot do without, plus the canvases (9:16, 1:1, 16:9) and what a video and a screenshot cost in credits. Reads a fixed catalogue; nothing is created. Call it once before the first create_video of a conversation, then choose the template whose when matches what the user asked for. Every template takes the same flat fields — headline, subheadline, body, shots, features, cta, stat — and ignores the ones it does not use; the brand (name, tagline, icon, accent colour) is filled in from the workspace unless overridden.
list_workspaces
ChatGPTList every workspace this account can act in, with its id and the caller's role. Call this FIRST when more than one may exist: every other tool takes an optional workspaceId, and once there are several it becomes required — the connected social accounts, media library, posting queue and analytics are all per workspace. When there is more than one, ASK THE USER which workspace to post to rather than choosing for them.
platform_limits
ChatGPTReturn per-platform caption limits, media rules, thread limits, and recommended media specs (dimensions, container formats, size/duration caps). Consult this BEFORE generating or picking media for a post so images/videos match what the platform renders best (e.g. X images at 1600×900 16:9, X video as MP4 H.264 up to 20 minutes). threadMax is the max follow-up posts a thread can carry after the caption; null means the platform has no thread model. captionFormatting describes the rich-text markup the platform renders in captions (e.g. Telegram accepts a markdown subset); null means captions publish as plain text. formats lists the post.type values the platform honors; null means it ignores type and just consumes the media set. supportsAudio means a track from the platform’s own catalog can be attached through the API (see list_audio) — only Instagram reels can. For every other platform the audio must already be baked into the video file. postingRules lists what the platform refuses beyond length and media (X: one $cashtag per post, replies and quotes only where the target post names the account, thread replies that @mention only people already in the conversation, one X account per post); empty means nothing beyond the numbers.
preview_post
ChatGPTRender a post as each destination platform will show it — WITHOUT creating anything. Nothing is written, scheduled or published; call create_post afterwards with the same arguments to actually post it. Takes the same arguments as create_post (caption, hashtags, accountIds, mediaIds, type, thread, replyTo, quote, audio, collaborators, reelCover, trialReel), and returns the same preview a client with MCP Apps renders as an interactive card, one tab per platform. Use this before create_post whenever the user is composing rather than dictating: it is the cheapest way to show them what goes out, and it reports what would be rejected or silently dropped — a caption over the tightest platform's budget, a platform that requires media when there is none, a thread longer than the strictest limit, audio on a platform with no music API, Instagram collaborators on an account that cannot invite them, a reel cover or trial on a post that is not a reel (or a cover create_post would refuse), media Bluesky leaves behind (it takes up to four images or one video), and X's own rules — more than one $cashtag in a post, a thread reply @mentioning somebody new to the conversation, the same post on two X accounts, a reply or quote X only takes from an account the target post names, media X leaves behind. The character counts it returns are per platform and authoritative: they are the same ones create_post enforces. For Pinterest, include board (and link/title) too — the preview warns when a Pinterest target has no board, which is the way a Pinterest post most often fails. The board name is taken as given: create_post checks it against the account's boards (see list_boards) and refuses an unknown one before writing anything. A preview reads only this workspace's own accounts and media and calls no social network, so nothing outside Ravenpost is touched or shown to anyone.
publish_post
ChatGPTPublish an existing post immediately (e.g. a draft), without editing its content. A post that has already been published, or is publishing right now, is refused rather than sent twice. It goes public on every target account at once and 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.
schedule_post
ChatGPTSchedule (or reschedule) an existing post for a future time, without editing its content. Give scheduledAt as an absolute ISO 8601 datetime (include the offset, e.g. 2026-07-05T09:00:00+03:00). Rescheduling replaces the previous time, which is not kept. At that time the post is published to its target accounts, where it is public — tell the user the accounts and the time. A time in the past is refused rather than published immediately; use publish_post for that, and only on an explicit instruction.
update_post
ChatGPTEdit an existing post (draft or scheduled) — caption, hashtags, format, media or target accounts. A published/publishing post can no longer be edited. IMPORTANT: editing resets the post to a DRAFT. To keep it going out, also send action="schedule" + scheduledAt (or action="now" to publish immediately). Omit action to leave it as a draft (i.e. to unschedule). The edit overwrites the stored post — no earlier version is kept — and with action now, schedule or queue the result goes public on its networks, now or at that time. The schedule is the only thing an edit drops on its own: anything else you leave out stays exactly as it was, so to REMOVE something pass its empty form ("", [], null or {} — each argument says which) rather than leaving it out. tiktok and board belong to specific accounts, so when accountIds adds a TikTok or Pinterest account, pass them again for it — a new TikTok target without options publishes privately, and a new Pinterest target without a board fails to publish. caption replaces the whole caption; use hashtags to append them. Telegram targets render a markdown subset in the caption ([text](url), bold, italic, code, ~~strikethrough~~); other platforms publish it as plain text. replySettings (who may reply) and community (the Community it posts into) are X only, like replyTo and quote; use "" to either to go back to X’s default — everyone may reply, and the post goes to the timeline. audio replaces the Instagram reel track (see list_audio); use null to remove it. reelCover replaces the Instagram reel cover; use null to go back to the first frame. trialReel changes how a trial reel graduates; use "" to make it a normal reel. collaborators replaces the Instagram co-authors; use [] to remove them. They reach only an Instagram account whose connection is "FACEBOOK_LOGIN" (see list_accounts) and never a STORY — anywhere else they are dropped and the post publishes without them. tiktok replaces TikTok’s per-account posting options (privacyLevel, allow*, brand toggles); use {} to clear them, which makes TikTok targets publish privately again. board moves a Pinterest pin to another board (name or id from list_boards); title replaces the pin title. link replaces the URL the post points at — Facebook’s link preview card, Pinterest’s pin destination; use "" to remove it.
upload_media
ChatGPTUpload an image or a video (mp4/mov/webm) to the media library, returning a media id for create_post. Each call adds a new asset to this workspace’s private library; nothing already there is replaced, and nothing is posted anywhere. Images are reformatted to the requested publishing format; videos are stored as-is (format/fit are ignored — upload the video pre-edited). Give the file as ONE of: url (preferred when it is already online — the server downloads it from whatever public address you give) or base64 (fallback for small images; avoid for video). For a large local file in production, prefer create_media_upload (direct upload, no base64 through this channel). format: feed_square (1:1), feed_portrait (4:5), landscape (1.91:1), story or reel (9:16), or original (no resize). fit: "cover" crops to fill (default), "contain" fits the whole image and pads.