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.
73
92%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Low
Low-risk findings worth noting
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/mcpAdd 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-serverOr 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 reviewcreate_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.davepoon/buildwithclaude
868d035
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.