Browse docs

Configured tool · write

publish_video

Submit finished media for immediate or UTC-scheduled execution using the current-source publish_video contract.

writedestructiveopen-world

Human and agent roles

Configured boundary

Configured workspace

Current-source reference, not a verified release or hosted contract. The pinned @postdom/mcp@0.4.0 release is unchanged: inspect your connected tools before copying surface, title or description. The corrected source adapter forwards ordered media in synthetic contract tests; this is not proof of a published npm release, hosted deployment or provider publication. Do not attempt MCP carousels until the connected implementation is verified to include the adapter fix and support the intended destinations. Approval depends on account policy and eligible plan authorization. This call cannot approve itself, expand trust, or establish human consent. It is marked destructive because permitted requests can cause irreversible external publication.

This page documents current source and known adapter limits. For local setup, an owner, admin or member creates a workspace key in Connect → Agents → Advanced: Use a workspace key. A key or discovered schema does not verify publication.

Callable schema

Input fields

Field names match the configured tool schema. Runtime-only constraints are labeled separately from schema validation.

FieldTypeContract
account_idsRequired
string[]
At least one value

Exact connected destination identifiers returned by list_accounts.

video_urlOptional
URL
Exactly one of video_url, media_handle or media

Finished video already available at an accepted URL; not an image URL.

media_handleOptional
pd_media_…
Exactly one of video_url, media_handle or media · status stored

Postdom-owned video or image verified through get_media.

mediaOptional
object[]
Exactly one of video_url, media_handle or media · current source

Ordered items, each with exactly one media_url or media_handle. The corrected source adapter validates and forwards this list without sorting it. Synthetic tests are not release or provider-publication evidence; verify the connected implementation before use.

captionRequired
string
At most 4,000 characters

Caption passed to each destination adapter.

intentRequired
string
1–500 characters

The calling agent's reason for this execution.

agent_identityOptional
string
1–120 characters

Caller identity when the configured client does not supply one.

surfaceOptional
Record<string, string>
Supported platform-to-surface values only

For example instagram: reel or story for video, feed for images/carousels; facebook: reel, feed or story; youtube: short or long_form. Omit for the media-dependent default.

titleOptional
string
1–100 characters after trimming

YouTube-only title override.

descriptionOptional
string
At most 5,000 characters

YouTube-only description.

publish_atOptional
datetime
RFC 3339 UTC ending in Z

Exact execution time. Omit it for an unscheduled request.

plan_idOptional
UUID
Valid UUID

Approved plan proposed as the authorization boundary.

idempotency_keyOptional
string
Non-empty

Caller-supplied replay key. The adapter generates a UUID when omitted.

Synthetic values

Example call

Identifiers and values are examples. They do not represent a connected workspace or accepted media source.

EXAMPLE CALL · CONFIGURED TOOL SCHEMA
publish_video({
  account_ids: ["acct_example_ig", "acct_example_yt"],
  video_url: "https://media.example.invalid/launch.mp4",
  caption: "Three moves that changed our launch",
  intent: "Execute the approved launch schedule",
  publish_at: "2026-09-03T09:00:00Z",
  plan_id: "11111111-1111-4111-8111-111111111111"
})

Configured behavior

Current-source surfaces and adapter defaults

The surface map selects supported destinations; it is not an arbitrary platform-settings object. Omit surface and the media determines the default. Account capabilities and media validation still apply. Fixed consent or disclosure flags do not prove a human preview or express consent: review the actual media, audience and disclosures, and stop if the defaults do not fit.

TIKTOK

Private review

The video adapter sets SELF_ONLY, disables comments, duet and stitch, and sends fixed consent and AI-made flags. Those flags do not establish the human's express consent or the truth of the disclosure.

INSTAGRAM REELS

Reel, Story or image feed

Video supports reel or story; feed is for images and carousels. A single video explicitly targeted to feed is refused. The video default is a Reel with AI disclosure and no Instagram visibility field.

YOUTUBE SHORTS

Short or long-form video

surface.youtube accepts short or long_form. The video adapter uses private visibility, not made for kids and synthetic-media disclosure. Optional title overrides the caption-derived title; description is YouTube-only metadata. These settings still need human review.

LINKEDIN

No settings sent

The adapter sends no LinkedIn settings at all. The Posts API requires a visibility value, so LinkedIn sets one on the account's behalf; Postdom neither chooses nor reads it. There is no AI-disclosure field on this destination, so none is sent.

FACEBOOK REELS

Reel, feed or Story

surface.facebook accepts reel, feed or story, subject to media validation. The video default is a Reel; the current-source surface input can override it. The adapter sends no Facebook AI-disclosure field.

X

No settings sent

The adapter sends no X settings at all. X exposes no visibility field on the publishing path and no AI-disclosure field, so nothing is chosen on the account's behalf and nothing is disclosed.

SNAPCHAT STORIES

Public Profile required

The current destination catalog supports story, not Spotlight. A Public Profile is required; connecting an ordinary personal account is not sufficient.

THREADS

No settings sent

The adapter sends no Threads settings. Meta's posting endpoint exposes no visibility field and no AI-disclosure field, so nothing is chosen on the account's behalf and no disclosure accompanies the post. A Threads profile is public or private and the post inherits that from the account, so the audience control exists one level up rather than not at all.

BLUESKY

No settings sent

The adapter sends no Bluesky settings, and here that means there is nothing to send: an app.bsky.feed.post carries no visibility field, so every post is public. Reply gating lives in separate threadgate and postgate records rather than in the post, and Postdom writes neither. Connecting uses an app password rather than an authorisation redirect.

Observed API record

Return shape

Returns the initial post response. Its fields vary with draft, approval, scheduled, or publishing state.

id · statusidentity · post state
Created post identifier and exact current state.
scheduled_fordatetime | null
Resolved schedule. Null does not imply an exact execution time.
plan_idUUID | null | optional
Present on scheduled, publishing, and approval responses. Draft responses omit it.
plan_authorizationobject | null | optional
Present on scheduled, publishing, and approval responses. Draft responses omit it.
version · request_hashreview metadata
Returned on human-review and draft paths.
approval_schemestring | optional
Present on approval responses and identifies the immutable-request approval scheme.
messagestring
Human handoff detail on draft or approval paths.

Stop conditions

Agent handoff

draft

Hand to a human

A human can publish now or schedule the draft.

requires_approval

Wait for review

No provider request has been made at this state.

scheduled · publishing

Read the post

Use get_publish to follow the post and destination states.

not_applied

Preserve the reason

Return the exact authorization reason without widening the request.

Documentation reviewed · 21 September 2026Current MCP source schema and adapter · not an authenticated publishing test

Examples are synthetic. No authenticated client or provider publication was tested.