|
| 1 | +--- |
| 2 | +name: bulkpublish-social-scheduling |
| 3 | +description: "Schedule, publish and analyze social posts across 15 networks via BulkPublish (MCP or REST) — Facebook, Instagram, X, TikTok, YouTube, Threads, Bluesky, Pinterest, Google Business, LinkedIn, Mastodon, Discord, Telegram, Tumblr, Snapchat. Use when the user wants to post, schedule, or bulk-publish to social media, check connected channels, or read post analytics. Always check platform rules before composing." |
| 4 | +category: social-media |
| 5 | +license: MIT |
| 6 | +--- |
| 7 | + |
| 8 | +# Social Publishing via BulkPublish |
| 9 | + |
| 10 | +Cross-platform scheduling and publishing through one API. Unlike per-platform skills, this |
| 11 | +targets many networks in a single call, with each platform's rules enforced up front. |
| 12 | + |
| 13 | +## Setup |
| 14 | + |
| 15 | +**MCP (recommended)** — hosted server, no install: |
| 16 | + |
| 17 | +```bash |
| 18 | +claude mcp add --transport http bulkpublish https://mcp.bulkpublish.com/mcp |
| 19 | +``` |
| 20 | + |
| 21 | +Add it as a custom connector and OAuth 2.1 walks you through consent — no key in the URL. |
| 22 | + |
| 23 | +**Or the npm server (stdio):** |
| 24 | + |
| 25 | +```bash |
| 26 | +claude mcp add bulkpublish --env BULKPUBLISH_API_KEY=bp_your_key -- npx -y @bulkpublish/mcp-server |
| 27 | +``` |
| 28 | + |
| 29 | +**Or plain REST:** `https://app.bulkpublish.com/api`, spec at |
| 30 | +`https://app.bulkpublish.com/openapi.json`, docs at `https://app.bulkpublish.com/docs`. |
| 31 | + |
| 32 | +Get an API key at [app.bulkpublish.com/developer](https://app.bulkpublish.com/developer) and |
| 33 | +send it as `Authorization: Bearer <key>`. API and MCP access are on every plan, free included. |
| 34 | + |
| 35 | +## Workflow |
| 36 | + |
| 37 | +1. `list_channels` — get connected accounts with their `channelId` and `platform`. Do this |
| 38 | + first; never guess a channel id. |
| 39 | +2. Check the platform rules below (or `get_channel_options`) before composing. |
| 40 | +3. Upload media if needed — `upload_media` takes a public `url` or a local `filePath`, and |
| 41 | + returns the id you pass in `mediaFileIds`. |
| 42 | +4. `create_post` with `content`, `channels`, and `status: "scheduled"` plus `scheduledAt` |
| 43 | + (or leave it a draft, then `publish_post` when the user confirms). |
| 44 | +5. Confirm the exact text, target accounts, and time with the user **before** publishing. |
| 45 | + |
| 46 | +## create_post essentials |
| 47 | + |
| 48 | +``` |
| 49 | +content (string, required) — post text |
| 50 | +channels (array, required) — [{ channelId: number, platform: string }] |
| 51 | +status ("draft" | "scheduled") — default "draft" |
| 52 | +scheduledAt (ISO 8601 string) — required when status is "scheduled" |
| 53 | +timezone (string) — e.g. "America/New_York" |
| 54 | +mediaFileIds (number[]) — ids from upload_media |
| 55 | +platformContent (object) — per-platform text override |
| 56 | +postTypeOverrides (object) — per-platform post type, e.g. {"instagram":"reel"} |
| 57 | +platformSpecific (object) — per-platform extras (titles, link previews) |
| 58 | +requestApproval (boolean, false) — hold the post for human review |
| 59 | +``` |
| 60 | + |
| 61 | +`create_post` schedules or drafts. To send something out immediately, create it and then call |
| 62 | +`publish_post`; `retry_post` re-runs a failed one. |
| 63 | + |
| 64 | +## Platform rules that actually break posts |
| 65 | + |
| 66 | +- **YouTube and TikTok require video.** Never include them on an image-only or text-only post. |
| 67 | +- **YouTube and Pinterest require a title** — set `platformSpecific.youtube.title` / |
| 68 | + `platformSpecific.pinterest.title`. |
| 69 | +- **Instagram defaults to `feed_photo`.** With a video you must set |
| 70 | + `postTypeOverrides.instagram` to `reel` or `feed_video`, or the post fails. |
| 71 | +- **Instagram needs a Business or Creator account** — personal accounts are rejected. |
| 72 | +- **Character limits differ sharply**: X 280, Bluesky 300, Threads / Mastodon / Google Business |
| 73 | + 500, Pinterest 1,500, Discord 2,000, Instagram / TikTok 2,200, LinkedIn 3,000, Telegram 4,096, |
| 74 | + YouTube 5,000, Facebook 63,206. Use `platformContent` to give the short networks their own |
| 75 | + trimmed text rather than truncating everything down to the smallest limit. |
| 76 | +- **Facebook cannot mix images and video** in one post. |
| 77 | + |
| 78 | +## Approvals |
| 79 | + |
| 80 | +Posts carry an `approvalStatus` (`none` | `pending` | `approved` | `rejected`) separate from |
| 81 | +`status`. The scheduler never publishes a `pending` or `rejected` post. Pass |
| 82 | +`requestApproval: true` to hold a post for a human; `approve_post` / `reject_post` release it. |
| 83 | +API keys whose role lacks `post:publish` always have it forced on and get `403 |
| 84 | +APPROVAL_REQUIRED` from publish and retry — that is expected, not a bug. |
| 85 | + |
| 86 | +## Analytics |
| 87 | + |
| 88 | +`get_analytics` takes `startDate` / `endDate` (ISO dates) and returns a summary with a |
| 89 | +per-platform breakdown; `get_post_metrics` covers a single post. Outbound `linkClicks` are |
| 90 | +measured by BulkPublish's own short links and are reported separately from `clicks` — one |
| 91 | +visit can appear in both, so never add them together. |
| 92 | + |
| 93 | +## Other tools |
| 94 | + |
| 95 | +`get_channel_health` (re-auth needed?), `get_queue_slot` (next optimal time for a timezone), |
| 96 | +`create_schedule` (recurring posts), `list_labels`, `get_quota_usage` (plan limits and usage). |
| 97 | + |
| 98 | +## Rules |
| 99 | + |
| 100 | +- Read the docs or the OpenAPI spec rather than inventing endpoints or parameters. |
| 101 | +- Confirm channel ids from `list_channels` before every publish. |
| 102 | +- Show the user the exact text, accounts and time before anything goes out. |
| 103 | +- If a platform cannot do what was asked, say so instead of silently dropping it. |
0 commit comments