Examples

Practical agent recipes for Social0 MCP — publish, analytics, inbox, threads, and multi-platform jobs.

Same tools on remote (https://mcp.social0.app/mcp) and local (npx -y @social0/mcp). Tool names below match MCP tools.

Agent rules:

  1. Call list_accounts before the first publish in a session.
  2. After any publish, return tracking_id and poll get_publish_status until terminal (completed, failed, or partial).
  3. Remote hosts: upload_media with public url or base64 data — not sandbox file_path.
  4. MCP scheduled_at is UTC ISO-8601 (CLI accepts natural language; MCP does not).
  5. Quote analytics with sampled vs partial attached — never present a sampled total as a lifetime figure.
  6. Inbox replies are public. Carry publication_id with every comment_id. DMs are X and Bluesky only today.

Schedule to X

Agent flow:
1. list_accounts
2. schedule_content({
     content: "Blog post goes live in the morning — thread in replies.",
     platforms: ["twitter_x"],
     scheduled_at: "2026-08-04T09:00:00.000Z"
   })

Confirm timezone with the user before converting local time to UTC.


Instagram reel (upload + publish)

Remote host (public URL):

1. list_accounts
2. upload_media({ url: "https://cdn.example.com/reel.mp4", filename: "reel.mp4" })
   → media_id
3. publish_now({
     content: "60-second product walkthrough ✨",
     platforms: ["instagram"],
     media: ["<media_id>"]
   })
   → tracking_id
4. get_publish_status({ tracking_id: "<tracking_id>" })  # poll every 2–5s

Local MCP (file on the same machine):

upload_media({ file_path: "/Users/you/reel.mp4" })

Video jobs often stay in processing longer than text — keep polling.


Thread (X / Threads / Bluesky)

MCP has no dedicated thread tool. Options:

A — Legacy --- split (X only): API splits content on a line containing only --- into a reply chain.

publish_now({
  content: "1/3 — We rebuilt the publish pipeline.\n---\n2/3 — Same queue as the dashboard.\n---\n3/3 — Docs: https://social0.app/docs",
  platforms: ["twitter_x"]
})

B — Structured parts (recommended for media per tweet): use REST metadata.twitterThread.parts or the dashboard thread composer. MCP platform_options today covers disclosure flags (madeWithAi, paidPartnership) but not multi-part arrays — for rich threads with per-part media, use the dashboard or REST API.

C — Draft workflow: create_draft → user reviews → publish_post — still one caption unless you use REST metadata.

Threads and Bluesky use the same structured twitterThread.parts shape when posting via API.


LinkedIn post

1. list_accounts
2. publish_now({
     content: "Three things we learned shipping agent-friendly CLI docs:\n\n1. Shell beats MCP when available\n2. Always poll publish status\n3. Platform names ≠ account UUIDs when accounts collide",
     platforms: ["linkedin"]
   })
3. get_publish_status({ tracking_id: "..." })

With image:

upload_media({ url: "https://cdn.example.com/chart.png" })
publish_now({ content: "Q3 snapshot", platforms: ["linkedin"], media: ["<media_id>"] })

Bulk schedule (multiple schedule_content calls)

One tool call per slot — no batch tool.

1. list_accounts
2. schedule_content({
     content: "Monday motivation",
     platforms: ["twitter_x", "linkedin"],
     scheduled_at: "2026-08-04T08:00:00.000Z"
   })
3. schedule_content({
     content: "Mid-week product tip",
     platforms: ["instagram"],
     media: ["<media_id>"],
     scheduled_at: "2026-08-06T14:00:00.000Z"
   })
4. schedule_content({
     content: "Friday recap",
     platforms: ["threads", "bluesky"],
     scheduled_at: "2026-08-08T16:00:00.000Z"
   })

Return each scheduled post id to the user. Edit later with update_draft / cancel with delete_draft (drafts and schedules only — not live network posts).


Multi-platform publish_now + poll

1. list_accounts
2. publish_now({
     content: "Social0 MCP examples are live 🚀",
     platforms: ["twitter_x", "linkedin", "threads"]
   })
   → { post_id, tracking_id }
3. get_publish_status({ tracking_id })  # repeat until terminal

On partial:

  • Summarize which platforms in platform_statuses succeeded vs failed.
  • Read errors for failure reasons.
  • Do not invent new tracking IDs — use the one from step 2.

TikTok in multi-platform jobs: set privacy via dashboard defaults or platform_options.tiktok.privacy_level — bare content may fail. See TikTok settings.


Optional: suggest_best_platforms

Before publishing ambiguous copy:

suggest_best_platforms({
  content: "Long-form essay about B2B SaaS positioning…",
  has_media: false
})

Heuristic only — does not publish.


Analytics for a window

1. list_accounts
2. get_analytics({ range: "28d" })
   → Repeat the Notes: block. If sampled, say totals cover the latest N posts, not the whole profile.

One post:

get_post_analytics({ post_id: "<post_uuid>" })

Live analytics networks today: X, Bluesky, YouTube, TikTok, Pinterest.


Unanswered comments + reply

1. list_inbox_comments({ unanswered_only: true, range: "7d" })
   → copy comment_id and publication_id from the same thread
2. Confirm wording with the user
3. reply_to_comment({
     comment_id: "<comment_id>",
     publication_id: "<publication_id>",
     text: "Thanks for watching!"
   })

Do not invent publication_id. hide is Instagram + Facebook Pages only (not live in Inbox today).

Comments live: X, Bluesky, YouTube. TikTok and Pinterest have no comments inbox.


DMs (X and Bluesky)

1. list_inbox_dms({ range: "7d" })
   → conversation_id + account
2. get_inbox_dm_thread({ conversation_id, account })
3. Confirm wording
4. reply_to_dm({ conversation_id, account, text: "On it." })