Skip to main content
Glama

publish_scheduled

Destructive

Schedule a post for future publishing. PREFERRED tool when the user is interacting with you in chat -- skips the Socialync drafts page. If the user has switched on the publish confirmation dialog in Socialync settings (off by default) and their client supports MCP elicitation, Socialync shows the user a confirmation dialog with the exact post and time before it enters the queue: a decline rejects it and comes back as success false with consent "declined" (never retry; ask the user), and no answer within 40 seconds counts as the confirmation the user already gave you in chat. On other clients there is NO dialog: once you call this, the post enters the scheduled queue and will publish automatically at scheduledFor. Either way, before calling, show the user the caption, platforms, media, and the scheduled time, and get their explicit confirmation in chat. Media options: base64Images (user uploaded images to you in chat), imageUrls (public https), videoUrl (ONE public https video URL -- Socialync copies it into its own storage at call time), or mediaId (media already in Socialync, from list_media -- use for "the video I uploaded"). YouTube allowed for VIDEO posts only (and needs title). TikTok takes one video or a photo post of images (a swipeable photo carousel). Returns scheduled post IDs. Same validation as schedule_post_draft. 10/day cap per profile per publish day (UTC date of scheduledFor). ALWAYS run validate_post with these same arguments FIRST and resolve every error it reports before calling this.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "caption": "<caption>",
      "scheduledFor": "<scheduledFor>"
    },
    "name": "publish_scheduled"
  }
}

Input Schema

