Skip to main content
Glama

create_post

Schedule or immediately publish one social media post. DESTRUCTIVE WRITE that creates content on the user's connected social account. Always confirm caption + scheduled_at + account_id/workspace with the user before calling. For Instagram, distinguish caption @mentions from native instagram_settings.user_tags and co-author instagram_settings.collaborators; call list_platforms with view=schema and account_id before either native feature. Native media tags work with eligible direct or Meta-linked accounts; collaborators require an eligible Meta-linked account. Instagram caption add-ons (caption_addon poll or comment prompt) need a Facebook Login account, a caption, and a feed photo, Reel, or carousel. Stories are rejected, and a poll cannot be combined with a comment prompt. Third-party media URLs are copied into posterly storage before the post is saved; short-lived signed URLs must still be live when this tool runs. For multiple posts, prefer create_posts_batch after confirming every item. On an error or lost reply, retry with the same idempotency_key; a repeat within 10 minutes returns the original post (deduplicated: true). TikTok: with no privacy_level it posts directly using the saved default or public (tiktok_audience_defaulted); post_mode inbox sends it to the app.

Input Schema

NameRequiredDescriptionDefault
captionNoPost caption/text. On Instagram, @username is a caption mention, not a native tag or collaborator invite. Optional on Instagram Stories (first slide only in a series). Ignored when thread_posts is provided.
confirmYesMust be true after the user explicitly confirms the post/account/workspace/schedule.
metadataNo
platformNoPlatform name when using username. Supported: instagram, facebook, tiktok, twitter, linkedin, youtube, pinterest, threads, google_business, telegram, bluesky, discord, slack, mastodon, devto, hashnode, wordpress, lemmy. Aliases x, gmb, and instagram-standalone are also accepted by the API.
settingsNoDeprecated alias of platform_settings (or instagram_settings for Instagram). Prefer those instead.
usernameNoAccount username; requires platform.
media_urlNoMedia URL. Posterly storage URLs are used as-is; third-party URLs are copied into posterly storage first. Short-lived signed URLs must still be live when this tool runs.
post_typeNoOptional post type. Omit for auto-detection from media. Supported semantic values include text, image, video, carousel, reel, story, story_series, document, x_thread, threads_thread, photo, and cover_photo.
account_idNoSocial account ID from list_accounts.
media_urlsNoMedia URLs, handled like media_url.
scheduled_atNoISO 8601 UTC datetime. Omit to publish immediately.
thread_postsNoFor X or Threads: 2+ entries, one per post in the reply chain.
workspace_idNoWorkspace ID from whoami.
idempotency_keyNoOptional retry key. Reuse the same value if this create errors or the response is lost.
platform_settingsNoPlatform-specific composer controls, flattened across platforms (unrelated fields ignored). Required: YouTube title; Pinterest board_id (cover_image_url also required for video Pins); Lemmy community. Accepted via passthrough but not listed below: Lemmy community/title, Dev.to canonical_url, Hashnode publication_id, Telegram parse_mode/disable_web_page_preview, Google Business post_type (STANDARD/EVENT/OFFER, alias topic_type), TikTok auto_add_music/photo_cover_index/media_type, Facebook post_type (incl. cover_photo), Mastodon language. Call list_platforms with view=schema and account_id for fields and examples.
instagram_settingsNoInstagram-specific settings: native media tags (user_tags) and co-author invitations (collaborators). Call list_platforms with view=schema and account_id first.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / platform_settings / properties / post_mode / description
      Previous value: -"TikTok delivery: auto (needs privacy_level) or inbox. Omitting both fields means inbox, with tiktok_inbox_implicit."New value: +"TikTok delivery: auto (default, unless the account is set to Finish in TikTok app) or inbox. With no privacy_level, auto uses the saved default or public."
  2. Changed3 schema fields changed
    • addedInput schema / properties / idempotency_key
      Added value: +{
      +  "description": "Optional retry key. Reuse the same value if this create errors or the response is lost.",
      +  "maxLength": 255,
      +  "type": "string"
      +}
    • addedInput schema / properties / platform_settings / properties / post_mode
      Added value: +{
      +  "description": "TikTok delivery: auto (needs privacy_level) or inbox. Omitting both fields means inbox, with tiktok_inbox_implicit.",
      +  "enum": [
      +    "auto",
      +    "inbox"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / platform_settings / properties / privacy_level / description
      Previous value: -"TikTok privacy level."New value: +"TikTok audience for auto: PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR, or SELF_ONLY."
  3. Changed1 schema field changed
    • changedInput schema / properties / caption / description
      Previous value: -"Post caption/text. On Instagram, @username creates a caption mention only; it is not a native media tag or collaborator invitation. Ignored when thread_posts is provided."New value: +"Post caption/text. On Instagram, @username is a caption mention, not a native tag or collaborator invite. Optional on Instagram Stories (first slide only in a series). Ignored when thread_posts is provided."
  4. Changed4 schema fields changed
    • changedInput schema / properties / instagram_settings / description
      Previous value: -"Instagram-specific settings. Distinguish caption @mentions (put @username in caption) from native media tags (user_tags) and co-author invitations (collaborators). Call list_platforms with view=schema and account_id first."New value: +"Instagram-specific settings: native media tags (user_tags) and co-author invitations (collaborators). Call list_platforms with view=schema and account_id first."
    • changedInput schema / properties / media_url / description
      Previous value: -"Media URL. Posterly storage URLs are used as-is; third-party HTTP(S) URLs are copied into posterly storage before the post is saved. Short-lived signed URLs must still be live when this tool runs."New value: +"Media URL. Posterly storage URLs are used as-is; third-party URLs are copied into posterly storage first. Short-lived signed URLs must still be live when this tool runs."
    • changedInput schema / properties / media_urls / description
      Previous value: -"Media URLs. Posterly storage URLs are used as-is; third-party HTTP(S) URLs are copied into posterly storage before the post is saved."New value: +"Media URLs, handled like media_url."
    • changedInput schema / properties / platform_settings / description
      Previous value: -"Platform-specific composer controls, flattened across all platforms (unrelated fields ignored). Required: YouTube title; Pinterest board_id (cover_image_url also required for video Pins); Lemmy community. Accepted via passthrough but not listed below: Lemmy community/title, Dev.to canonical_url, Hashnode publication_id, Telegram parse_mode/disable_web_page_preview, Google Business post_type (STANDARD/EVENT/OFFER, alias topic_type), TikTok auto_add_music/photo_cover_index/media_type, Facebook post_type (incl. cover_photo), Mastodon language. Call list_platforms with view=schema and account_id for the full field list and examples."New value: +"Platform-specific composer controls, flattened across platforms (unrelated fields ignored). Required: YouTube title; Pinterest board_id (cover_image_url also required for video Pins); Lemmy community. Accepted via passthrough but not listed below: Lemmy community/title, Dev.to canonical_url, Hashnode publication_id, Telegram parse_mode/disable_web_page_preview, Google Business post_type (STANDARD/EVENT/OFFER, alias topic_type), TikTok auto_add_music/photo_cover_index/media_type, Facebook post_type (incl. cover_photo), Mastodon language. Call list_platforms with view=schema and account_id for fields and examples."
  5. Changed1 schema field changed
    • addedInput schema / properties / platform_settings / properties / article
      Added value: +{
      +  "description": "X Article (needs an X Premium account): publish the caption as an Article. Pass null to turn Article mode off. The caption is the Markdown body (headings, bold, italic, lists, quotes, code blocks, tables, dividers); reference attached images with ![caption](media:1). Cannot be combined with poll, thread_posts, paid_partnership, video, or GIF.",
      +  "properties": {
      +    "cover": {
      +      "description": "Use the first attached image as the Article cover (default) or none.",
      +      "enum": [
      +        "first_image",
      +        "none"
      +      ],
      +      "type": "string"
      +    },
      +    "title": {
      +      "description": "Article title (required).",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "title"
      +  ],
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  6. First observed

TDQS

A4.6/5.0
Behavior4/5

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

Annotations only say readOnly=false and destructive=false; the description adds substantial behavioral context: third-party media URLs are copied into posterly storage and short-lived signed URLs must still be live at run time, a repeat idempotency_key within 10 minutes returns the original post with deduplicated: true, and TikTok defaults to public/auto when privacy_level is omitted. Minor tension: calling it a 'DESTRUCTIVE WRITE' reads harsher than destructiveHint=false, though it is consistent with a non-read-only mutation, and it usefully warns the agent to confirm first.

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?

Purpose and the confirmation requirement are front-loaded, and nearly every sentence encodes a genuine constraint (media URL liveness, Instagram native tags, retry dedup, TikTok defaults). It is a dense single block though, and the Instagram-specific rules could be segmented for faster scanning.

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 an 18-platform tool with 16 parameters, deeply nested settings objects, no output schema, and per-platform quirks, the description covers the dangerous-operation warning, confirmation precondition, platform-specific gotchas, error/retry behavior, and where to get further schema detail. An agent has enough to call this 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 coverage is 94%, so baseline is 3, but the description adds real meaning beyond the schema: it distinguishes Instagram caption @mentions from native user_tags and collaborators, explains when caption_addon features are allowed (Facebook Login account, caption, feed photo/Reel/carousel, not Stories), and clarifies that confirm must follow explicit user confirmation. These are cross-parameter constraints the schema cannot express.

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+scope: 'Schedule or immediately publish one social media post.' The 'one' explicitly separates it from the sibling create_posts_batch, which is also named later, so the agent can distinguish the two without opening either schema.

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-to-use routing (single post here, create_posts_batch for multiple), a precondition ('Always confirm caption + scheduled_at + account_id/workspace with the user before calling'), a prerequisite lookup step (list_platforms with view=schema and account_id for Instagram native features), and retry guidance with idempotency_key. Exclusions for Stories and poll+comment-prompt combinations are stated outright.

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.

Resources