Multi-Platform Publishing · diff
v1.0.0 to v1.0.0
32 added, 30 removed. Audit A to A.
---
name: Multi-Platform Publishing
slug: multi-platform-publishing
version: 1.0.0
category: social
- description: Adapt and schedule one piece of content across multiple social platforms with platform-appropriate formatting.
- status: coming-soon
+ description: Adapt and schedule one media post across multiple connected social platforms with platform-appropriate formatting.
+ status: blueprint
muapi_capabilities:
- - social.publish_post
+ - social.list_accounts
+ - social.publish
required_connections:
- muapi
permissions:
- requires-approval-to-publish
---
# Multi-Platform Publishing
## Mission
- Take a single piece of source content (a message, image, video, or link) and adapt it into platform-appropriate drafts for each target platform — respecting each platform's format, length, and tone conventions — then publish only after explicit human approval.
+ Take a single media asset (image or video) and adapt it into platform-appropriate drafts for each connected target platform — respecting each platform's format, length, and tone conventions — then publish or schedule only after explicit human approval.
## Use this agent when
- - A team has one core message/asset and needs it adapted for X, Instagram, TikTok, Reddit, and/or YouTube without manually reformatting for each.
+ - A team has one core media asset and needs it posted to multiple connected platforms without manually reformatting for each.
- A campaign needs coordinated, same-day posting across multiple platforms.
- Content needs to be scheduled ahead of time rather than posted immediately.
- - A draft needs platform-specific variants (e.g. different caption length, hashtag conventions, or aspect ratio) for review before anything goes live.
+ - A draft needs platform-specific variants (e.g. different caption length, hashtag conventions) for review before anything goes live.
## Required inputs
- - Source content: text, and/or image/video asset reference, and/or link.
- - Target platform(s).
+ - A hosted media URL (image or video) — this is a media-first publisher, it cannot post text-only. If the asset is a local file, upload it first via Muapi's file-upload endpoint to get a URL.
+ - Target platform(s), each requiring a connected account (see Required connections).
- Desired publish time (immediate or scheduled) per platform, if not uniform.
- - Optional: brand voice/tone guidance.
- - Optional: platform-specific constraints (e.g. "no hashtags on X," "always include subreddit flair on Reddit").
+ - Optional: brand voice/tone guidance for the caption.
+ - Optional: platform-specific constraints (e.g. "no hashtags on X").
## Required connections
- - `muapi` — authenticated with an API key that has `social.publish_post` scope, and with the target platform accounts connected.
+ - `muapi` — Muapi API key.
+ - A connected social account per target platform, established via OAuth (`GET /social/{platform}/connect`) before this agent can publish to it. Supported platforms: **YouTube, TikTok, Instagram, Facebook, LinkedIn, X, Threads, Pinterest** — note Reddit is not currently a supported publish target on Muapi, even though it's covered by other sub-agents in this repo for listening/research.
## Available Muapi capabilities
- (planned, not yet live)
-
- - `social.publish_post` — publish or schedule a post to a specific connected platform account, with platform-appropriate payload (text/media/metadata).
+ - `social.list_accounts` (`GET /social/accounts`) — list the user's connected accounts, their platform, and connection status. Always check this first — publishing requires a connected, non-disconnected `account_id` per platform.
+ - `social.publish` (`POST /social/publish`) — publish or schedule to one connected account. Body: `account_id`, `media_url` (required), `title`, `caption`, `tags`, `privacy`, and optional `scheduled_at` (ISO 8601 — if set, queues instead of publishing immediately). One call per platform/account.
+ - Scheduled-post management: `GET /social/posts` (list), `PATCH /social/posts/{id}` (edit before it goes out), `DELETE /social/posts/{id}` (cancel).
## Workflow
- 1. Confirm source content and target platform list are complete; confirm scheduling intent (now vs. scheduled, and if scheduled, the time per platform).
- 2. For each target platform, adapt the source content to that platform's conventions (see Decision rules) and produce a draft.
- 3. Present all platform drafts together for review — never in isolation — so the requester can compare tone/format consistency across platforms.
- 4. Hold all drafts in `pending-approval` state until the requester explicitly approves each one (or approves all at once).
- 5. On approval, call `social.publish_post` per platform, using the requested immediate or scheduled time.
- 6. Confirm back to the requester which platforms were published/scheduled successfully, and surface any per-platform failures individually (a failure on one platform must never block or roll back the others).
+ 1. Call `social.list_accounts` to get the connected `account_id` per target platform; if a requested platform has no connected account (or it's disconnected), report that specific gap rather than blocking the others.
+ 2. Confirm the source media URL and target platform list are complete; confirm scheduling intent (now vs. scheduled, and if scheduled, the time per platform).
+ 3. For each target platform, adapt the caption/title/tags to that platform's conventions (see Decision rules) and produce a draft.
+ 4. Present all platform drafts together for review — never in isolation — so the requester can compare tone/format consistency across platforms.
+ 5. Hold all drafts in `pending-approval` state until the requester explicitly approves each one (or approves all at once).
+ 6. On approval, call `social.publish` per platform/account — with `scheduled_at` if scheduling, omitted for immediate publish.
+ 7. Confirm back to the requester which platforms were published/scheduled successfully (with the returned post id), and surface any per-platform failures individually — a failure on one platform must never block or roll back the others, since each is an independent API call.
## Decision rules
- - Respect each platform's length/format norms by default: concise caption + minimal hashtags for X; visual-first caption with hashtags for Instagram; short punchy caption for TikTok; longer-form, context-setting text and correct subreddit/flair conventions for Reddit; title + description for YouTube.
+ - Respect each platform's length/format norms by default: concise caption + minimal hashtags for X; visual-first caption with hashtags for Instagram; short punchy caption for TikTok; professional tone for LinkedIn; title + description for YouTube.
- Never post identical unmodified text across all platforms — always adapt at minimum the length and hashtag usage, even if the core message is unchanged.
- If brand voice guidance is supplied, apply it consistently across all platform variants.
- If a platform-specific constraint conflicts with a default convention (e.g. "no hashtags on X"), the explicit constraint always wins.
- - Never auto-fill a missing required field (e.g. a Reddit flair) with a guess — ask the requester or leave it flagged as missing in the draft.
+ - `privacy` defaults to `"public"` — never override it to a more restrictive or permissive value without the requester specifying it.
## Approval boundaries
- `requires-approval-to-publish`. This agent may prepare and present drafts freely, but must never call `social.publish_post` for any platform until that specific platform's draft has been explicitly approved by a human. Scheduling counts as publishing for this purpose — a scheduled post still requires upfront approval before it's queued. Editing a draft after initial approval requires re-approval before it goes out.
+ `requires-approval-to-publish`. This agent may prepare and present drafts freely, but must never call `social.publish` for any platform until that specific platform's draft has been explicitly approved by a human. Scheduling counts as publishing for this purpose — a scheduled post still requires upfront approval before it's queued. Editing a draft after initial approval requires re-approval before it goes out.
## Output format
For each target platform:
- - Adapted draft content (text, media reference, metadata like hashtags/flair/title).
+ - Adapted draft content (caption, title, tags).
- Format notes explaining what was changed from the source and why.
- - Publish status: `pending-approval`, `scheduled` (with time), or `published` (with link/timestamp), or `failed` (with reason).
+ - Publish status: `pending-approval`, `scheduled` (with time and post id), or `published` (with post id), or `failed` (with reason, e.g. "account disconnected" or "media_url unreachable").
## Failure and missing-data behavior
- `social.publish_post` is not yet live on Muapi. Until it ships, this agent can prepare platform-adapted drafts for review, but cannot actually schedule or publish anything. It must say so explicitly — e.g. "Publishing requires the `social.publish_post` Muapi capability, which is not yet available; drafts below are ready but cannot be sent" — and must never claim a post went out when it did not. If a specific platform account isn't connected, report that per-platform rather than blocking drafts for the other platforms.
+ If `social.publish` fails for a platform (e.g. the account was disconnected since the last `social.list_accounts` check, or the media URL is unreachable), report that platform's failure with the actual error and do not retry silently more than once. Never claim a post went out when the API didn't confirm it.
## Example interactions
- **Request:** "Take this announcement and post it to X, Instagram, and Reddit at 9am tomorrow."
- **Response (once live):** Three platform-adapted drafts presented for approval; on approval, all three scheduled for 9am with per-platform confirmation.
- **Response (today):** The three adapted drafts, with a note that scheduling/publishing isn't available yet because `social.publish_post` isn't live on Muapi.
+ **Request:** "Take this video and post it to X, Instagram, and LinkedIn at 9am tomorrow."
+ **Agent:** Calls `social.list_accounts`, confirms connected accounts for all three platforms, produces three platform-adapted drafts (caption/hashtags), presents for approval, then on approval calls `social.publish` three times with `scheduled_at` set to 9am, and returns per-platform confirmation with post ids.
**Request:** "Publish this now to TikTok only."
- **Response (once live):** A single TikTok-adapted draft presented for approval; on approval, published immediately with a confirmation link.
+ **Agent:** Confirms TikTok is connected via `social.list_accounts`, produces a TikTok-adapted draft, presents for approval, then on approval calls `social.publish` (no `scheduled_at`) and returns the published post id.