NameRequiredDescriptionDefault
titleNoPost title. REQUIRED when youtube is in platforms (it becomes the YouTube video title).
captionYesPost caption/text content.
mediaIdNoReference to media already in Socialync, from list_media (e.g. "upload:abc123"). Use this when the user uploaded their video/images in the Socialync app. Mutually exclusive with imageUrls/base64Images/videoUrl. Video mediaIds work on ALL platforms including TikTok and YouTube; image mediaIds work everywhere except YouTube.
videoUrlNoOne publicly fetchable https video URL (max 512MB). Socialync copies it into its own storage when you call this tool, so the link only has to work right now (an expiring export link is fine); a link that is already dead fails the call. Large videos take a while to copy; for files you generated yourself prefer create_media_upload + mediaId. No base64 video (if the user attached a video file in chat, have them upload it at socialync.io and use mediaId instead). Mutually exclusive with imageUrls/base64Images/mediaId. Each platform enforces its own format/duration/size limits at publish time (e.g. Bluesky ~60s, X free tier ~2:20).
imageUrlsNoUp to 10 publicly fetchable https image URLs. Socialync copies them into its own storage when you call this tool, so the links only have to work right now. Combined with base64Images cannot exceed 10 total. Mutually exclusive with videoUrl/mediaId.
platformsNoPlatforms to schedule. Any of: facebook, instagram, tiktok, youtube, linkedin, twitter, threads, bluesky. YouTube requires a video (mediaId or videoUrl) and a title. TikTok requires a video or images. Pass platforms OR audienceId, not both.
profileIdNoThe Socialync profile to post from. Call list_profiles to see the profiles you can post to. Required only when this connection is authorized for more than one profile; if exactly one is authorized it is used automatically.
audienceIdNoA saved audience id from list_audiences. Expands to the platforms that audience reaches on the target profile; any member it cannot reach (other brand, needs reconnect, secondary account without its primary) is reported back in skippedMembers instead of failing the call. Use INSTEAD of platforms, never together.
base64ImagesNoUp to 10 images as base64 strings (data URIs accepted). Use when the user uploaded image(s) to you -- Socialync hosts them so they stay reachable at publish time. Per-image cap: 8MB. Combined with imageUrls cannot exceed 10 total. Mutually exclusive with videoUrl/mediaId.
firstCommentNoOptional "first comment": text Socialync posts as a comment under the post right after it publishes -- the classic home for hashtags and links, keeps the caption clean. One string for all platforms. Supported: instagram, threads, twitter, youtube, linkedin, bluesky. Facebook and TikTok do not support it (they record it as skipped; the post itself is unaffected). Per-platform comment length limits are enforced at draft time: instagram 2200, threads 500, twitter 280, youtube 10000, linkedin 1250, bluesky 300. A failed comment never fails the post.
scheduledForYesISO 8601 UTC datetime for when to publish (e.g. 2026-04-15T14:00:00Z). Must be in the future.
exceptPlatformsNoOnly valid together with audienceId: platforms to leave out of the expanded audience for this one post (e.g. exclude tiktok when the post has no video).
instagramTrialReelNoOptional. Post the Instagram leg of this VIDEO post as an Instagram Trial Reel, shown only to non-followers. MANUAL: stays a trial until the user shares it with followers in the Instagram app. AUTO: Instagram shares it with followers automatically if it performs well. Omit for a regular Reel. One video only: images, carousels and Stories cannot be trial reels. Sharing a trial with followers cannot be done through the API, so never tell the user it will happen for them on MANUAL. An Instagram-only trial reel uses its own daily allowance (10 per UTC day per profile), separate from regular posts, so a trial reel plus a regular post of the same video later does not halve the regular allowance. Same as platformSpecificSettings.instagram = { trialReel: true, graduationStrategy: "MANUAL" | "AUTO" }.
tiktokPrivacyLevelNoRequired when tiktok is in platforms. Who can view the TikTok post (video or photos): PUBLIC_TO_EVERYONE (Everyone), MUTUAL_FOLLOW_FRIENDS (Friends), FOLLOWER_OF_CREATOR (Followers, private TikTok accounts only) or SELF_ONLY (Only me). TikTok requires this to be the user's own choice with no preset value: ask the user and pass their answer. One answer covers every TikTok post the user asks for together (for example "schedule all five, everyone can view"), so ask once per batch, not once per post. Never pick a level yourself or carry one over from posts the user did not say it applies to. When you ask, also tell them: "By posting, you agree to TikTok's Music Usage Confirmation" (https://www.tiktok.com/legal/page/global/music-usage-confirmation/en). Same as platformSpecificSettings.tiktok.privacyLevel.
platformSpecificSettingsNoPer-platform settings keyed by platform. Caption overrides: { "<platform>": { "customCaption": "..." } }. Instagram Trial Reel: { "instagram": { "trialReel": true, "graduationStrategy": "MANUAL" | "AUTO" } } (or use instagramTrialReel). TikTok: { "tiktok": { "privacyLevel": "PUBLIC_TO_EVERYONE" | "MUTUAL_FOLLOW_FRIENDS" | "FOLLOWER_OF_CREATOR" | "SELF_ONLY" } } is required for every TikTok post and must be the user's own choice (or use tiktokPrivacyLevel). TikTok interaction settings default to allowed; pass { "tiktok": { "allowComments": false, "allowDuets": false, "allowStitching": false } } to turn any of them off. TikTok commercial content: { "tiktok": { "brandContent": true } } labels it "Promotional content" (the creator's own business); { "tiktok": { "brandedContent": true } } labels it "Paid partnership" (a third party). A paid partnership cannot be SELF_ONLY. AI label: { "<platform>": { "aiGenerated": true } } on tiktok, youtube or instagram shows that platform's AI-generated label (TikTok video only). Set it when the user says the media was made or substantially changed with AI. YouTube: { "youtube": { "isPrivate": true } } uploads as private; { "youtube": { "isKidsContent": true } } marks it made for kids. Threads topic: { "threads": { "topicTag": "Book Club" } } files the post under that topic (one per post, up to 50 characters, no periods or ampersands).

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / platformSpecificSettings / description
      Previous value: -"Per-platform settings keyed by platform. Caption overrides: { \"<platform>\": { \"customCaption\": \"...\" } }. Instagram Trial Reel: { \"instagram\": { \"trialReel\": true, \"graduationStrategy\": \"MANUAL\" | \"AUTO\" } } (or use instagramTrialReel). TikTok: { \"tiktok\": { \"privacyLevel\": \"PUBLIC_TO_EVERYONE\" | \"MUTUAL_FOLLOW_FRIENDS\" | \"FOLLOWER_OF_CREATOR\" | \"SELF_ONLY\" } } is required for every TikTok post and must be the user's own choice (or use tiktokPrivacyLevel). TikTok interaction settings default to allowed; pass { \"tiktok\": { \"allowComments\": false, \"allowDuets\": false, \"allowStitching\": false } } to turn any of them off. TikTok commercial content: { \"tiktok\": { \"brandContent\": true } } labels it \"Promotional content\" (the creator's own business); { \"tiktok\": { \"brandedContent\": true } } labels it \"Paid partnership\" (a third party). A paid partnership cannot be SELF_ONLY. AI label: { \"<platform>\": { \"aiGenerated\": true } } on tiktok, youtube or instagram shows that platform's AI-generated label (TikTok video only). Set it when the user says the media was made or substantially changed with AI. YouTube: { \"youtube\": { \"isPrivate\": true } } uploads as private; { \"youtube\": { \"isKidsContent\": true } } marks it made for kids."New value: +"Per-platform settings keyed by platform. Caption overrides: { \"<platform>\": { \"customCaption\": \"...\" } }. Instagram Trial Reel: { \"instagram\": { \"trialReel\": true, \"graduationStrategy\": \"MANUAL\" | \"AUTO\" } } (or use instagramTrialReel). TikTok: { \"tiktok\": { \"privacyLevel\": \"PUBLIC_TO_EVERYONE\" | \"MUTUAL_FOLLOW_FRIENDS\" | \"FOLLOWER_OF_CREATOR\" | \"SELF_ONLY\" } } is required for every TikTok post and must be the user's own choice (or use tiktokPrivacyLevel). TikTok interaction settings default to allowed; pass { \"tiktok\": { \"allowComments\": false, \"allowDuets\": false, \"allowStitching\": false } } to turn any of them off. TikTok commercial content: { \"tiktok\": { \"brandContent\": true } } labels it \"Promotional content\" (the creator's own business); { \"tiktok\": { \"brandedContent\": true } } labels it \"Paid partnership\" (a third party). A paid partnership cannot be SELF_ONLY. AI label: { \"<platform>\": { \"aiGenerated\": true } } on tiktok, youtube or instagram shows that platform's AI-generated label (TikTok video only). Set it when the user says the media was made or substantially changed with AI. YouTube: { \"youtube\": { \"isPrivate\": true } } uploads as private; { \"youtube\": { \"isKidsContent\": true } } marks it made for kids. Threads topic: { \"threads\": { \"topicTag\": \"Book Club\" } } files the post under that topic (one per post, up to 50 characters, no periods or ampersands)."
  2. Changed3 schema fields changed
    • changedInput schema / properties / mediaId / description
      Previous value: -"Reference to media already in Socialync, from list_media (e.g. \"upload:abc123\"). Use this when the user uploaded their video/images in the Socialync app. Mutually exclusive with imageUrls/base64Images/videoUrl. Video mediaIds work on ALL platforms including TikTok and YouTube."New value: +"Reference to media already in Socialync, from list_media (e.g. \"upload:abc123\"). Use this when the user uploaded their video/images in the Socialync app. Mutually exclusive with imageUrls/base64Images/videoUrl. Video mediaIds work on ALL platforms including TikTok and YouTube; image mediaIds work everywhere except YouTube."
    • changedInput schema / properties / platforms / description
      Previous value: -"Platforms to schedule. Any of: facebook, instagram, tiktok, youtube, linkedin, twitter, threads, bluesky. TikTok/YouTube require a video (mediaId or videoUrl); YouTube also requires title. Pass platforms OR audienceId, not both."New value: +"Platforms to schedule. Any of: facebook, instagram, tiktok, youtube, linkedin, twitter, threads, bluesky. YouTube requires a video (mediaId or videoUrl) and a title. TikTok requires a video or images. Pass platforms OR audienceId, not both."
    • changedInput schema / properties / tiktokPrivacyLevel / description
      Previous value: -"Required when tiktok is in platforms. Who can view the TikTok video: PUBLIC_TO_EVERYONE (Everyone), MUTUAL_FOLLOW_FRIENDS (Friends), FOLLOWER_OF_CREATOR (Followers, private TikTok accounts only) or SELF_ONLY (Only me). TikTok requires this to be the user's own choice with no preset value: ask the user and pass their answer. One answer covers every TikTok post the user asks for together (for example \"schedule all five, everyone can view\"), so ask once per batch, not once per video. Never pick a level yourself or carry one over from posts the user did not say it applies to. When you ask, also tell them: \"By posting, you agree to TikTok's Music Usage Confirmation\" (https://www.tiktok.com/legal/page/global/music-usage-confirmation/en). Same as platformSpecificSettings.tiktok.privacyLevel."New value: +"Required when tiktok is in platforms. Who can view the TikTok post (video or photos): PUBLIC_TO_EVERYONE (Everyone), MUTUAL_FOLLOW_FRIENDS (Friends), FOLLOWER_OF_CREATOR (Followers, private TikTok accounts only) or SELF_ONLY (Only me). TikTok requires this to be the user's own choice with no preset value: ask the user and pass their answer. One answer covers every TikTok post the user asks for together (for example \"schedule all five, everyone can view\"), so ask once per batch, not once per post. Never pick a level yourself or carry one over from posts the user did not say it applies to. When you ask, also tell them: \"By posting, you agree to TikTok's Music Usage Confirmation\" (https://www.tiktok.com/legal/page/global/music-usage-confirmation/en). Same as platformSpecificSettings.tiktok.privacyLevel."
  3. First observed

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already flag destructiveHint/openWorldHint, and the description layers on non-obvious behavior: the optional elicitation confirmation dialog, decline returning success false with consent "declined" and a never-retry rule, the 40-second timeout counting as consent, silent queueing on clients without a dialog, automatic publishing at scheduledFor, media being copied into Socialync storage at call time, and the 10/day per-profile cap by UTC publish date. This is far beyond what the annotations convey.

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?

