Skip to main content
Glama

Schedule a post

sprkly_schedule_post

Queue a post for publishing, in ONE call. Attach media by passing the user's link straight to media_urls: sprkly downloads it into storage itself for the platforms that need that, so no upload tool has to run first. Runs the same quota, duplicate-content and platform pre-flight checks as the sprkly app. Instagram and TikTok require media at submission time; YouTube and TikTok require a title, and TikTok also requires platform_meta.tiktok.privacyLevel — just send the level the user asked for and this tool names the allowed values if it is not one of them. It reads the real bytes of the media and the response says what will actually publish on each platform (a Reel, a 3-slide carousel, a photo set, a Page feed video) plus anything worth passing on: relay that to the user. Confirm the date, time and target accounts with the user first. If a target platform has more than one connected account and profile_ids is not given, the tool returns needsAccountChoice with the options instead of scheduling — put that choice to the user, then re-call.

Tool call template

This tool declares no required parameters. Add optional parameters from the input schema as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {},
    "name": "sprkly_schedule_post"
  }
}

Input Schema

NameRequiredDescriptionDefault
titleNoPost title. Required for YouTube (max 100 characters) and TikTok (max 150 characters).
captionNoPost caption. Each platform's own limit applies: X 280, Bluesky 300, Threads 500, Instagram and TikTok video 2,200, LinkedIn 3,000, TikTok photos 4,000, YouTube 5,000 bytes, Facebook 63,206, Telegram 4,096 as text alone and 1,024 with a photo or video. No < or > on YouTube. Links in a caption or first comment are published as written: sprkly does not check them. Too long for a target is refused with caption_too_long.
alt_textNoOptional alt text, one entry per media item, in the same order as media_urls then media_ids. Use "" for an item with no alt text. Up to 1,000 characters each. A list longer than the media is refused. Stored with the post. Used on platforms that support it.
categoryNoOptional content category, e.g. "fitness".
media_idNoId of a single media file already uploaded to sprkly. Shorthand for a one-item media_ids.
media_idsNoIds of media files already uploaded to sprkly, in slide order. Array order is the published order. Use these when the user already has media in sprkly, or when one file is going on several posts; for a link the user just gave you, media_urls is fewer steps. Every photo in a set must be the SAME shape or the call is refused: export them all at 1080x1920 (9:16), 1080x1440 (3:4), 1080x1350 (4:5) or 1080x1080 (1:1). Instagram takes at most 20 slides; TikTok photo sets take up to 35.
platformsNoPlatforms to publish to. A platform with exactly one connected account is targeted directly; one with several makes the tool answer needsAccountChoice so the user can pick.
post_typeNoOptional. What the post is for: awareness (show new people who you are and what you sell), educational (teach something useful), proof (show that other people trust you), conversation (get people to reply), conversion (ask people to buy, book or order now), loyalty (for people who already bought). Any other value is refused. Separate from category, which is the topic.
automationNoInstagram only, optional. An auto reply that switches on once this post is live: when someone comments the keyword, sprkly DMs them. Not on a story. It replies to real people, so show the user the word and the DM first. One per Instagram account in the targets.
media_urlsNoPublicly reachable image or video URLs to attach, in slide order. Pass links through for ANY platform. Instagram and Threads fetch them directly; for TikTok, YouTube and Facebook sprkly downloads the file into its own storage while scheduling, so a link works there too and any problem with it is reported now, in this call. Google Drive and Dropbox share links are converted automatically. JPEG, PNG, WebP, GIF, MP4, MOV and WebM only: AVIF and HEIC (the iPhone camera default) are refused with re-export instructions, because sprkly cannot convert them. Each file must be publicly reachable and under 50 MB.
profile_idsNoSpecific accounts to publish to, from sprkly_list_profiles. When given, this list IS the target set — platforms are not fanned out.
all_accountsNoExplicitly post to EVERY connected account on every listed platform, skipping the needsAccountChoice question. Only pass true when the user has said they want all accounts.
approval_noteNoOptional note to the owner, shown in the approval email. Only used with requires_approval.
first_commentNoInstagram only. Optional text sprkly posts as the first comment under the post right after it publishes, e.g. "Comment GUIDE and I will send you the link." Up to 2,200 characters. Ignored for other platforms. Refused on a story (surface story): stories take no comments. Every paid plan: Free gets upgrade_required.
platform_metaNoPlatform-specific publishing options, keyed by platform.
scheduled_timeNoISO 8601 timestamp to publish at. Must be in the future. If omitted the post goes out on the next publisher run, about a minute from now — there is no smart slot-picking, so pass an explicit time unless the user wants it published immediately. sprkly_get_analytics can suggest one.
x_link_as_textNoX only. Writes each link in the X caption as plain text, like sprkly dot app, so X counts it as a post without a link. A post with a link uses more of the X posts on lifetime plans. Other platforms keep the caption as sent.
requires_approvalNoHold the post until the owner approves it. It is saved as pending_approval and never publishes on its own; the owner gets an email with an Approve link and can also approve or reject in the sprkly calendar. Poll sprkly_get_post_approval_status for the answer. Brand, Pro, Agency and lifetime Tier 2 and up only (postApproval in sprkly_get_account_summary): other plans get upgrade_required.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedInput schema / properties / post_type
      Added value: +{
      +  "description": "Optional. What the post is for: awareness (show new people who you are and what you sell), educational (teach something useful), proof (show that other people trust you), conversation (get people to reply), conversion (ask people to buy, book or order now), loyalty (for people who already bought). Any other value is refused. Separate from category, which is the topic.",
      +  "enum": [
      +    "awareness",
      +    "educational",
      +    "proof",
      +    "conversation",
      +    "conversion",
      +    "loyalty"
      +  ],
      +  "type": "string"
      +}
  2. Changed1 schema field changed
    • changedInput schema / properties / requires_approval / description
      Previous value: -"Hold the post until the owner approves it. It is saved as pending_approval and never publishes on its own; the owner gets an email with an Approve link and can also approve or reject in the sprkly calendar. Poll sprkly_get_post_approval_status for the answer. Brand, Pro and Agency only: other plans get upgrade_required."New value: +"Hold the post until the owner approves it. It is saved as pending_approval and never publishes on its own; the owner gets an email with an Approve link and can also approve or reject in the sprkly calendar. Poll sprkly_get_post_approval_status for the answer. Brand, Pro, Agency and lifetime Tier 2 and up only (postApproval in sprkly_get_account_summary): other plans get upgrade_required."
  3. Changed1 schema field changed
    • changedInput schema / properties / caption / description
      Previous value: -"Post caption. Each platform's own limit applies: Instagram and TikTok video 2,200, TikTok photos 4,000, YouTube 5,000 bytes, Threads 500. No < or > on YouTube. Links in a caption or first comment are published as written: sprkly does not check them."New value: +"Post caption. Each platform's own limit applies: X 280, Bluesky 300, Threads 500, Instagram and TikTok video 2,200, LinkedIn 3,000, TikTok photos 4,000, YouTube 5,000 bytes, Facebook 63,206, Telegram 4,096 as text alone and 1,024 with a photo or video. No < or > on YouTube. Links in a caption or first comment are published as written: sprkly does not check them. Too long for a target is refused with caption_too_long."
  4. Changed2 schema fields changed
    • changedInput schema / properties / caption / description
      Previous value: -"Post caption. Each platform's own limit applies: Instagram and TikTok video 2,200, TikTok photos 4,000, YouTube 5,000 bytes, Threads 500. No < or > on YouTube."New value: +"Post caption. Each platform's own limit applies: Instagram and TikTok video 2,200, TikTok photos 4,000, YouTube 5,000 bytes, Threads 500. No < or > on YouTube. Links in a caption or first comment are published as written: sprkly does not check them."
    • changedInput schema / properties / platforms / items / enum
      Previous value: -[
      -  "instagram",
      -  "tiktok",
      -  "youtube",
      -  "threads",
      -  "facebook",
      -  "bluesky",
      -  "x",
      -  "linkedin"
      -]New value: +[
      +  "instagram",
      +  "tiktok",
      +  "youtube",
      +  "threads",
      +  "facebook",
      +  "bluesky",
      +  "x",
      +  "linkedin",
      +  "telegram"
      +]
  5. Changed2 schema fields changed
    • changedInput schema / properties / first_comment / description
      Previous value: -"Instagram only. Optional text sprkly posts as the first comment under the post right after it publishes, e.g. \"Comment GUIDE and I will send you the link.\" Up to 2,200 characters. Ignored for other platforms. Refused on a story (surface story): stories take no comments. Creator and Power only: Free gets upgrade_required."New value: +"Instagram only. Optional text sprkly posts as the first comment under the post right after it publishes, e.g. \"Comment GUIDE and I will send you the link.\" Up to 2,200 characters. Ignored for other platforms. Refused on a story (surface story): stories take no comments. Every paid plan: Free gets upgrade_required."
    • changedInput schema / properties / requires_approval / description
      Previous value: -"Hold the post until the owner approves it. It is saved as pending_approval and never publishes on its own; the owner gets an email with an Approve link and can also approve or reject in the sprkly calendar. Poll sprkly_get_post_approval_status for the answer. Power plan only: other plans get upgrade_required."New value: +"Hold the post until the owner approves it. It is saved as pending_approval and never publishes on its own; the owner gets an email with an Approve link and can also approve or reject in the sprkly calendar. Poll sprkly_get_post_approval_status for the answer. Brand, Pro and Agency only: other plans get upgrade_required."
  6. Changed5 schema fields changed
    • changedInput schema / properties / automation / properties / dm / description
      Previous value: -"The DM sent to them, up to 1,000 characters."New value: +"The DM sent to them, up to 1,000 bytes: about 1,000 plain letters, fewer with emoji."
    • changedInput schema / properties / caption / description
      Previous value: -"Post caption, max 2200 characters."New value: +"Post caption. Each platform's own limit applies: Instagram and TikTok video 2,200, TikTok photos 4,000, YouTube 5,000 bytes, Threads 500. No < or > on YouTube."
    • changedInput schema / properties / media_ids / description
      Previous value: -"Ids of media files already uploaded to sprkly, in slide order. Array order is the published order. Use these when the user already has media in sprkly, or when one file is going on several posts; for a link the user just gave you, media_urls is fewer steps. Every photo in a set must be the SAME shape or the call is refused: export them all at 1080x1920 (9:16), 1080x1440 (3:4), 1080x1350 (4:5) or 1080x1080 (1:1). Instagram takes at most 10 slides; TikTok photo sets take up to 35."New value: +"Ids of media files already uploaded to sprkly, in slide order. Array order is the published order. Use these when the user already has media in sprkly, or when one file is going on several posts; for a link the user just gave you, media_urls is fewer steps. Every photo in a set must be the SAME shape or the call is refused: export them all at 1080x1920 (9:16), 1080x1440 (3:4), 1080x1350 (4:5) or 1080x1080 (1:1). Instagram takes at most 20 slides; TikTok photo sets take up to 35."
    • changedInput schema / properties / platforms / items / enum
      Previous value: -[
      -  "instagram",
      -  "tiktok",
      -  "youtube",
      -  "threads",
      -  "facebook",
      -  "bluesky",
      -  "x"
      -]New value: +[
      +  "instagram",
      +  "tiktok",
      +  "youtube",
      +  "threads",
      +  "facebook",
      +  "bluesky",
      +  "x",
      +  "linkedin"
      +]
    • addedInput schema / properties / x_link_as_text
      Added value: +{
      +  "default": false,
      +  "description": "X only. Writes each link in the X caption as plain text, like sprkly dot app, so X counts it as a post without a link. A post with a link uses more of the X posts on lifetime plans. Other platforms keep the caption as sent.",
      +  "type": "boolean"
      +}
  7. Changed1 schema field changed
    • addedInput schema / properties / alt_text
      Added value: +{
      +  "description": "Optional alt text, one entry per media item, in the same order as media_urls then media_ids. Use \"\" for an item with no alt text. Up to 1,000 characters each. A list longer than the media is refused. Stored with the post. Used on platforms that support it.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  8. Changed1 schema field changed
    • addedInput schema / properties / automation
      Added value: +{
      +  "description": "Instagram only, optional. An auto reply that switches on once this post is live: when someone comments the keyword, sprkly DMs them. Not on a story. It replies to real people, so show the user the word and the DM first. One per Instagram account in the targets.",
      +  "properties": {
      +    "buttons": {
      +      "description": "Optional link buttons under the DM, up to 3. Needs dm.",
      +      "items": {
      +        "properties": {
      +          "title": {
      +            "description": "Up to 20 characters.",
      +            "type": "string"
      +          },
      +          "url": {
      +            "description": "A full https link.",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "title",
      +          "url"
      +        ],
      +        "type": "object"
      +      },
      +      "maxItems": 3,
      +      "type": "array"
      +    },
      +    "campaign": {
      +      "description": "Optional. A campaign label, up to 60 characters.",
      +      "type": "string"
      +    },
      +    "comment_reply": {
      +      "description": "Optional public reply under their comment.",
      +      "type": "string"
      +    },
      +    "daily_send_cap": {
      +      "description": "Optional. Most DMs a day for this automation, 1 to 1000.",
      +      "type": "number"
      +    },
      +    "dm": {
      +      "description": "The DM sent to them, up to 1,000 characters.",
      +      "type": "string"
      +    },
      +    "ends_at": {
      +      "description": "Optional. When it switches off, ISO 8601 with a time zone. Must be after the post time.",
      +      "type": "string"
      +    },
      +    "keyword": {
      +      "description": "The word people comment. Needed for post_keyword.",
      +      "type": "string"
      +    },
      +    "kind": {
      +      "description": "post_keyword (the default) answers comments with the keyword. post_any_comment answers every comment.",
      +      "enum": [
      +        "post_keyword",
      +        "post_any_comment"
      +      ],
      +      "type": "string"
      +    },
      +    "name": {
      +      "description": "Optional. Its name in sprkly.",
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  9. Changed1 schema field changed
    • changedInput schema / properties / first_comment / description
      Previous value: -"Instagram only. Optional text sprkly posts as the first comment under the post right after it publishes, e.g. \"Comment GUIDE and I will send you the link.\" Up to 2,200 characters. Ignored for other platforms. Refused on a story (surface story): stories take no comments."New value: +"Instagram only. Optional text sprkly posts as the first comment under the post right after it publishes, e.g. \"Comment GUIDE and I will send you the link.\" Up to 2,200 characters. Ignored for other platforms. Refused on a story (surface story): stories take no comments. Creator and Power only: Free gets upgrade_required."
  10. Changed2 schema fields changed
    • addedInput schema / properties / first_comment
      Added value: +{
      +  "description": "Instagram only. Optional text sprkly posts as the first comment under the post right after it publishes, e.g. \"Comment GUIDE and I will send you the link.\" Up to 2,200 characters. Ignored for other platforms. Refused on a story (surface story): stories take no comments.",
      +  "type": "string"
      +}
    • changedInput schema / properties / platforms / items / enum
      Previous value: -[
      -  "instagram",
      -  "tiktok",
      -  "youtube",
      -  "threads",
      -  "facebook"
      -]New value: +[
      +  "instagram",
      +  "tiktok",
      +  "youtube",
      +  "threads",
      +  "facebook",
      +  "bluesky",
      +  "x"
      +]
  11. Changed1 schema field changed
    • changedInput schema / properties / platforms / items / enum
      Previous value: -[
      -  "instagram",
      -  "tiktok",
      -  "youtube",
      -  "threads",
      -  "facebook",
      -  "bluesky",
      -  "x"
      -]New value: +[
      +  "instagram",
      +  "tiktok",
      +  "youtube",
      +  "threads",
      +  "facebook"
      +]
  12. Changed1 schema field changed
    • changedInput schema / properties / platforms / items / enum
      Previous value: -[
      -  "instagram",
      -  "tiktok",
      -  "youtube",
      -  "threads",
      -  "facebook",
      -  "bluesky"
      -]New value: +[
      +  "instagram",
      +  "tiktok",
      +  "youtube",
      +  "threads",
      +  "facebook",
      +  "bluesky",
      +  "x"
      +]
  13. Changed1 schema field changed
    • changedInput schema / properties / platforms / items / enum
      Previous value: -[
      -  "instagram",
      -  "tiktok",
      -  "youtube",
      -  "threads",
      -  "facebook"
      -]New value: +[
      +  "instagram",
      +  "tiktok",
      +  "youtube",
      +  "threads",
      +  "facebook",
      +  "bluesky"
      +]
  14. Changed2 schema fields changed
    • addedInput schema / properties / approval_note
      Added value: +{
      +  "description": "Optional note to the owner, shown in the approval email. Only used with requires_approval.",
      +  "type": "string"
      +}
    • addedInput schema / properties / requires_approval
      Added value: +{
      +  "default": false,
      +  "description": "Hold the post until the owner approves it. It is saved as pending_approval and never publishes on its own; the owner gets an email with an Approve link and can also approve or reject in the sprkly calendar. Poll sprkly_get_post_approval_status for the answer. Power plan only: other plans get upgrade_required.",
      +  "type": "boolean"
      +}
  15. Changed1 schema field changed
    • addedInput schema / properties / platform_meta / properties / instagram
      Added value: +{
      +  "description": "Instagram publishing options.",
      +  "properties": {
      +    "surface": {
      +      "description": "Where to publish. 'story' posts to the account's Story instead of the feed: it disappears after 24 hours, takes exactly ONE photo or video, and sends no caption — Instagram Stories have no caption field. Omit for a normal feed post or Reel. The media cannot decide this: a 9:16 video is a Reel or a Story, so ask the user which they want rather than guessing.",
      +      "enum": [
      +        "feed",
      +        "story"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  16. First observed

TDQS

A4.3/5.0
Behavior5/5

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

Annotations are thin (readOnlyHint false, destructiveHint false, idempotentHint false, openWorldHint true), and the description carries the behavioral weight: sprkly downloads link media into its own storage for TikTok/YouTube/Facebook, runs quota, duplicate-content and platform pre-flight checks, reads actual media bytes, and returns a per-platform statement of what will publish plus warnings to relay. It also discloses the needsAccountChoice short-circuit rather than scheduling, which an agent would otherwise read as a silent failure.

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?

Dense but front-loaded: the one-call media path, the hard platform requirements, and the account-choice branch all appear early. A few clauses stack multiple ideas into one sentence (the media-bytes and response-preview sentence), but nothing is filler and no rule is repeated.

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-parameter scheduling tool with nested objects and no output schema, the description covers the gaps that matter: which platforms mandate media or a title, the TikTok privacyLevel requirement, the caption-link caveat, and what the response will contain and that it should be relayed. An agent has enough to plan the call, handle the failure branches, and report back.

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 100%, so the baseline is 3 and the schema already documents all 18 parameters in depth. The description still adds semantics beyond it: media_urls is the low-friction path because sprkly fetches the bytes itself, and TikTok's privacyLevel is handled by sending the user's requested level and letting the tool enumerate valid values if it is rejected. That runtime fallback behavior is not in the schema.

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?

Opens with a specific verb and resource — 'Queue a post for publishing, in ONE call' — and immediately scopes it against the media-upload path ('no upload tool has to run first'), which implicitly distinguishes it from sprkly_add_media_from_url. It does not explicitly differentiate from close siblings like sprkly_draft_post or sprkly_update_scheduled_post, so an agent must infer that boundary.

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

Usage Guidelines4/5

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

Gives real operating guidance: confirm date, time and target accounts with the user first; pass platform_meta.tiktok.privacyLevel with the level the user asked for; only set all_accounts true when the user explicitly wants every account. It also prescribes the recovery loop for needsAccountChoice (put the choice to the user, then re-call). It stops short of naming when a different tool (e.g. draft) is the better fit.

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