Skip to main content
Glama

Add a post to the content calendar

schedule_social_post

Add one social post to a brand's content calendar on a date: platform, format, and whatever copy you have (hook, caption, call to action, hashtags, a direction for the visual). WITHOUT publish_to it is only a plan (a draft the owner sees in Creative Studio) — nothing is published. WITH publish_to (connection ids from list_social_accounts) the post is added AND scheduled to publish publicly on those accounts at that day and time, in one step, exactly as queue_post_for_publishing would. Name the time as scheduled_date + scheduled_time (the owner's wall-clock time; the brand's time zone is applied), or scheduled_at. A day or time already passed is refused. Free. Google Business Profile supports only text or one photo; never attach video or choose reel/carousel/story for a google_business destination. For other supported video destinations, TO POST A VIDEO, pass video_project_id (a finished Video Studio film of this brand, from list_creations kind "video") or video_asset_id (their own video in the brand Library, from list_brand_assets) HERE instead of a second attach step: the post is created with the video on it, and a post with a video and no format is a reel. If the film is still being put together, the post is still added but the result says video.attached: false with video.needs_attaching and what to do next — and with publish_to it is then NOT queued until the video is on it. Never tell the user a video is on the post unless video.attached is true. To give it a picture, make one with create_visual and then attach_visual_to_post. Use get_calendar to see what is already planned. For several posts at once use schedule_social_posts: one approval for all of them.

Input Schema

