Skip to main content
Glama

Create post

create_post

Saves a post across platforms, one target each with its own caption and media (Media is optional on Facebook, Threads, LinkedIn, X, Bluesky, Google Business Profile: leave media_id and media_ids out for a text post. Instagram, TikTok, YouTube, Pinterest need an image or video.). The post lands as needs approval (or as a draft with submit: false) and publishes at scheduled_at once a person approves it, in show_posts or at approval_url; a brand with auto-approve on approves it at once when every rule passes. Refused with every problem and its fix if anything fails the checks; check_post runs the same checks without saving. Pass idempotency_key so a retried call returns the first post instead of a duplicate. Returns the post with allowed_actions, preview_url and approval_url. Captions may contain {link}, replaced by the brand site link with UTM tags. Facebook and LinkedIn captions must contain {link} unless the first_comment does; Instagram and TikTok must not contain links ("Link in bio" is the usual line). Threads takes one hashtag at most, Instagram 5 and 20 @ mentions. Google Business Profile takes 1,500 characters and no hashtags; put its link on the button (google.button) rather than in the text, and keep phone numbers and emails out of it (Google may remove the post). TikTok takes 2,200 characters on a video and 4,000 on a photo post. X counts 280 its own way (a link is 23, an emoji or a Chinese, Japanese or Korean character 2), and X posts with a link ({link}, a URL or a bare domain like example.com) are capped per calendar month (UTC) by plan: get_workspace gives x_link_posts used and left. The brand rules from get_brand apply too. scheduled_at: ISO 8601 with an offset, e.g. 2026-10-06T09:00:00-07:00 for 9am in Los Angeles. A time without an offset is read as UTC. The workspace's time zone is in get_workspace. Or "next_slot": each platform takes the next of its posting times in the next 30 days that no other post of this brand takes on that platform (taken means the exact same time, so a post at 09:05 leaves 09:00 free). A platform's posting times are the brand's own for it (brands[].platform_posting_weeks in get_workspace), else the workspace's posting_week. Platforms on the same times go out together, at the first time free on all of them; one on other times gets its own time on its target. The answer gives the post's time (scheduled_at, local_time) and each target's. Refused when there are no posting times or all are taken.

Input Schema

NameRequiredDescriptionDefault
slugNoUsed as utm_content; defaults to the title slugified. Unique per brand.
brandNoBrand id from get_workspace. Optional when the workspace has one brand.
briefYesWhat the post is and why, for the person approving it.
titleYesShort internal title, for the person reviewing.
submitNofalse keeps it as a draft (call request_approval later). Default true: sent for approval now.
targetsYesOne per platform.
ai_generatedNoTrue when the content is AI-made or AI-edited and looks realistic. Instagram gets its AI info label; YouTube gets its altered or synthetic content declaration; TikTok drafts must be labelled by hand in the app; Threads and Facebook have no label. Applies to every target unless one sets its own.
scheduled_atYesISO 8601 with an offset, e.g. 2026-10-06T09:00:00-07:00 for 9am in Los Angeles. A time without an offset is read as UTC. The workspace's time zone is in get_workspace. Or "next_slot": each platform takes the next of its posting times in the next 30 days that no other post of this brand takes on that platform (taken means the exact same time, so a post at 09:05 leaves 09:00 free). A platform's posting times are the brand's own for it (brands[].platform_posting_weeks in get_workspace), else the workspace's posting_week. Platforms on the same times go out together, at the first time free on all of them; one on other times gets its own time on its target. The answer gives the post's time (scheduled_at, local_time) and each target's. Refused when there are no posting times or all are taken.
idempotency_keyNoAny unique string per intended post, e.g. a UUID.

Output Schema

