Skip to main content
Glama

validate_post

Read-onlyIdempotent

Validate and normalize one post without creating it. Non-destructive: no records, media copies, quota use, webhooks or publication. Third-party media may return remote_media_not_materialized (live create copies and validates it). Run this before the final preview and the create_post confirmation. Advisory brand name and competitor checks with brand_compliance=true; never blocks.

Input Schema

NameRequiredDescriptionDefault
captionNoPost caption/text. On Instagram, @username is a caption mention, not a native tag or collaborator invite. Optional on Instagram Stories (first slide only in a series). Ignored when thread_posts is provided.
metadataNo
platformNoPlatform name when using username. Supported: instagram, facebook, tiktok, twitter, linkedin, youtube, pinterest, threads, google_business, telegram, bluesky, discord, slack, mastodon, devto, hashnode, wordpress, lemmy. Aliases x, gmb, and instagram-standalone are also accepted by the API.
settingsNoDeprecated alias of platform_settings (or instagram_settings for Instagram). Prefer those instead.
usernameNoAccount username; requires platform.
media_urlNoMedia URL. Posterly storage URLs are used as-is; third-party URLs are copied into posterly storage first. Short-lived signed URLs must still be live when this tool runs.
post_typeNoOptional post type. Omit for auto-detection from media. Supported semantic values include text, image, video, carousel, reel, story, story_series, document, x_thread, threads_thread, photo, and cover_photo.
account_idNoSocial account ID from list_accounts.
media_urlsNoMedia URLs, handled like media_url.
scheduled_atNoISO 8601 UTC datetime. Omit to publish immediately.
thread_postsNoFor X or Threads: 2+ entries, one per post in the reply chain.
workspace_idNoWorkspace ID from whoami.
idempotency_keyNoOptional retry key. Reuse the same value if this create errors or the response is lost.
brand_complianceNoAdvisory brand name and competitor checks; never blocks. Needs accounts:read.
platform_settingsNoPlatform-specific composer controls, flattened across platforms (unrelated fields ignored). Required: YouTube title; Pinterest board_id (cover_image_url also required for video Pins); Lemmy community. Accepted via passthrough but not listed below: Lemmy community/title, Dev.to canonical_url, Hashnode publication_id, Telegram parse_mode/disable_web_page_preview, Google Business post_type (STANDARD/EVENT/OFFER, alias topic_type), TikTok auto_add_music/photo_cover_index/media_type, Facebook post_type (incl. cover_photo), Mastodon language. Call list_platforms with view=schema and account_id for fields and examples.
instagram_settingsNoInstagram-specific settings: native media tags (user_tags) and co-author invitations (collaborators). Call list_platforms with view=schema and account_id first.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedInput schema / properties / brand_compliance
      Added value: +{
      +  "description": "Advisory brand name and competitor checks; never blocks. Needs accounts:read.",
      +  "type": "boolean"
      +}
  2. Changed1 schema field changed
    • changedInput schema / properties / platform_settings / properties / post_mode / description
      Previous value: -"TikTok delivery: auto (needs privacy_level) or inbox. Omitting both fields means inbox, with tiktok_inbox_implicit."New value: +"TikTok delivery: auto (default, unless the account is set to Finish in TikTok app) or inbox. With no privacy_level, auto uses the saved default or public."
  3. Changed3 schema fields changed
    • addedInput schema / properties / idempotency_key
      Added value: +{
      +  "description": "Optional retry key. Reuse the same value if this create errors or the response is lost.",
      +  "maxLength": 255,
      +  "type": "string"
      +}
    • addedInput schema / properties / platform_settings / properties / post_mode
      Added value: +{
      +  "description": "TikTok delivery: auto (needs privacy_level) or inbox. Omitting both fields means inbox, with tiktok_inbox_implicit.",
      +  "enum": [
      +    "auto",
      +    "inbox"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / platform_settings / properties / privacy_level / description
      Previous value: -"TikTok privacy level."New value: +"TikTok audience for auto: PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR, or SELF_ONLY."
  4. Changed1 schema field changed
    • changedInput schema / properties / caption / description
      Previous value: -"Post caption/text. On Instagram, @username creates a caption mention only; it is not a native media tag or collaborator invitation. Ignored when thread_posts is provided."New value: +"Post caption/text. On Instagram, @username is a caption mention, not a native tag or collaborator invite. Optional on Instagram Stories (first slide only in a series). Ignored when thread_posts is provided."
  5. Changed4 schema fields changed
    • changedInput schema / properties / instagram_settings / description
      Previous value: -"Instagram-specific settings. Distinguish caption @mentions (put @username in caption) from native media tags (user_tags) and co-author invitations (collaborators). Call list_platforms with view=schema and account_id first."New value: +"Instagram-specific settings: native media tags (user_tags) and co-author invitations (collaborators). Call list_platforms with view=schema and account_id first."
    • changedInput schema / properties / media_url / description
      Previous value: -"Media URL. Posterly storage URLs are used as-is; third-party HTTP(S) URLs are copied into posterly storage before the post is saved. Short-lived signed URLs must still be live when this tool runs."New value: +"Media URL. Posterly storage URLs are used as-is; third-party URLs are copied into posterly storage first. Short-lived signed URLs must still be live when this tool runs."
    • changedInput schema / properties / media_urls / description
      Previous value: -"Media URLs. Posterly storage URLs are used as-is; third-party HTTP(S) URLs are copied into posterly storage before the post is saved."New value: +"Media URLs, handled like media_url."
    • changedInput schema / properties / platform_settings / description
      Previous value: -"Platform-specific composer controls, flattened across all platforms (unrelated fields ignored). Required: YouTube title; Pinterest board_id (cover_image_url also required for video Pins); Lemmy community. Accepted via passthrough but not listed below: Lemmy community/title, Dev.to canonical_url, Hashnode publication_id, Telegram parse_mode/disable_web_page_preview, Google Business post_type (STANDARD/EVENT/OFFER, alias topic_type), TikTok auto_add_music/photo_cover_index/media_type, Facebook post_type (incl. cover_photo), Mastodon language. Call list_platforms with view=schema and account_id for the full field list and examples."New value: +"Platform-specific composer controls, flattened across platforms (unrelated fields ignored). Required: YouTube title; Pinterest board_id (cover_image_url also required for video Pins); Lemmy community. Accepted via passthrough but not listed below: Lemmy community/title, Dev.to canonical_url, Hashnode publication_id, Telegram parse_mode/disable_web_page_preview, Google Business post_type (STANDARD/EVENT/OFFER, alias topic_type), TikTok auto_add_music/photo_cover_index/media_type, Facebook post_type (incl. cover_photo), Mastodon language. Call list_platforms with view=schema and account_id for fields and examples."
  6. Changed1 schema field changed
    • addedInput schema / properties / platform_settings / properties / article
      Added value: +{
      +  "description": "X Article (needs an X Premium account): publish the caption as an Article. Pass null to turn Article mode off. The caption is the Markdown body (headings, bold, italic, lists, quotes, code blocks, tables, dividers); reference attached images with ![caption](media:1). Cannot be combined with poll, thread_posts, paid_partnership, video, or GIF.",
      +  "properties": {
      +    "cover": {
      +      "description": "Use the first attached image as the Article cover (default) or none.",
      +      "enum": [
      +        "first_image",
      +        "none"
      +      ],
      +      "type": "string"
      +    },
      +    "title": {
      +      "description": "Article title (required).",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "title"
      +  ],
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  7. First observed

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the description is not needed to establish safety — yet it goes further with a concrete enumeration of what is NOT consumed (records, media copies, quota, webhooks, publication) and a failure mode agents would otherwise be surprised by (remote_media_not_materialized for third-party media). It also clarifies that brand_compliance is advisory and never blocks, which prevents an agent from treating a failure as a hard stop. Minor gap: it does not say what a failed validation returns or whether partial results are reported.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with the what and the non-destructive guarantee before the caveats and the sequencing advice. No filler or restated name/title; every sentence carries an actionable fact.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 16-parameter tool with deep nested objects and no output schema, the description covers intent and side effects well but says nothing about the shape of the validation result (errors list, normalized payload, per-platform diagnostics), which is the primary thing an agent consumes. The platform_settings block's required fields are documented in the schema, so that gap is acceptable, but the return-value gap is not fully offset.

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 94%, so the schema already carries nearly all parameter meaning and 3 is the baseline. The description adds only one genuinely non-duplicative signal — that third-party media can surface remote_media_not_materialized, clarifying media_url/media_urls behavior — and the brand_compliance line largely restates the schema's own wording.

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 ("Validate and normalize one post") plus the critical qualifier "without creating it", which immediately separates it from create_post and update_post in the sibling list. An agent can identify this tool from the name-plus-first-clause alone.

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?

"Run this before the final preview and the create_post confirmation" gives an explicit placement in the workflow and names the sibling it precedes. It stops short of stating when to skip validation (e.g., for trivial retries or already-validated payloads), so it is clear context without full exclusion rules.

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