NameRequiredDescriptionDefault
ctaNoCall to action.
goalNo
hookNoThe opening line.
formatNoPost format. Omit for a single image.
googleNoUsed when connection_ids names a Google Business Profile location; ignored otherwise.
pillarNoContent pillar or theme.
captionNo
site_idNoA site whose content plan this post belongs to, when it is about one site.
youtubeNoRequired when connection_ids names a YouTube account; ignored otherwise.
brand_idYesBrand workspace id from list_brands
hashtagsNo
platformNoWhich network. Omit for Instagram.
timezoneNoAn IANA time zone (e.g. Asia/Kolkata) ONLY when the owner named one. It is saved as the brand's time zone. Omit to use the brand's.
user_goalNoOptional: the user's goal behind this call, in one short sentence of plain words (e.g. "add a page so customers can book tables"). No names, emails or other personal details.
publish_toNoConnection ids from list_social_accounts. Given: the post is scheduled to PUBLISH on these accounts. Omitted: a calendar plan only.
scheduled_atNoAlternative to date + time: the exact moment as an ISO instant with offset (2026-10-12T10:00:00+05:30).
scheduled_dateNoYYYY-MM-DD, today or later in the brand's time zone. Omit for today.
scheduled_timeNoHH:MM (24-hour) on scheduled_date, as the owner said it ("10am" is 10:00). Omit for 09:00.
video_asset_idNoA video in this brand's Library (list_brand_assets) to put on the post as it is. Not with video_project_id.
video_project_idNoA finished Video Studio film of this brand to put on the post (list_creations kind "video"). Not with video_asset_id. The bare project id or the library id ("studio-video:<uuid>" from list_creations / find_creation) both work.
visual_directionNoWhat the picture should show.
fallback_timezoneNoThe owner's device time zone, used only when the brand has none on record.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • addedInput schema / properties / google
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Used when connection_ids names a Google Business Profile location; ignored otherwise.",
      +  "properties": {
      +    "button": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "action_type": {
      +          "enum": [
      +            "BOOK",
      +            "ORDER",
      +            "SHOP",
      +            "LEARN_MORE",
      +            "SIGN_UP",
      +            "CALL"
      +          ],
      +          "type": "string"
      +        },
      +        "url": {
      +          "description": "https link; not used for CALL (the listing phone).",
      +          "format": "uri",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "action_type"
      +      ],
      +      "type": "object"
      +    },
      +    "event": {
      +      "additionalProperties": false,
      +      "description": "Required for EVENT and OFFER: the title and dates.",
      +      "properties": {
      +        "end_date": {
      +          "description": "YYYY-MM-DD",
      +          "type": "string"
      +        },
      +        "end_time": {
      +          "description": "HH:MM",
      +          "type": "string"
      +        },
      +        "start_date": {
      +          "description": "YYYY-MM-DD",
      +          "type": "string"
      +        },
      +        "start_time": {
      +          "description": "HH:MM",
      +          "type": "string"
      +        },
      +        "title": {
      +          "maxLength": 58,
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "title",
      +        "start_date",
      +        "end_date"
      +      ],
      +      "type": "object"
      +    },
      +    "offer": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "coupon_code": {
      +          "maxLength": 58,
      +          "type": "string"
      +        },
      +        "redeem_url": {
      +          "format": "uri",
      +          "type": "string"
      +        },
      +        "terms": {
      +          "maxLength": 5000,
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "topic_type": {
      +      "description": "STANDARD (an update), EVENT, or OFFER.",
      +      "enum": [
      +        "STANDARD",
      +        "EVENT",
      +        "OFFER"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "topic_type"
      +  ],
      +  "type": "object"
      +}
    • changedInput schema / properties / platform / enum
      Previous value: -[
      -  "instagram",
      -  "linkedin",
      -  "facebook",
      -  "x",
      -  "tiktok",
      -  "youtube_shorts"
      -]New value: +[
      +  "instagram",
      +  "linkedin",
      +  "facebook",
      +  "x",
      +  "tiktok",
      +  "youtube_shorts",
      +  "google_business"
      +]
  2. Changed1 schema field changed
    • addedInput schema / properties / user_goal
      Added value: +{
      +  "description": "Optional: the user's goal behind this call, in one short sentence of plain words (e.g. \"add a page so customers can book tables\"). No names, emails or other personal details.",
      +  "type": "string"
      +}
  3. Changed2 schema fields changed
    • addedInput schema / properties / video_asset_id
      Added value: +{
      +  "description": "A video in this brand's Library (list_brand_assets) to put on the post as it is. Not with video_project_id.",
      +  "format": "uuid",
      +  "type": "string"
      +}
    • addedInput schema / properties / video_project_id
      Added value: +{
      +  "description": "A finished Video Studio film of this brand to put on the post (list_creations kind \"video\"). Not with video_asset_id. The bare project id or the library id (\"studio-video:<uuid>\" from list_creations / find_creation) both work.",
      +  "pattern": "^(?:studio-video:)?[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
      +  "type": "string"
      +}
  4. Changed1 schema field changed
    • addedInput schema / properties / youtube
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Required when connection_ids names a YouTube account; ignored otherwise.",
      +  "properties": {
      +    "contains_synthetic_media": {
      +      "description": "Whether the video contains realistic AI-generated or altered content (YouTube's disclosure).",
      +      "type": "boolean"
      +    },
      +    "made_for_kids": {
      +      "description": "Made for kids. Defaults to false; true turns off comments.",
      +      "type": "boolean"
      +    },
      +    "privacy_status": {
      +      "description": "Who can see it: public, unlisted or private.",
      +      "enum": [
      +        "private",
      +        "unlisted",
      +        "public"
      +      ],
      +      "type": "string"
      +    },
      +    "title": {
      +      "description": "The video title (1-100 characters, no < or >).",
      +      "maxLength": 100,
      +      "minLength": 1,
      +      "pattern": "^[^<>]*$",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "title",
      +    "privacy_status",
      +    "contains_synthetic_media"
      +  ],
      +  "type": "object"
      +}
  5. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare write/idempotent/openWorld flags; the description adds real operational detail beyond them: draft-vs-published outcome, past-day/time refusal, the Google Business Profile restriction (text or one photo, never video/reel/carousel/story), and the partial-success case where 'video.attached: false' means the post is created but not queued. It also warns against overclaiming to the user unless 'video.attached' is true.

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?

Well front-loaded — the core add-a-post statement comes first, then the publish branch, then edge cases. However it reads as one dense block of roughly a dozen sentences with no visual separation, which makes the video and Google Business rules easy to skim past, even though each clause carries distinct information.

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 22-parameter mutation with nested Google/YouTube objects, no output schema, and non-idempotent publishing side effects, the description covers every decision an agent must make: draft vs publish, date format choice, per-platform constraints, video attachment path, and partial-failure signaling. Nothing material is left to inference.

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 86%, so the baseline is 3, but the description adds meaning the schema does not: publish_to takes connection ids from list_social_accounts and flips draft-to-publish, scheduled_date/scheduled_time is owner wall-clock time with brand time zone applied, and video_project_id vs video_asset_id are mutually exclusive sources with different downstream consequences (including the reel default when format is omitted).

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 and resource: 'Add one social post to a brand's content calendar on a date', and enumerates the payload (platform, format, copy, visual direction). It explicitly distinguishes itself from schedule_social_posts (batch) and queue_post_for_publishing (the publish path it mirrors), so an agent can route correctly without opening a 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?

States the key branch explicitly: 'WITHOUT publish_to it is only a plan... WITH publish_to the post is added AND scheduled'. It names alternatives and when to pick them — 'Use get_calendar to see what is already planned', 'For several posts at once use schedule_social_posts', and 'To give it a picture, make one with create_visual and then attach_visual_to_post' — plus a constraint that past dates are refused.

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