> Discover all available Postdom documentation from the machine-readable index: https://postdom.com/llms.txt

Configured tool · write

# `publish_video`

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

write · destructive · open-world

Human and agent roles

## Configured boundary

### Configured workspace

Current-source reference. The hosted server at https://api.postdom.com/mcp runs this source, media[] carousels included; the published @postdom/mcp@0.4.0 package does not have media[], so inspect your connected tools before copying media, surface, title or description. The corrected source adapter forwards ordered media in synthetic contract tests, and a carousel goes out through the same POST /v1/posts the Postdom app publishes slideshows with; TikTok takes several images as a photo post. 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, which the hosted server at https://api.postdom.com/mcp runs, and known adapter limits. For a key, an owner, admin or member creates one in Postdom under Connected apps → For developers. 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.

| Field | Type | Contract |
| --- | --- | --- |
| account_ids Required | string[] | At least one value Exact connected destination identifiers returned by list_accounts. |
| video_url Optional | URL | Exactly one of video_url, media_handle or media Finished video already available at an accepted URL; not an image URL. |
| media_handle Optional | pd_media_… | Exactly one of video_url, media_handle or media · status stored Postdom-owned video or image verified through get_media. |
| media Optional | 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. |
| caption Required | string | At most 4,000 characters Caption passed to each destination adapter. |
| intent Required | string | 1–500 characters The calling agent's reason for this execution. |
| agent_identity Optional | string | 1–120 characters Caller identity when the configured client does not supply one. |
| surface Optional | 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. |
| title Optional | string | 1–100 characters after trimming YouTube-only title override. |
| description Optional | string | At most 5,000 characters YouTube-only description. |
| publish_at Optional | datetime | RFC 3339 UTC ending in Z Exact execution time. Omit it for an unscheduled request. |
| plan_id Optional | UUID | Valid UUID Approved plan proposed as the authorization boundary. |
| idempotency_key Optional | string | Non-empty Caller-supplied replay key. The adapter generates a UUID when omitted. |

**For AI agents:** Send only fields exposed by the current tool schema.

**Known failure:** Do not invent platform settings, account IDs, media fields, or setup steps.

**For AI agents:** Use an RFC 3339 UTC value ending in Z only when the human or approved plan supplied the intended instant.

**Known failure:** Never guess a timezone or claim an exact schedule when publish_at was 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

### Public by default

The video adapter sets PUBLIC_TO_EVERYONE, disables comments, duet and stitch, sends fixed consent flags and leaves the AI-made flag off. Those flags do not establish the human's express consent.

 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 the AI label off and no Instagram visibility field.

 YOUTUBE SHORTS

### Short or long-form video

surface.youtube accepts short or long_form. The video adapter uses public visibility and not made for kids, and leaves the synthetic-media disclosure off. 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 · status` (identity · post state)** — Created post identifier and exact current state.

**`scheduled_for` (datetime | null)** — Resolved schedule. Null does not imply an exact execution time.

**`plan_id` (UUID | null | optional)** — Present on scheduled, publishing, and approval responses. Draft responses omit it.

**`plan_authorization` (object | null | optional)** — Present on scheduled, publishing, and approval responses. Draft responses omit it.

**`version · request_hash` (review metadata)** — Returned on human-review and draft paths.

**`approval_scheme` (string | optional)** — Present on approval responses and identifies the immutable-request approval scheme.

**`message` (string)** — 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 2026  **Current MCP source schema and adapter · not an authenticated publishing test**

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