Skip to main content
Glama

Schedule a post

schedule_post

Queues a post to be published at a future time (run_at, ISO 8601 with timezone, up to 365 days ahead), or in the brand's next free queue slot (run_at "next_slot": the earliest weekly slot all its platforms share that no other waiting post of the brand uses; the result gives the time chosen) through the connected accounts. Takes the same content fields as publishing now. Every platform must already be connected and media must suit each platform, or it is refused now instead of failing later. When a platform is connected in more than one brand and brand_id is omitted, nothing is queued and the error lists the brands. Returns the queued item with its id and, for each platform, the handle and brand it will publish to. The plan sets how many posts can wait in the queue at once (Free: 3): past that the post is not refused but saved as held (code queue_limit, status held) — kept, never published on the current plan, and scheduled automatically when the plan is upgraded; the result then also gives that plan, its price and a checkout link. On a plan with a networks-per-post limit (Free: 2) only the first platforms are published when it runs; the result names the others in held_networks. A queued or held post can be canceled before it runs. X (Twitter) is a pay-per-use add-on on paid plans: each X post uses X credits (1 for a plain post, 10 for a post with a link, +1 per image or video) from the plan's monthly X credits, then from top-up credits; a post without enough credits is not sent to X and its result says how to get more. An X thread: per_platform.x.thread is the list of posts after per_platform.x.text (up to 25, each at most 280 characters as X counts them, a link counts 23); per_platform.x.reply is one more post under the last one, the usual place for a link. Each post of a thread or reply is an X post: it uses credits by the same rule and counts toward the daily X limit, and the whole chain is reserved before anything is sent. Write a thread only when the user asks for one. The X result then has thread.tweets (every post's id), thread_url, and thread.status: complete, or pending when X refused a later post (the first post stays published and PostWire retries the rest on its own). If the brand's approval rules or a limit on this API key or connected app hold the post, nothing is published: the result has status "pending_approval", the post's id and approval_id, who was notified and a review link, and the post goes out once a person approves it from the emailed link or the PostWire dashboard — an AI assistant or an API key cannot approve it. A limit on this key or app can also refuse a post with code key_network_not_allowed, key_brand_not_allowed or key_monthly_cap_reached.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
textNoPost text for platforms without a per_platform draft.
labelNoOptional short label shown in the PostWire queue.
mediaNoSeveral images (or images and videos) in one post, in order: an Instagram carousel (up to 10), TikTok photo post (up to 35 images; PNG is converted to JPEG automatically for Instagram and TikTok), Bluesky (up to 4 images), Mastodon (up to 4), LinkedIn (up to 20 images, or one PDF document). Networks that take one item get the first. Each item: { url, type: image|video|document, alt? }.
titleNoTitle, used by YouTube.
run_atYesWhen to publish: ISO 8601 with offset, e.g. "2026-10-01T09:00:00-05:00", or "next_slot" for the brand's next free queue slot.
privacyNoWho can see the TikTok and YouTube posts: public (everyone), unlisted (YouTube), friends (TikTok mutual followers) or private (only the account owner). TikTok asks that the account owner choose this for each TikTok post. Without it a TikTok post goes out private and YouTube uses the channel default.
brand_idNoBrand whose accounts to use; omit for the default brand.
timezoneNoWith run_at next_slot: the IANA timezone to read the slots in when the brand has none saved, e.g. "America/Lima".
photo_urlNoPublic https URL of an image.
platformsYesPlatforms to publish to.
video_urlNoPublic https URL of a video (YouTube needs one; TikTok takes a video or photos).
per_platformNoPer-platform drafts: { "<platform>": { "text": "…" } }. X, Bluesky and Mastodon also take "thread": ["…"] (the posts after text; X max 25, Bluesky and Mastodon max 9 more, each within the network's limit). LinkedIn, X, Bluesky and Mastodon take "first_comment": "…" (posted by the author under the post, or under the last post of a thread: the place for the link; on X it is an X post and uses credits). X also calls it "reply".

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedInput schema / properties / per_platform / description
      Previous value: -"Per-platform drafts: { \"<platform>\": { \"text\": \"…\" } }. X also takes \"thread\": [\"…\"] (the posts after text, max 25) and \"reply\": \"…\" (one post under the last one)."New value: +"Per-platform drafts: { \"<platform>\": { \"text\": \"…\" } }. X, Bluesky and Mastodon also take \"thread\": [\"…\"] (the posts after text; X max 25, Bluesky and Mastodon max 9 more, each within the network's limit). LinkedIn, X, Bluesky and Mastodon take \"first_comment\": \"…\" (posted by the author under the post, or under the last post of a thread: the place for the link; on X it is an X post and uses credits). X also calls it \"reply\"."
    • changedInput schema / properties / platforms / items / enum
      Previous value: -[
      -  "telegram",
      -  "bluesky",
      -  "mastodon",
      -  "discord",
      -  "tiktok",
      -  "youtube",
      -  "reddit",
      -  "linkedin",
      -  "facebook",
      -  "instagram",
      -  "x"
      -]New value: +[
      +  "telegram",
      +  "bluesky",
      +  "mastodon",
      +  "discord",
      +  "wordpress",
      +  "devto",
      +  "hashnode",
      +  "slack",
      +  "nostr",
      +  "tiktok",
      +  "youtube",
      +  "reddit",
      +  "linkedin",
      +  "facebook",
      +  "instagram",
      +  "x"
      +]
  2. Changed1 schema field changed
    • changedInput schema / properties / per_platform / description
      Previous value: -"Per-platform drafts: { \"<platform>\": { \"text\": \"…\" } }."New value: +"Per-platform drafts: { \"<platform>\": { \"text\": \"…\" } }. X also takes \"thread\": [\"…\"] (the posts after text, max 25) and \"reply\": \"…\" (one post under the last one)."
  3. Changed1 schema field changed
    • changedInput schema / properties / platforms / items / enum
      Previous value: -[
      -  "telegram",
      -  "bluesky",
      -  "mastodon",
      -  "discord",
      -  "tiktok",
      -  "youtube",
      -  "reddit",
      -  "linkedin",
      -  "facebook",
      -  "instagram"
      -]New value: +[
      +  "telegram",
      +  "bluesky",
      +  "mastodon",
      +  "discord",
      +  "tiktok",
      +  "youtube",
      +  "reddit",
      +  "linkedin",
      +  "facebook",
      +  "instagram",
      +  "x"
      +]
  4. Changed1 schema field changed
    • changedInput schema / properties / privacy / description
      Previous value: -"Who can see the TikTok and YouTube posts: public, unlisted (YouTube), friends (TikTok mutual followers) or private. Without it a TikTok post goes out private (only the account owner sees it) and YouTube uses the channel default — send \"public\" to publish publicly."New value: +"Who can see the TikTok and YouTube posts: public (everyone), unlisted (YouTube), friends (TikTok mutual followers) or private (only the account owner). TikTok asks that the account owner choose this for each TikTok post. Without it a TikTok post goes out private and YouTube uses the channel default."
  5. Changed3 schema fields changed
    • changedInput schema / properties / run_at / description
      Previous value: -"When to publish, ISO 8601 with offset, e.g. \"2026-10-01T09:00:00-05:00\"."New value: +"When to publish: ISO 8601 with offset, e.g. \"2026-10-01T09:00:00-05:00\", or \"next_slot\" for the brand's next free queue slot."
    • removedInput schema / properties / run_at / format
      Removed value: -"date-time"
    • addedInput schema / properties / timezone
      Added value: +{
      +  "description": "With run_at next_slot: the IANA timezone to read the slots in when the brand has none saved, e.g. \"America/Lima\".",
      +  "type": "string"
      +}
  6. Changed1 schema field changed
    • addedInput schema / properties / privacy
      Added value: +{
      +  "description": "Who can see the TikTok and YouTube posts: public, unlisted (YouTube), friends (TikTok mutual followers) or private. Without it a TikTok post goes out private (only the account owner sees it) and YouTube uses the channel default — send \"public\" to publish publicly.",
      +  "enum": [
      +    "public",
      +    "unlisted",
      +    "friends",
      +    "private"
      +  ],
      +  "type": "string"
      +}
  7. Changed1 schema field changed
    • changedInput schema / properties / platforms / items / enum
      Previous value: -[
      -  "telegram",
      -  "bluesky",
      -  "mastodon",
      -  "discord",
      -  "tiktok",
      -  "youtube",
      -  "reddit",
      -  "linkedin",
      -  "facebook",
      -  "instagram",
      -  "x"
      -]New value: +[
      +  "telegram",
      +  "bluesky",
      +  "mastodon",
      +  "discord",
      +  "tiktok",
      +  "youtube",
      +  "reddit",
      +  "linkedin",
      +  "facebook",
      +  "instagram"
      +]
  8. Changed1 schema field changed
    • changedInput schema / properties / media / description
      Previous value: -"Several images (or images and videos) in one post, in order: an Instagram carousel (up to 10), TikTok photo post (up to 35 JPEG/WebP images), Bluesky (up to 4 images), Mastodon (up to 4), LinkedIn (up to 20 images, or one PDF document). Networks that take one item get the first. Each item: { url, type: image|video|document, alt? }."New value: +"Several images (or images and videos) in one post, in order: an Instagram carousel (up to 10), TikTok photo post (up to 35 images; PNG is converted to JPEG automatically for Instagram and TikTok), Bluesky (up to 4 images), Mastodon (up to 4), LinkedIn (up to 20 images, or one PDF document). Networks that take one item get the first. Each item: { url, type: image|video|document, alt? }."
  9. Changed2 schema fields changed
    • addedInput schema / properties / media
      Added value: +{
      +  "description": "Several images (or images and videos) in one post, in order: an Instagram carousel (up to 10), TikTok photo post (up to 35 JPEG/WebP images), Bluesky (up to 4 images), Mastodon (up to 4), LinkedIn (up to 20 images, or one PDF document). Networks that take one item get the first. Each item: { url, type: image|video|document, alt? }.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alt": {
      +        "description": "Alt text (used by Bluesky, Mastodon and LinkedIn).",
      +        "maxLength": 1500,
      +        "type": "string"
      +      },
      +      "title": {
      +        "description": "Document title, used by LinkedIn.",
      +        "maxLength": 200,
      +        "type": "string"
      +      },
      +      "type": {
      +        "description": "Default image.",
      +        "enum": [
      +          "image",
      +          "video",
      +          "document"
      +        ],
      +        "type": "string"
      +      },
      +      "url": {
      +        "description": "Public https URL of the file.",
      +        "format": "uri",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "url"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 35,
      +  "minItems": 1,
      +  "type": "array"
      +}
    • changedInput schema / properties / video_url / description
      Previous value: -"Public https URL of a video (TikTok and YouTube need one)."New value: +"Public https URL of a video (YouTube needs one; TikTok takes a video or photos)."
  10. Changed2 schema fields changed
    • changedInput schema / properties / per_platform / description
      Previous value: -"Per-platform drafts from generate_posts."New value: +"Per-platform drafts: { \"<platform>\": { \"text\": \"…\" } }."
    • changedInput schema / properties / title / description
      Previous value: -"Title, used by YouTube (and Reddit)."New value: +"Title, used by YouTube."
  11. First observed

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only cover readOnly=false, openWorld=true, idempotent=false, destructive=false, so the description carries the behavioral load and does so richly: queue caps (Free: 3) with held/queue_limit behavior, networks-per-post limits (held_networks), X credit pricing, thread reservation semantics, approval gating (pending_approval, AI/API key cannot approve), and specific refusal codes.

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

Conciseness3/5

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

The first sentence is well front-loaded with the core purpose, but the body is an extremely dense run-on bundling pricing, thread rules, approval flows, and error codes into one block. Nearly all content is relevant, yet the lack of structure hurts scanability for an agent.

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?

With no output schema, the description steps up to describe returns: the queued item with id plus per-platform handle and brand, held status with plan/price/checkout link, thread.tweets/thread_url/thread.status, and pending_approval with approval_id and review link. Given the 12-parameter, nested-object tool, coverage is essentially complete.

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 the baseline is 3, but the description adds genuine meaning beyond the schema: it explains run_at 'next_slot' resolution and the shared-weekly-slot rule, plus thread limits (X max 25 posts, 280 chars as X counts, a link counts 23) and reply/first_comment equivalence. These go beyond the terse schema text.

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 (queues) and resource (a post to publish at a future time) plus the two modes: an explicit run_at or the brand's next free queue slot. It clearly distinguishes itself from immediate publishing by noting it takes 'the same content fields as publishing now,' so an agent can separate it from post_to_social without opening a schema.

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 strong when-to-use context: choose next_slot for the earliest shared free slot, only write a thread 'when the user asks for one,' and note that queued/held posts can be canceled before they run. It does not name sibling tools (post_to_social, bulk_schedule, cancel_scheduled_post) explicitly, leaving the routing slightly implicit.

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.