Skip to main content
Glama

Publish Post

publish_post
Destructive

Publish or schedule a social media post, save a draft, reply to an existing post, or create a thread. Before publishing or scheduling (draft is false or omitted), call get_platform_limits for each distinct destination platform. Check the text and the selected post type's requirements for each account, including thread entries and per-account overrides. If a known limit is exceeded, explain the affected field, actual value and allowed limit to the user before attempting to publish. Only assess file properties from verified metadata; do not infer dimensions, duration or codecs from a filename or URL. Use accountId for one account, or posts for one group across several accounts in the same workspace. Shared media is imported once; every account is validated before any post is created. Each item may override text, media, platformOptions, replyTo or thread. Set draft=true to save in dopost without publishing or scheduling; omit publishAt. Drafts may be incomplete and can be edited or published in the dopost dashboard. Provide at least text or media (or both) when publishing or scheduling. When draft is false or omitted, set publishAt to an ISO 8601 date to schedule, or omit to publish immediately. For X, Threads, and Mastodon, use thread to publish follow-up posts in one operation. For X and Threads, replyTo can target an existing platform post ID. Use platformOptions to pass platform-specific settings (see parameter description for details). Files are verified on receipt; destination publishing requirements are checked when publishing or scheduling. A processing response means the request was accepted; use get_post to confirm PUBLISHED or inspect a FAILED result.

Input Schema

