Skip to main content
Glama

create_and_publish_post

Destructive

Create a new post and publish it immediately (no scheduling). Same media rules, channel IDs, and workspace selection rule as create_post apply (only one workspace → use it; multiple workspaces with no named one → ask first; named workspace → use and remember; mention workspace name on success). linkedin (personal profile) and linkedin_page (company page) are independent channels.

Pinterest board (auto-default to first board): If Pinterest is in channels and pinterest.board_id is NOT provided, do NOT block on asking — and do NOT skip Pinterest. Call get_account on the Pinterest account, take the FIRST board from the returned boards list, and pass its id as pinterest.board_id. In your reply, mention which board you used (e.g. "Published to your 'Marketing' board on Pinterest — let me know if you'd prefer a different one.") so the user can redirect. If the user named a specific board in the request, match it (case-insensitive) against the list and use that one instead.

X threads: For a chained X thread, pass x.thread_parts (2–25 { text } parts, each <= 280 chars). Do NOT split into "1/", "2/" inside content — that posts a single tweet, not a thread.

X posts containing a link use credits: X's API charges more for posts whose text contains a URL; OmniSocials passes that platform fee through as credits from the organisation's existing balance. Only a link written with http:// or https:// counts; a bare domain or www. link is free. Credits are only deducted once the post publishes successfully (a failed publish is never charged) — if the balance can't cover it at publish time, the X target alone fails and explains the shortfall while other platforms still publish. Relay any x_url_post_credits warning and X failure to the user; never strip their link to avoid the fee without asking. If the balance (minus credits reserved by scheduled X link posts) can't cover this post, the request is refused up front with a 402 x_credits_insufficient error instead of failing at publish — tell the user their X credit balance is too low for this post, don't retry.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
xNoX (Twitter) options, including thread mode via `thread_parts`.
typeNo
tiktokNoTikTok options
blueskyNoBluesky options, including thread mode via `thread_parts`.
contentYesPost caption. String or object with platform keys for per-channel captions: { "default": "fallback", "linkedin": "long", "threads": "short" }. Prefer one call per topic.
threadsNoThreads options: thread mode via `thread_parts`, location tag via `location_id`.
youtubeNoYouTube Shorts options. Only applies when type is 'reel' and youtube is among the selected channels. A custom Shorts thumbnail is set with the top-level `video_cover` (a `youtube` override for a YouTube-only image); it shows on Shorts only on channels where YouTube has enabled custom Shorts thumbnails (Partner Program channels first, since July 2026), other channels show a frame from the video.
channelsNoArray of channel IDs to post to (e.g. linkedin, linkedin_page, instagram).
facebookNoFacebook options
link_urlNoURL to share as a rich preview card on platforms that support link-share posts (LinkedIn and Facebook). Renders as a tile with thumbnail/title/description instead of plain text. Ignored on platforms that don't support link shares, and ignored on posts that already have media attached (media wins).
linkedinNoLinkedIn Profile options
mastodonNoMastodon options, including thread mode via `thread_parts`.
instagramNoInstagram options
media_idsNo
pinterestNo
user_tagsNoInstagram only. Tag public accounts at x/y positions on a PHOTO (not video/reels/stories). For a single image omit image_index; for a carousel, set image_index to the slide each tag belongs to. Private/non-existent usernames are rejected at publish time. Ignored by other platforms.
link_titleNoOptional title for the link-share preview. LinkedIn uses this when set; Facebook ignores it and fetches OG metadata server-side. Omit to let LinkedIn auto-fetch the page title.
media_urlsNoExternal image/video/PDF URLs — flat array or per-platform object. Max 10 total (Pinterest: max 5 images per carousel pin), each file ≤ 100 MB. Entries are URL strings or { url, alt } objects (alt = accessibility description, delivered to Mastodon/Bluesky/X/Pinterest/Instagram (images)/LinkedIn (images)). For larger files (up to 1 GB): upload_media with method 'url' first, then pass the returned media id in `media`.
hashtag_setNoName of a saved hashtag set (from list_hashtag_sets, matched case-insensitively) to apply to this post. The set's tags are merged in once at create time; tags already present in a caption are skipped. When the user says something like 'add my usual hashtags', check list_hashtag_sets first. Instagram's 30-hashtag cap is enforced with a clear error (hashtag_limit_exceeded).
location_idNoInstagram only. Facebook Place ID for a single physical venue (with a street address) to tag the post's location. Find it via the location search in the OmniSocials dashboard. Ignored by other platforms.
video_coverNoVideo thumbnail for a post whose media is ONE video. Applied on Instagram (feed videos and reels), Facebook (feed videos and reels), LinkedIn Profile and Page, TikTok, Pinterest and YouTube Shorts. YouTube Shorts: the cover shows on Shorts only on channels where YouTube has enabled custom Shorts thumbnails (rolling out since July 2026, Partner Program channels first); on other channels YouTube stores it as the default thumbnail but shows a frame from the video on Shorts. Say that it depends on the channel; do not promise it. TikTok only takes a frame: a 'custom' cover is skipped there, so add a tiktok override with type 'frame' when the user wants a specific TikTok frame. The per-platform reel fields (instagram.thumb_offset / cover_url, tiktok.video_cover_timestamp_ms, pinterest.video_cover) keep working and win over the base cover for their platform. get_post reads it back as `video_cover`.
collaboratorsNoInstagram only. Up to 3 public Instagram usernames to invite as co-authors (the 'Collab' feature). Works on image, carousel, and reel posts — NOT Stories. Invited users get an invite in the Instagram app; once they accept, the post also appears on their profile and feed. A leading '@' is stripped; usernames are case-insensitive. Private or non-existent usernames are rejected by Instagram at publish time. Ignored by other platforms.
linkedin_pageNoLinkedIn Company Page options
linkedin_pollNoNon-sponsored LinkedIn poll(s) — independent per channel, keyed by `linkedin` (personal profile) / `linkedin_page` (company page). A poll is mutually exclusive with media and a link share on that channel's post — a poll takes priority over both at publish time. Still requires `content.linkedin` (or `content.default`) as that channel's caption; the poll itself only carries the question/options/duration. On update_post, set a channel's key to `null` to clear that channel's poll and revert it to a normal post — send the full desired state for both channels, since the whole object replaces wholesale.
google_businessNoGoogle Business Profile options. Use to publish EVENT or OFFER posts, attach a CTA button, or both. Shape mirrors Google's LocalPost resource (see https://developers.google.com/my-business/reference/rest/v4/accounts.locations.localPosts#LocalPost). Google Business caption rules (enforced at scheduling — text that violates these will return a `validation_error` 400 before the post is saved): • Phone numbers in the caption are rejected — use a CALL button instead. • Inline URLs / bare domains / emails are rejected — use LEARN_MORE / BOOK / SHOP / SIGN_UP / ORDER buttons instead. • Caption max 1500 characters. • Media is optional (text-only posts are allowed). If attached: exactly one JPEG/PNG/WebP image (no video, no carousels). • The workspace must have a Google Business location selected (Settings → Organisation → Workspaces → Google Business) before scheduling — otherwise returns a 400.
link_descriptionNoOptional description for the link-share preview. LinkedIn uses this when set; Facebook auto-fetches the OG description.
hashtag_placementNoWhere the set's tags land. caption_append (default): appended to each target caption after a blank line. first_comment: posted as the auto first comment on Instagram/Facebook/LinkedIn/LinkedIn Page/YouTube/TikTok (TikTok only when the workspace enabled TikTok comments) (keeps hashtags out of the caption — appended after any explicit first_comment); platforms without a comment API fall back to caption_append. Stories always use captions.
hashtag_platformsNoOptional subset of the post's channels to apply the hashtag set to (e.g. ["instagram", "tiktok"]). Defaults to all selected channels.
link_thumbnail_urlNoOptional thumbnail image URL for the preview card. Currently applied on Facebook; reserved for LinkedIn.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedInput schema / properties / pinterest / properties / product_tags
      Added value: +{
      +  "description": "Products to tag on the Pin, so people can shop the items in the image. Up to 24 product Pins of the connected Pinterest account, each as a Pin ID string or a Pin link (https://www.pinterest.com/pin/<id>/). Get the IDs with list_pinterest_products. Only the account's own product Pins can be tagged (public, with a link on a website the account claimed on Pinterest); products of other merchants cannot. The tags are added right after the Pin is published; a product Pinterest refuses never fails the post, and get_post shows the outcome (product_tags_result). On update_post the pinterest object replaces the stored one, so leave product_tags out to remove the tags.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "maxItems": 24,
      +  "type": "array"
      +}
  2. Changed5 schema fields changed
    • addedInput schema / properties / facebook / properties / cover_url
      Added value: +{
      +  "description": "Custom thumbnail image URL (JPEG/PNG, max 10 MB). Used with thumbnail_type 'from-library'.",
      +  "type": "string"
      +}
    • addedInput schema / properties / facebook / properties / thumb_offset
      Added value: +{
      +  "description": "Frame timestamp in MILLISECONDS from the start of the video (e.g. 3000 = 0:03). Used with thumbnail_type 'from-video'.",
      +  "type": "number"
      +}
    • addedInput schema / properties / facebook / properties / thumbnail_type
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "from-video",
      +        "from-library"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Video thumbnail for Facebook feed videos and reels: 'from-video' uses the frame at thumb_offset, 'from-library' uploads the image at cover_url. Applied after the video is live; a thumbnail failure never fails the post. On update_post, null removes the Facebook override."
      +}
    • addedInput schema / properties / video_cover
      Added value: +{
      +  "description": "Video thumbnail for a post whose media is ONE video. Applied on Instagram (feed videos and reels), Facebook (feed videos and reels), LinkedIn Profile and Page, TikTok, Pinterest and YouTube Shorts. YouTube Shorts: the cover shows on Shorts only on channels where YouTube has enabled custom Shorts thumbnails (rolling out since July 2026, Partner Program channels first); on other channels YouTube stores it as the default thumbnail but shows a frame from the video on Shorts. Say that it depends on the channel; do not promise it. TikTok only takes a frame: a 'custom' cover is skipped there, so add a tiktok override with type 'frame' when the user wants a specific TikTok frame. The per-platform reel fields (instagram.thumb_offset / cover_url, tiktok.video_cover_timestamp_ms, pinterest.video_cover) keep working and win over the base cover for their platform. get_post reads it back as `video_cover`.",
      +  "properties": {
      +    "cover_url": {
      +      "description": "Public image URL, JPEG or PNG (type 'custom').",
      +      "type": "string"
      +    },
      +    "overrides": {
      +      "additionalProperties": {
      +        "anyOf": [
      +          {
      +            "properties": {
      +              "cover_url": {
      +                "description": "Public image URL, JPEG or PNG (type 'custom').",
      +                "type": "string"
      +              },
      +              "thumb_offset": {
      +                "description": "Milliseconds into the video (type 'frame'). 3000 = 0:03.",
      +                "maximum": 9007199254740991,
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "type": {
      +                "description": "'frame' uses the video frame at thumb_offset; 'custom' uploads the image at cover_url.",
      +                "enum": [
      +                  "frame",
      +                  "custom"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "type"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "description": "Per-platform overrides keyed by platform id (instagram, facebook, linkedin, linkedin_page, tiktok, pinterest, youtube). An override wins over the base cover for that platform.",
      +      "propertyNames": {
      +        "type": "string"
      +      },
      +      "type": "object"
      +    },
      +    "thumb_offset": {
      +      "description": "Milliseconds into the video (type 'frame'). 3000 = 0:03.",
      +      "maximum": 9007199254740991,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "type": {
      +      "description": "'frame' uses the video frame at thumb_offset; 'custom' uploads the image at cover_url.",
      +      "enum": [
      +        "frame",
      +        "custom"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "type"
      +  ],
      +  "type": "object"
      +}
    • changedInput schema / properties / youtube / description
      Previous value: -"YouTube Shorts options. Only applies when type is 'reel' and youtube is among the selected channels."New value: +"YouTube Shorts options. Only applies when type is 'reel' and youtube is among the selected channels. A custom Shorts thumbnail is set with the top-level `video_cover` (a `youtube` override for a YouTube-only image); it shows on Shorts only on channels where YouTube has enabled custom Shorts thumbnails (Partner Program channels first, since July 2026), other channels show a frame from the video."
  3. First observed

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and openWorldHint=true, yet the description adds substantial context beyond them: X link posts consume credits, failed publishes are never charged, partial failure isolates to the X target only, and a 402 x_credits_insufficient is returned up front rather than at publish. This is meaningful behavioral disclosure for a publish 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 opening sentence is front-loaded and clear, but the body is a dense run of bold-headed paragraphs mixing operational rules, error semantics, and edge cases. Much of this is justified by the tool's 29-parameter complexity, but the volume is heavy and some guidance could be tighter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 29-param, nested-object tool with no output schema, the description covers the highest-risk cross-cutting behaviors (credits, partial failure, workspace/board resolution). It leaves many per-platform option semantics to the 90%-covered schema, which is appropriate, but does not explain approval-workflow interactions despite siblings like get_post_approval existing.

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 90%, so baseline is 3, but the description adds genuine meaning for several params — the Pinterest board_id auto-default fallback logic, the distinction between x.thread_parts (thread) and content (single tweet), and the workspace selection rule — none of which are fully derivable from schema descriptions alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Create a new post and publish it immediately (no scheduling)'), which cleanly distinguishes immediate publishing from scheduled drafting. However, it does not explicitly name create_post or publish_post as the sibling it differs from, leaving the agent to infer the boundary from the parenthetical.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides strong operational guidance for specific cases (workspace selection rule, Pinterest board auto-default, X thread vs single tweet), but never states when to choose this tool over create_post/publish_post or what the prerequisites are. Usage is implied through the referenced create_post rules rather than spelled out.

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