NameRequiredDescriptionDefault
titleYes
statusYes
post_idYes
targetsYes
approvalYes
preview_urlYes
approval_urlYes
scheduled_atYes
allowed_actionsYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changed
    • changedInput schema / properties / targets / items / properties / first_comment / description
      Previous value: -"Posted as the first comment right after the post: Instagram feed posts and carousels (2,200 characters; not a single video, which is a Reel), Facebook (8,000), LinkedIn (1,250), Threads (500; a reply that counts toward Threads' 250 posts a day) and YouTube (10,000; regular videos and Shorts; posted but not pinned, pin it in YouTube Studio). Not TikTok, X, Bluesky or Pinterest. On LinkedIn and Facebook put the link here ({link}) rather than in the caption; on Instagram links in comments are not clickable either, so say \"Link in bio\". Hashtags: Threads one, Instagram 5 across caption and comment. {link} and the brand rules apply as in captions. A person approves it with the post."New value: +"Posted as the first comment right after the post: Instagram feed posts and carousels (2,200 characters; not a single video, which is a Reel), Facebook (8,000), LinkedIn (1,250), Threads (500; a reply that counts toward Threads' 250 posts a day) and YouTube (10,000; regular videos and Shorts; posted but not pinned, pin it in YouTube Studio). Not TikTok, X, Bluesky, Pinterest or Google Business Profile. On LinkedIn and Facebook put the link here ({link}) rather than in the caption; on Instagram links in comments are not clickable either, so say \"Link in bio\". Hashtags: Threads one, Instagram 5 across caption and comment. {link} and the brand rules apply as in captions. A person approves it with the post."
    • addedInput schema / properties / targets / items / properties / google
      Added value: +{
      +  "description": "Google Business Profile only: the post's type, event, offer and button. Left out, a plain update with no button. A person approves it with the post.",
      +  "properties": {
      +    "button": {
      +      "anyOf": [
      +        {
      +          "properties": {
      +            "type": {
      +              "description": "learn_more, book, order (Order online), shop (Buy) or sign_up.",
      +              "enum": [
      +                "learn_more",
      +                "book",
      +                "order",
      +                "shop",
      +                "sign_up"
      +              ],
      +              "type": "string"
      +            },
      +            "url": {
      +              "description": "https link where the customer does it, or {link} for the brand link.",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "type",
      +            "url"
      +          ],
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "The button under the post."
      +    },
      +    "event": {
      +      "anyOf": [
      +        {
      +          "properties": {
      +            "end": {
      +              "description": "Same form as start; a time on both or neither.",
      +              "type": "string"
      +            },
      +            "start": {
      +              "description": "YYYY-MM-DD, or YYYY-MM-DDTHH:MM with a time, in the business’s own time.",
      +              "type": "string"
      +            },
      +            "title": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "title",
      +            "start",
      +            "end"
      +          ],
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "An event, or the dates an offer runs. Google removes it once it has ended."
      +    },
      +    "offer": {
      +      "anyOf": [
      +        {
      +          "properties": {
      +            "coupon_code": {
      +              "type": "string"
      +            },
      +            "redeem_url": {
      +              "description": "https link, or {link}.",
      +              "type": "string"
      +            },
      +            "terms": {
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "post_type": {
      +      "description": "update (the default): news about the business. event: needs event. offer: a sale or deal; needs event too (its title and the dates it runs), plus any of offer.",
      +      "enum": [
      +        "update",
      +        "event",
      +        "offer"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • changedInput schema / properties / targets / items / properties / media_id / description
      Previous value: -"The one image or video. Or give media_ids. Media is optional on Facebook, Threads, LinkedIn, X, Bluesky: leave media_id and media_ids out for a text post. Instagram, TikTok, YouTube, Pinterest need an image or video."New value: +"The one image or video. Or give media_ids. Media is optional on Facebook, Threads, LinkedIn, X, Bluesky, Google Business Profile: leave media_id and media_ids out for a text post. Instagram, TikTok, YouTube, Pinterest need an image or video."
    • changedInput schema / properties / targets / items / properties / media_ids / description
      Previous value: -"A carousel: 2 or more media ids in posting order, first is the cover. Give this or media_id, not both. Instagram up to 10 (images and videos), Threads 20, Facebook 10 images, TikTok photo posts 35 images, LinkedIn 20 images, YouTube none."New value: +"A carousel: 2 or more media ids in posting order, first is the cover. Give this or media_id, not both. Instagram up to 10 (images and videos), Threads 20, Facebook 10 images, TikTok photo posts 35 images, LinkedIn 20 images, YouTube, Pinterest and Google Business Profile none."
    • changedInput schema / properties / targets / items / properties / platform / enum
      Previous value: -[
      -  "instagram",
      -  "facebook",
      -  "threads",
      -  "tiktok",
      -  "linkedin",
      -  "youtube",
      -  "x",
      -  "bluesky",
      -  "pinterest"
      -]New value: +[
      +  "instagram",
      +  "facebook",
      +  "threads",
      +  "tiktok",
      +  "linkedin",
      +  "youtube",
      +  "x",
      +  "bluesky",
      +  "pinterest",
      +  "googlebusiness"
      +]
  2. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond annotations: approval flow (needs approval, auto-approve brands, approval_url), idempotency_key preventing duplicates, per-platform caption rules, and the X monthly link-post cap. Return shape (allowed_actions, preview_url, approval_url) is also disclosed even though an output schema exists.

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?

Dense but front-loaded; it is long and buries high-value facts (idempotency, approval flow) inside a wall of per-platform constraints that partly duplicate schema descriptions. Acceptable for a tool this complex, but not tight.

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 a high-complexity multi-platform publishing tool, the description covers approval lifecycle, scheduling semantics, failure behavior, idempotency, and per-platform limits – everything an agent needs to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, yet the description still adds cross-cutting meaning: scheduled_at offset semantics and the next_slot scheduling algorithm, per-platform media/character/link rules tied to targets, and {link} substitution.

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 and scope ('Saves a post across platforms, one target each with its own caption and media'), and names the sibling check_post it complements rather than duplicates.

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?

Explicitly routes to check_post for dry-run validation, to submit:false/request_approval for drafts, and to get_workspace/get_brand for the required posting times and rules. The alternative paths are stated with their conditions.

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