NameRequiredDescriptionDefault
textNo
draftNoSet true to save a DRAFT in dopost without publishing or scheduling. Omit publishAt. Defaults to false
mediaNo
postsNoCreate one group for up to 20 different accounts in the same workspace. Items inherit top-level content fields; supplied item fields replace those defaults. Put draft, publishAt and timezone at the top level. Shared media URLs are imported once
threadNo
replyToNo
timezoneNoOptional IANA timezone override. Unzoned dates default to the workspace timezone; explicit Z or offsets are respected
accountIdNoConnected social account ID for a single post. Use either accountId or posts
publishAtNoISO date to schedule; defaults to workspace timezone when unzoned. Omit to publish now
platformOptionsNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed29 schema fields changed
    • changedInput schema / properties / accountId / description
      Previous value: -"ID of the connected social account"New value: +"Connected social account ID for a single post. Use either accountId or posts"
    • addedInput schema / properties / accountId / minLength
      Added value: +1
    • addedInput schema / properties / draft
      Added value: +{
      +  "description": "Set true to save a DRAFT in dopost without publishing or scheduling. Omit publishAt. Defaults to false",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / media / $ref
      Added value: +"#/properties/posts/items/properties/media"
    • removedInput schema / properties / media / description
      Removed value: -"Up to 10 public media URLs"
    • removedInput schema / properties / media / items
      Removed value: -{
      -  "format": "uri",
      -  "type": "string"
      -}
    • removedInput schema / properties / media / maxItems
      Removed value: -10
    • removedInput schema / properties / media / type
      Removed value: -"array"
    • addedInput schema / properties / platformOptions / $ref
      Added value: +"#/properties/posts/items/properties/platformOptions"
    • removedInput schema / properties / platformOptions / additionalProperties
      Removed value: -false
    • removedInput schema / properties / platformOptions / description
      Removed value: -"Platform-specific options. Only include keys relevant to the target platform. Instagram: postType, shareToFeed. TikTok: privacyLevel, disableDuet, disableStitch, disableComment, discloseContent, isYourBrand, isBrandedContent. YouTube: videoType, title, privacyStatus. Pinterest: board. Telegram: pin. X Communities: communityName (preferred), communityId, shareWithFollowers. Google Business: postType, ctaType, ctaUrl, eventTitle, eventStart, eventEnd, couponCode, redeemOnlineUrl, termsConditions, mediaCategory."
    • removedInput schema / properties / platformOptions / properties
      Removed value: -{
      -  "board": {
      -    "description": "Pinterest board ID",
      -    "minLength": 1,
      -    "type": "string"
      -  },
      -  "communityId": {
      -    "description": "X: numeric Community ID or x.com Community URL",
      -    "type": "string"
      -  },
      -  "communityName": {
      -    "description": "X: name of a saved Community returned by list_x_communities. The MCP server resolves its ID internally",
      -    "minLength": 1,
      -    "type": "string"
      -  },
      -  "couponCode": {
      -    "description": "Google Business offer coupon",
      -    "maxLength": 100,
      -    "type": "string"
      -  },
      -  "ctaType": {
      -    "description": "Google Business: call-to-action type",
      -    "enum": [
      -      "book",
      -      "order",
      -      "shop",
      -      "learn_more",
      -      "sign_up",
      -      "call"
      -    ],
      -    "type": "string"
      -  },
      -  "ctaUrl": {
      -    "description": "Google Business: public HTTP(S) CTA URL; omit for call",
      -    "format": "uri",
      -    "type": "string"
      -  },
      -  "disableComment": {
      -    "description": "TikTok: disable comments",
      -    "type": "boolean"
      -  },
      -  "disableDuet": {
      -    "description": "TikTok: disable duets",
      -    "type": "boolean"
      -  },
      -  "disableStitch": {
      -    "description": "TikTok: disable stitches",
      -    "type": "boolean"
      -  },
      -  "discloseContent": {
      -    "description": "TikTok: disclose promotional or branded content",
      -    "type": "boolean"
      -  },
      -  "eventEnd": {
      -    "description": "Google Business event end in the selected timezone",
      -    "format": "date-time",
      -    "type": "string"
      -  },
      -  "eventStart": {
      -    "description": "Google Business event start: defaults to workspace timezone; an explicit offset is respected",
      -    "format": "date-time",
      -    "type": "string"
      -  },
      -  "eventTitle": {
      -    "description": "Google Business event or offer title",
      -    "maxLength": 58,
      -    "type": "string"
      -  },
      -  "isBrandedContent": {
      -    "description": "TikTok disclosure: the post promotes a third-party brand",
      -    "type": "boolean"
      -  },
      -  "isYourBrand": {
      -    "description": "TikTok disclosure: the post promotes your own brand",
      -    "type": "boolean"
      -  },
      -  "mediaCategory": {
      -    "description": "Google Business profile media category",
      -    "enum": [
      -      "ADDITIONAL",
      -      "COVER",
      -      "PROFILE",
      -      "LOGO",
      -      "EXTERIOR",
      -      "INTERIOR",
      -      "PRODUCT",
      -      "AT_WORK",
      -      "FOOD_AND_DRINK",
      -      "MENU",
      -      "COMMON_AREA",
      -      "ROOMS",
      -      "TEAMS"
      -    ],
      -    "type": "string"
      -  },
      -  "pin": {
      -    "description": "Telegram: pin the published message or media album",
      -    "type": "boolean"
      -  },
      -  "postType": {
      -    "description": "Instagram: \"feed\" | \"story\" | \"reel\"; Google Business: \"standard\" | \"event\" | \"offer\" | \"media\"",
      -    "enum": [
      -      "feed",
      -      "story",
      -      "reel",
      -      "carousel",
      -      "standard",
      -      "event",
      -      "offer",
      -      "media"
      -    ],
      -    "type": "string"
      -  },
      -  "privacyLevel": {
      -    "description": "TikTok privacy level",
      -    "enum": [
      -      "PUBLIC_TO_EVERYONE",
      -      "MUTUAL_FOLLOW_FRIENDS",
      -      "FOLLOWER_OF_CREATOR",
      -      "SELF_ONLY"
      -    ],
      -    "type": "string"
      -  },
      -  "privacyStatus": {
      -    "description": "YouTube video privacy",
      -    "enum": [
      -      "public",
      -      "private",
      -      "unlisted"
      -    ],
      -    "type": "string"
      -  },
      -  "redeemOnlineUrl": {
      -    "description": "Google Business offer redemption URL",
      -    "format": "uri",
      -    "type": "string"
      -  },
      -  "shareToFeed": {
      -    "description": "Instagram Reels: also show the Reel in Feed",
      -    "type": "boolean"
      -  },
      -  "shareWithFollowers": {
      -    "description": "X Communities: also distribute the same Community Post to followers; defaults to true",
      -    "type": "boolean"
      -  },
      -  "termsConditions": {
      -    "description": "Google Business offer terms",
      -    "maxLength": 5000,
      -    "type": "string"
      -  },
      -  "title": {
      -    "description": "YouTube video title",
      -    "maxLength": 100,
      -    "type": "string"
      -  },
      -  "videoType": {
      -    "description": "YouTube video type",
      -    "enum": [
      -      "video",
      -      "short"
      -    ],
      -    "type": "string"
      -  }
      -}
    • removedInput schema / properties / platformOptions / type
      Removed value: -"object"
    • addedInput schema / properties / posts
      Added value: +{
      +  "description": "Create one group for up to 20 different accounts in the same workspace. Items inherit top-level content fields; supplied item fields replace those defaults. Put draft, publishAt and timezone at the top level. Shared media URLs are imported once",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "accountId": {
      +        "description": "Connected account in the group's workspace",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "media": {
      +        "description": "Up to 10 public HTTPS media URLs. External files are copied to dopost storage and validated against the destination requirements before publishing or scheduling",
      +        "items": {
      +          "format": "uri",
      +          "type": "string"
      +        },
      +        "maxItems": 10,
      +        "type": "array"
      +      },
      +      "platformOptions": {
      +        "additionalProperties": false,
      +        "description": "Platform-specific options. Only include keys relevant to the target platform. Instagram: postType, shareToFeed. TikTok: privacyLevel, disableDuet, disableStitch, disableComment, discloseContent, isYourBrand, isBrandedContent. YouTube: videoType, title, privacyStatus. Pinterest: board. Telegram: pin. X Communities: communityName (preferred), communityId, shareWithFollowers. Google Business: postType, ctaType, ctaUrl, eventTitle, eventStart, eventEnd, couponCode, redeemOnlineUrl, termsConditions, mediaCategory.",
      +        "properties": {
      +          "board": {
      +            "description": "Pinterest board ID",
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "communityId": {
      +            "description": "X: numeric Community ID or x.com Community URL",
      +            "type": "string"
      +          },
      +          "communityName": {
      +            "description": "X: name of a saved Community returned by list_x_communities. The MCP server resolves its ID internally",
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "couponCode": {
      +            "description": "Google Business offer coupon",
      +            "maxLength": 100,
      +            "type": "string"
      +          },
      +          "ctaType": {
      +            "description": "Google Business: call-to-action type",
      +            "enum": [
      +              "book",
      +              "order",
      +              "shop",
      +              "learn_more",
      +              "sign_up",
      +              "call"
      +            ],
      +            "type": "string"
      +          },
      +          "ctaUrl": {
      +            "description": "Google Business: public HTTP(S) CTA URL; omit for call",
      +            "format": "uri",
      +            "type": "string"
      +          },
      +          "disableComment": {
      +            "description": "TikTok: disable comments",
      +            "type": "boolean"
      +          },
      +          "disableDuet": {
      +            "description": "TikTok: disable duets",
      +            "type": "boolean"
      +          },
      +          "disableStitch": {
      +            "description": "TikTok: disable stitches",
      +            "type": "boolean"
      +          },
      +          "discloseContent": {
      +            "description": "TikTok: disclose promotional or branded content",
      +            "type": "boolean"
      +          },
      +          "eventEnd": {
      +            "description": "Google Business event end in the selected timezone",
      +            "format": "date-time",
      +            "type": "string"
      +          },
      +          "eventStart": {
      +            "description": "Google Business event start: defaults to workspace timezone; an explicit offset is respected",
      +            "format": "date-time",
      +            "type": "string"
      +          },
      +          "eventTitle": {
      +            "description": "Google Business event or offer title",
      +            "maxLength": 58,
      +            "type": "string"
      +          },
      +          "isBrandedContent": {
      +            "description": "TikTok disclosure: the post promotes a third-party brand",
      +            "type": "boolean"
      +          },
      +          "isYourBrand": {
      +            "description": "TikTok disclosure: the post promotes your own brand",
      +            "type": "boolean"
      +          },
      +          "mediaCategory": {
      +            "description": "Google Business profile media category",
      +            "enum": [
      +              "ADDITIONAL",
      +              "COVER",
      +              "PROFILE",
      +              "LOGO",
      +              "EXTERIOR",
      +              "INTERIOR",
      +              "PRODUCT",
      +              "AT_WORK",
      +              "FOOD_AND_DRINK",
      +              "MENU",
      +              "COMMON_AREA",
      +              "ROOMS",
      +              "TEAMS"
      +            ],
      +            "type": "string"
      +          },
      +          "pin": {
      +            "description": "Telegram: pin the published message or media album",
      +            "type": "boolean"
      +          },
      +          "postType": {
      +            "description": "Instagram: \"feed\" | \"story\" | \"reel\"; Google Business: \"standard\" | \"event\" | \"offer\" | \"media\"",
      +            "enum": [
      +              "feed",
      +              "story",
      +              "reel",
      +              "carousel",
      +              "standard",
      +              "event",
      +              "offer",
      +              "media"
      +            ],
      +            "type": "string"
      +          },
      +          "privacyLevel": {
      +            "description": "TikTok privacy level",
      +            "enum": [
      +              "PUBLIC_TO_EVERYONE",
      +              "MUTUAL_FOLLOW_FRIENDS",
      +              "FOLLOWER_OF_CREATOR",
      +              "SELF_ONLY"
      +            ],
      +            "type": "string"
      +          },
      +          "privacyStatus": {
      +            "description": "YouTube video privacy",
      +            "enum": [
      +              "public",
      +              "private",
      +              "unlisted"
      +            ],
      +            "type": "string"
      +          },
      +          "redeemOnlineUrl": {
      +            "description": "Google Business offer redemption URL",
      +            "format": "uri",
      +            "type": "string"
      +          },
      +          "shareToFeed": {
      +            "description": "Instagram Reels: also show the Reel in Feed",
      +            "type": "boolean"
      +          },
      +          "shareWithFollowers": {
      +            "description": "X Communities: also distribute the same Community Post to followers; defaults to true",
      +            "type": "boolean"
      +          },
      +          "termsConditions": {
      +            "description": "Google Business offer terms",
      +            "maxLength": 5000,
      +            "type": "string"
      +          },
      +          "title": {
      +            "description": "YouTube video title",
      +            "maxLength": 100,
      +            "type": "string"
      +          },
      +          "videoType": {
      +            "description": "YouTube video type",
      +            "enum": [
      +              "video",
      +              "short"
      +            ],
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "replyTo": {
      +        "description": "External platform post ID to reply to. Supported for X and Threads; this is not a dopost post ID",
      +        "maxLength": 200,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "text": {
      +        "description": "Post text content",
      +        "type": "string"
      +      },
      +      "thread": {
      +        "description": "Ordered follow-up posts. Supported for X, Threads, and Mastodon; each item replies to the previous one",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "media": {
      +              "description": "Optional public media URLs for this follow-up post",
      +              "items": {
      +                "format": "uri",
      +                "type": "string"
      +              },
      +              "maxItems": 4,
      +              "type": "array"
      +            },
      +            "text": {
      +              "description": "Text for this follow-up post",
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "text"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 20,
      +        "minItems": 1,
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "accountId"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 20,
      +  "minItems": 1,
      +  "type": "array"
      +}
    • addedInput schema / properties / replyTo / $ref
      Added value: +"#/properties/posts/items/properties/replyTo"
    • removedInput schema / properties / replyTo / description
      Removed value: -"External platform post ID to reply to. Supported for X and Threads; this is not a dopost post ID"
    • removedInput schema / properties / replyTo / maxLength
      Removed value: -200
    • removedInput schema / properties / replyTo / minLength
      Removed value: -1
    • removedInput schema / properties / replyTo / type
      Removed value: -"string"
    • addedInput schema / properties / text / $ref
      Added value: +"#/properties/posts/items/properties/text"
    • removedInput schema / properties / text / description
      Removed value: -"Post text content"
    • removedInput schema / properties / text / type
      Removed value: -"string"
    • addedInput schema / properties / thread / $ref
      Added value: +"#/properties/posts/items/properties/thread"
    • removedInput schema / properties / thread / description
      Removed value: -"Ordered follow-up posts. Supported for X, Threads, and Mastodon; each item replies to the previous one"
    • removedInput schema / properties / thread / items
      Removed value: -{
      -  "additionalProperties": false,
      -  "properties": {
      -    "media": {
      -      "description": "Optional public media URLs for this follow-up post",
      -      "items": {
      -        "format": "uri",
      -        "type": "string"
      -      },
      -      "maxItems": 4,
      -      "type": "array"
      -    },
      -    "text": {
      -      "description": "Text for this follow-up post",
      -      "minLength": 1,
      -      "type": "string"
      -    }
      -  },
      -  "required": [
      -    "text"
      -  ],
      -  "type": "object"
      -}
    • removedInput schema / properties / thread / maxItems
      Removed value: -20
    • removedInput schema / properties / thread / minItems
      Removed value: -1
    • removedInput schema / properties / thread / type
      Removed value: -"array"
    • removedInput schema / required
      Removed value: -[
      -  "accountId"
      -]
  2. Changed5 schema fields changed
    • changedInput schema / properties / platformOptions / properties / ctaUrl / description
      Previous value: -"Google Business: HTTPS CTA URL"New value: +"Google Business: public HTTP(S) CTA URL; omit for call"
    • changedInput schema / properties / platformOptions / properties / eventEnd / description
      Previous value: -"Google Business event end time"New value: +"Google Business event end in the selected timezone"
    • changedInput schema / properties / platformOptions / properties / eventStart / description
      Previous value: -"Google Business event start time"New value: +"Google Business event start: defaults to workspace timezone; an explicit offset is respected"
    • changedInput schema / properties / publishAt / description
      Previous value: -"ISO 8601 date to schedule. Omit to publish now"New value: +"ISO date to schedule; defaults to workspace timezone when unzoned. Omit to publish now"
    • addedInput schema / properties / timezone
      Added value: +{
      +  "description": "Optional IANA timezone override. Unzoned dates default to the workspace timezone; explicit Z or offsets are respected",
      +  "type": "string"
      +}
  3. First observed

TDQS

A4.4/5.0
Behavior4/5

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

Beyond the annotations (destructive, non-idempotent, open-world), the description discloses atomicity ('every account is validated before any post is created'), single-import of shared media, file verification on receipt versus destination checks at publish time, and that incomplete drafts are allowed. It also explains that a processing response is only an acceptance, which is critical for an async mutation. It does not spell out what a destructive failure leaves behind or how partial failures across accounts are reported, so it stops short of a 5.

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 purpose is front-loaded and the prerequisite (get_platform_limits) follows immediately, which is good ordering. However, the block is dense and mixes several registers in one paragraph, repeating draft/publishAt semantics that the schema already states, and the section on media metadata sits awkwardly among publish-flow rules.

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 10-parameter, multi-destination mutation tool with no output schema, the description covers prerequisites, validation order, draft behavior, scheduling semantics, and async result confirmation. What it omits is the shape of the accepted/processing response and how per-account failures surface across a group of up to 20 accounts.

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?

With only 50% schema coverage, the description carries real weight: it clarifies accountId vs posts as alternatives, that item fields replace top-level defaults, that drafts omit publishAt, and which platforms accept thread and replyTo. Gaps remain for timezone handling and for how platformOptions keys map to destinations beyond 'see parameter description for details'.

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 opening sentence names the specific verb set (publish, schedule, save draft, reply, thread) and the resource, so the agent immediately knows this is the multi-mode creation tool. It is clearly separable from siblings like create_recurring_post, reschedule_post, and get_post, which are named or implied by the follow-up instructions.

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?

It gives explicit conditional routing: 'Before publishing or scheduling (draft is false or omitted), call get_platform_limits', draft=true versus publishAt for scheduling, accountId for one account versus posts for a group, and thread/replyTo only for named platforms. It also states the alternative path when a processing response is returned (use get_post to confirm PUBLISHED or inspect FAILED).

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