brainstorming
brainstorming
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or planning anything new, in software or out of it (a talk, a business, a renovation).
bulkpublish-social-schedulingSchedule, 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 analyt…
Independent GitHub snapshot · Automated classification · Original documentation governs
Cross-platform scheduling and publishing through one API. Unlike per-platform skills, this targets many networks in a single call, with each platform's rules enforced up front.
MCP (recommended) — hosted server, no install:
claude mcp add --transport http bulkpublish https://mcp.bulkpublish.com/mcp
Add it as a custom connector and OAuth 2.1 walks you through consent — no key in the URL.
Or the npm server (stdio):
claude mcp add bulkpublish --env BULKPUBLISH_API_KEY=bp_your_key -- npx -y @bulkpublish/mcp-server
Or plain REST: https://app.bulkpublish.com/api, spec at
https://app.bulkpublish.com/openapi.json, docs at https://app.bulkpublish.com/docs.
Get an API key at app.bulkpublish.com/developer and
send it as Authorization: Bearer <key>. API and MCP access are on every plan, free included.
list_channels — get connected accounts with their channelId and platform. Do this
first; never guess a channel id.get_channel_options) before composing.upload_media takes a public url or a local filePath, and
returns the id you pass in mediaFileIds.create_post with content, channels, and status: "scheduled" plus scheduledAt
(or leave it a draft, then publish_post when the user confirms).content (string, required) — post text
channels (array, required) — [{ channelId: number, platform: string }]
status ("draft" | "scheduled") — default "draft"
scheduledAt (ISO 8601 string) — required when status is "scheduled"
timezone (string) — e.g. "America/New_York"
mediaFileIds (number[]) — ids from upload_media
platformContent (object) — per-platform text override
postTypeOverrides (object) — per-platform post type, e.g. {"instagram":"reel"}
platformSpecific (object) — per-platform extras (titles, link previews)
requestApproval (boolean, false) — hold the post for human review
create_post schedules or drafts. To send something out immediately, create it and then call
publish_post; retry_post re-runs a failed one.
platformSpecific.youtube.title /
platformSpecific.pinterest.title.feed_photo. With a video you must set
postTypeOverrides.instagram to reel or feed_video, or the post fails.platformContent to give the short networks their own
trimmed text rather than truncating everything down to the smallest limit.Posts carry an approvalStatus (none | pending | approved | rejected) separate from
status. The scheduler never publishes a pending or rejected post. Pass
requestApproval: true to hold a post for a human; approve_post / reject_post release it.
API keys whose role lacks post:publish always have it forced on and get 403 APPROVAL_REQUIRED from publish and retry — that is expected, not a bug.
get_analytics takes startDate / endDate (ISO dates) and returns a summary with a
per-platform breakdown; get_post_metrics covers a single post. Outbound linkClicks are
measured by BulkPublish's own short links and are reported separately from clicks — one
visit can appear in both, so never add them together.
get_channel_health (re-auth needed?), get_queue_slot (next optimal time for a timezone),
create_schedule (recurring posts), list_labels, get_quota_usage (plan limits and usage).
list_channels before every publish.