Skip to main content
Glama

Publish a post now

post_to_social
Destructive

Publishes a post immediately and publicly to the listed platforms through the social accounts connected to the user's PostWire account. A published post cannot be withdrawn from PostWire. Accepts one text for all platforms or a separate per_platform draft for each. YouTube requires video_url; TikTok requires video_url or photos (photo_url or media); Instagram requires a photo or video, and two or more media items make a carousel. Every platform must already be connected; otherwise nothing is published and the error names the missing ones. The same payload sent twice within 2 minutes is refused as a duplicate unless idempotency_key differs. When a platform is connected in more than one brand and brand_id is omitted, nothing is published and the error lists the brands. Returns { posted, published_to, results: [{ platform, ok, id?, url?, account?, error? }] }, where account and published_to name the handle and brand each post went to. After the account's first post through this connection, next_step proposes a week of posts on the same topic for the text networks it went to (its topic and platforms); nothing is queued until the person asks for it. The plan sets how many networks one post goes out to (Free: 2): only the first platforms in the list are published and each of the others comes back with ok: false, held: true and code networks_per_post (its version was written and not sent), listed in held_networks with a one-sentence held_message, and message_for_user says it in plain words for the person; every network can still be connected and written for. TikTok and Instagram videos may still be processing when this returns (status processing, no url yet). When the networks-per-post or the monthly post limit stops a platform, the result also names the plan that lifts it, its price and a checkout link, and, for a free account that has not had one, a link to Pro with the first month 50% off (trial_offer: paid today, then the regular monthly price, cancel anytime). Such an account also gets the trial link once after its first post from an assistant, with a one-sentence trial_message. 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 used for every platform that has no per_platform draft.
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.
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_idNoWhich brand's accounts to use. Omit to use the default brand.
photo_urlNoPublic https URL of an image.
platformsYesPlatforms to publish to, all in one call, e.g. ["linkedin","bluesky"].
video_urlNoPublic https URL of a video. Required for YouTube; TikTok takes a video or photos.
per_platformNoPer-platform drafts: { "<platform>": { "text": "…", "title": "…", "tags": ["…"] } }. X, Bluesky and Mastodon also take "thread" (the posts after text, in order, each a reply to the one before; media stays on the first post). LinkedIn, X, Bluesky and Mastodon take "first_comment" (posted by the author right under the post, or under the last post of a thread: the place for the link). X also calls it "reply". Pass the thread and first_comment that generate_posts returned as they are.
idempotency_keyNoOptional unique key; a repeat with the same key within 24 h is refused instead of posted twice.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed8 schema fields changed
    • addedInput schema / properties / per_platform / additionalProperties / properties / canonical_url
      Added value: +{
      +  "description": "Dev.to and Hashnode: where the article was first published.",
      +  "format": "uri",
      +  "type": "string"
      +}
    • addedInput schema / properties / per_platform / additionalProperties / properties / first_comment
      Added value: +{
      +  "description": "LinkedIn, X, Bluesky, Mastodon: the author's first comment, posted right after the post (under the last post of a thread) — where the link goes. Bluesky <= 300 characters, Mastodon <= 500, X <= 280 (an X post: it uses X credits), LinkedIn <= 1250. Other networks report it as not posted.",
      +  "maxLength": 1500,
      +  "type": "string"
      +}
    • changedInput schema / properties / per_platform / additionalProperties / properties / reply / description
      Previous value: -"X only: one post under the last post of the chain, e.g. the link."New value: +"X only: the same as first_comment — one post under the last post of the chain, e.g. the link."
    • addedInput schema / properties / per_platform / additionalProperties / properties / status
      Added value: +{
      +  "description": "Blogs: publish now, or save a draft on the blog.",
      +  "enum": [
      +    "publish",
      +    "draft"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / per_platform / additionalProperties / properties / summary
      Added value: +{
      +  "description": "Blogs: the article's excerpt / meta description.",
      +  "maxLength": 400,
      +  "type": "string"
      +}
    • changedInput schema / properties / per_platform / additionalProperties / properties / thread / description
      Previous value: -"X only: the posts of a thread after text, each a reply to the one before (max 25, each <= 280 as X counts)."New value: +"X, Bluesky, Mastodon: the posts of a thread after text, each a reply to the one before. X: max 25, each <= 280 as X counts. Bluesky: max 9 (10 posts in all), each <= 300 characters. Mastodon: max 9, each <= 500 characters or the server's own limit. Each result lists every post's URL (thread.posts); if a later post is refused, the earlier ones stay published and thread.not_posted lists the rest."
    • changedInput schema / properties / per_platform / description
      Previous value: -"Per-platform drafts: { \"<platform>\": { \"text\": \"…\", \"title\": \"…\", \"tags\": [\"…\"] } }. X also takes \"thread\" (the posts after text, in order) and \"reply\" (one post under the last one, e.g. the link)."New value: +"Per-platform drafts: { \"<platform>\": { \"text\": \"…\", \"title\": \"…\", \"tags\": [\"…\"] } }. X, Bluesky and Mastodon also take \"thread\" (the posts after text, in order, each a reply to the one before; media stays on the first post). LinkedIn, X, Bluesky and Mastodon take \"first_comment\" (posted by the author right under the post, or under the last post of a thread: the place for the link). X also calls it \"reply\". Pass the thread and first_comment that generate_posts returned as they are."
    • 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. Changed3 schema fields changed
    • addedInput schema / properties / per_platform / additionalProperties / properties / reply
      Added value: +{
      +  "description": "X only: one post under the last post of the chain, e.g. the link.",
      +  "maxLength": 1000,
      +  "type": "string"
      +}
    • addedInput schema / properties / per_platform / additionalProperties / properties / thread
      Added value: +{
      +  "description": "X only: the posts of a thread after text, each a reply to the one before (max 25, each <= 280 as X counts).",
      +  "items": {
      +    "maxLength": 1000,
      +    "type": "string"
      +  },
      +  "maxItems": 25,
      +  "type": "array"
      +}
    • changedInput schema / properties / per_platform / description
      Previous value: -"Per-platform drafts: { \"<platform>\": { \"text\": \"…\", \"title\": \"…\", \"tags\": [\"…\"] } }."New value: +"Per-platform drafts: { \"<platform>\": { \"text\": \"…\", \"title\": \"…\", \"tags\": [\"…\"] } }. X also takes \"thread\" (the posts after text, in order) and \"reply\" (one post under the last one, e.g. the link)."
  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. Changed2 schema fields changed
    • changedInput schema / properties / privacy / description
      Previous value: -"YouTube visibility. Default: the platform's default."New 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."
    • changedInput schema / properties / privacy / enum
      Previous value: -[
      -  "public",
      -  "unlisted",
      -  "private"
      -]New value: +[
      +  "public",
      +  "unlisted",
      +  "friends",
      +  "private"
      +]
  6. 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"
      +]
  7. 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? }."
  8. 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. Required for TikTok and YouTube."New value: +"Public https URL of a video. Required for YouTube; TikTok takes a video or photos."
  9. Changed3 schema fields changed
    • changedInput schema / properties / brand_id / description
      Previous value: -"Which brand's accounts to use, from my_account.brand_list. Omit to use the default brand."New value: +"Which brand's accounts to use. Omit to use the default brand."
    • changedInput schema / properties / per_platform / description
      Previous value: -"Per-platform drafts, as returned by generate_posts: { \"<platform>\": { \"text\": \"…\", \"title\": \"…\", \"tags\": [\"…\"] } }."New value: +"Per-platform drafts: { \"<platform>\": { \"text\": \"…\", \"title\": \"…\", \"tags\": [\"…\"] } }."
    • changedInput schema / properties / title / description
      Previous value: -"Title, used by YouTube (and Reddit)."New value: +"Title, used by YouTube."
  10. First observed