Front-loaded correctly: purpose, then confirmation semantics, then media routing, then caps, then the validate_post mandate. Nearly every clause carries actionable information, but it is delivered as one dense wall of text for a 15-parameter tool and would scan better with structure; the long conditional confirmation-dialog passage is the heaviest stretch.

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 destructive, 15-parameter tool with a nested object and no output schema, the description still covers the return value ("Returns scheduled post IDs"), consent/error semantics, rate limits, cross-parameter platform constraints, and the mandatory validation step. Nothing an agent needs in order to call this safely is missing.

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

Parameters3/5

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

Schema description coverage is 100% and the 15 parameters are documented exhaustively in the schema itself (mutual exclusivity, per-platform limits, TikTok privacy rules, platformSpecificSettings key map). The description's media-option summary and YouTube/TikTok constraints largely restate schema text, so it earns the baseline 3 rather than extra credit.

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 ("Schedule a post for future publishing") and immediately positions itself against the draft-based flow: "PREFERRED tool when the user is interacting with you in chat -- skips the Socialync drafts page." An agent can distinguish it from create_post_draft/schedule_post_draft/publish_now without opening any 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?

Explicit when-to-use (chat interaction preferred over the drafts page), explicit prerequisite sequencing ("ALWAYS run validate_post with these same arguments FIRST and resolve every error"), explicit confirmation protocol before calling, and explicit media-source routing (base64Images for chat uploads, mediaId for "the video I uploaded", videoUrl for public links). No major decision is left to inference.

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.