Skip to content

Commit 13333c2

Browse files
authored
Add bulkpublish-social-scheduling skill (#299)
1 parent bdff9e8 commit 13333c2

1 file changed

Lines changed: 103 additions & 0 deletions

File tree

  • plugins/all-skills/skills/bulkpublish-social-scheduling
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
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

Comments
 (0)