TDQS

A4.5/5.0
Behavior5/5

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

With annotations already declaring a destructive, non-readOnly, open-world operation, the description adds substantial behavioral detail beyond them: irreversible public posting, duplicate refusal windows, platform connection requirements, per-platform media rules, brand ambiguity errors, approval holds, X credit accounting, thread reservation behavior, processing statuses, and specific error codes. This is unusually transparent for a complex publishing tool.

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 core action is front-loaded, but the description is a very long, dense block with numerous run-on sentences and nested details. The complexity justifies depth, yet the structure could be much tighter and more scannable without losing essential 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?

Despite having no output schema, the description fully explains the return shape, including posted, published_to, results fields, and thread results. It also covers error cases, held networks, approval flows, X credit usage, and platform-specific processing statuses, making it complete for an agent to invoke the tool correctly.

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 baseline is 3. The description still adds useful cross-parameter semantics: one text for all platforms or separate per_platform drafts, YouTube/TikTok/Instagram media requirements, the carousel threshold, thread and first_comment behavior, and the idempotency_key duplicate window. Much of this is also in the schema, but the fallback and interaction rules are clarified.

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?

The description states a specific verb and resource: 'Publishes a post immediately and publicly to the listed platforms.' The word 'immediately' clearly distinguishes it from sibling tools such as schedule_post and bulk_schedule, and it names the scope of platforms and account context.

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?

It gives clear context for when to use this tool: for immediate public publishing and when the user asks to post now. It also lists many prerequisites and exclusions, such as required platform connections, platform-specific media needs, and approval holds. It does not explicitly name schedule_post as the alternative for later posting, so it falls short of a full when/when-not/alternatives statement.

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.