安装与下载
1 ClawHub CLI
从源直接安装技能的最快方式。
npx clawhub@latest install bulkpublish-using-bulkpublish
2 手动安装
将技能文件夹复制到以下位置之一
~/.openclaw/skills/
{'/skills/'}
优先级:工作区 › 全局 › 内置
3 提示词安装
将此提示词复制到 Openclaw 即可自动安装。
请帮我使用 Clawhub 安装 skill-bulkpublish-using-bulkpublish。如果尚未安装 Clawhub,请先安装(npm i -g clawhub)。
更倾向于下载?
获取包含原生技能文件的ZIP压缩包。
基本信息
bulkpublish-using-bulkpublish
安装指南
- ClawHub CLI
从源直接安装技能的最快方式。
npx clawhub@latest install bulkpublish-using-bulkpublish - 手动安装
将技能文件夹复制到以下位置之一
全局模式
~/.openclaw/skills/
工作区
/skills/
优先级:工作区 > 本地 > 内置 - 提示词安装
将此提示词复制到 OpenClaw 即可自动安装。
请帮我使用 Clawhub 安装 bulkpublish-using-bulkpublish。如果尚未安装 Clawhub,请先安装(npm i -g clawhub)。
更倾向于下载?
获取包含原生技能文件的ZIP压缩包。
下载技能 (.zip)
什么是
BulkPublish 技能将 AI 代理连接到 BulkPublish,使其能够在 15 个社交网络中创建草稿、安排内容、管理发布工作流以及审查帖子和渠道分析。它支持针对特定网络的文案、媒体附件、帖子格式、队列槽位、重试和审批工作流,帮助团队在一个地方管理社交内容。
专为 Openclaw Skills 工作流设计,它强调安全、准确的执行:代理应在安排前显示草稿,使用服务返回的渠道 ID,尊重每个网络的格式和字符限制,并且在未经用户明确指示的情况下绝不发布、回复或删除。其结果是对话式规划与真实社交账户之间的实用桥梁。
应用场景
为多个社交网络起草和调整活动,同时遵守每个平台的字符限制和帖子格式。
查找下一个可用的队列槽位,准备草稿,并在用户审查并批准后进行安排。
platformContent
将文章或公告转换为针对特定渠道的帖子变体。
从公共 URL 或本地文件附加图像或视频,并发布支持的媒体格式。
调查失败或部分发布的帖子,检查目标错误,并在适当情况下仅重试失败的目标。
查看帖子指标和日期范围分析,以比较表现并识别表现优异的帖子。
检查已连接的渠道、账户健康状况、队列状态和与计划相关的发布限制。
在这些工具可用时使用收件箱对话或评论,同时在发送前确认准确的收件人和消息。
工作原理
使用 Streamable HTTP 和 OAuth 连接到托管的 BulkPublish MCP 服务器(位于 mcp.bulkpublish.com/mcp),或使用 API 密钥配置本地 MCP 服务器。
使用 list_channels 发现已连接的社交账户;使用返回的渠道 ID 和平台名称,而不是猜测。
收集内容、时间、媒体和目标要求。检查平台限制并选择合适的帖子格式,例如主题帖(thread)、短视频(reel)、视频或轮播图。
默认将内容创建为草稿。使用 platformContent 编写特定渠道的文案,并使用媒体工具返回的 ID 附加媒体。
如果请求安排,在有用时检索队列槽位,并使用 status: scheduled 设置有效的 ISO 8601 scheduledAt 值。在安排之前,展示变体、目标和时间供用户审查。
使用 get_post 或 list_posts 跟踪帖子。将 processing、partial 和 failed 视为不同的状态;在适当情况下仅重试失败的目标。
发布后,检索每个帖子的指标或日期范围分析。报告创建的内容、发布位置及其当前状态。
配置指南
在兼容 MCP 的代理主机中使用 Streamable HTTP 端点 https://mcp.bulkpublish.com/mcp 添加托管的 MCP server,并完成 OAuth 登录。此托管连接不需要 API 密钥。
对于本地设置,请根据 MCP 主机的说明安装并启动 @bulkpublish/mcp-server 包。在 BulkPublish 的“设置”下的“开发者”中获取 API 密钥。
通过 BULKPUBLISH_API_KEY 环境变量将密钥提供给本地服务器。保持密钥私密,切勿将其放入提示词、源码控制和日志中。
重启或刷新 MCP 连接,然后调用 list_channels 以验证访问权限并检索有效的渠道 ID。
检查您的连接公开了哪些工具。托管服务器提供 20 个工具,当收件箱和评论工具可用时提供 27 个。本地包公开了 79 个工具,包括额外的调度、组织和账户管理功能。
export BULKPUBLISH_API_KEY="your-api-key"
根据您的环境和访问要求使用托管端点或本地服务器。工具可用性可能因服务器部署和计划而异;收件箱访问需要 Pro 或 Business 计划,而免费版(Free)不支持评论回复。
BulkPublish Social Publishing 数据架构与分类体系
该技能适用于 BulkPublish 记录及其工具返回的 ID。它不定义本地内容数据库,也不指定生成的文件。
数据对象 重要字段和约定
帖子 (Post) content、作为 { channelId, platform } 条目的 channels、status、scheduledAt、timezone、mediaFileIds 以及可选的 labels
渠道特定内容 platformContent 保存每个平台的文本覆盖;platformSpecific 保存每个平台的选项
帖子格式 postFormat 支持 post、video、reel、story、carousel 和 thread;thread 需要 threadParts 且必须包含至少两部分
帖子类型覆盖 postTypeOverrides 选择平台特定类型,例如 Instagram 的 reel 或 feed_video
审批 approvalStatus 与帖子状态分开,可以是 none、pending、approved 或 rejected;requestApproval 和 publishWhenApproved 控制审批行为
帖子状态 draft、scheduled、publishing、published、partial、failed 或 processing
媒体 使用公共 url 或绝对 filePath 上传,切勿同时使用;通过 mediaFileIds 附加返回的媒体 ID。发布后默认保留媒体。
分析过滤器 必需的 ISO 日期范围字段 from 和 to;可选过滤器包括渠道 ID、平台、标签 ID、帖子格式、媒体类型和比较
标签 创建和更新请求使用 labels;list_posts 过滤器使用 labelId。分析接受 labelIds。
网络限制和格式是请求契约的一部分:超限内容将被拒绝而不是自动裁剪。例如,X 允许 280 个字符,Instagram 2,200,LinkedIn 3,000,YouTube 5,000。X、Threads、Bluesky 和 Mastodon 支持主题帖(Threads)。YouTube 和 TikTok 需要视频,Google Business 使用平台键 gmb。分析比较限于 15 天或更短的时间窗口。
高级特性
每个网络的内容:
platformContent
自定义文案,而不是向每个目标发送相同的文本。
支持审批的调度:
保留已排程的帖子等待队友审批;
publishWhenApproved
可以在批准后立即发布,甚至在预定时间之后。
队列管理:
使用带有时区以及
next
end
位置的
get_queue_slot
。该工具不接受渠道或日期。
帖子恢复:
检查目标结果并使用
retry_post
仅重试部分帖子中失败的目标。
丰富格式和媒体:
支持平台特定的帖子类型、主题帖、轮播图、快拍(story)、视频和媒体上传,具体取决于网络要求。
分析和比较:
按日期范围、渠道、平台、标签、格式或媒体类型过滤结果;比较 15 天或更短的等长窗口。
收件箱和审核工具:
在启用的位置,列出对话、分配或归档对话、阅读评论以及审核评论。发送回复或删除消息和评论需要明确的用户确认。
交互式 MCP 面板:
支持 MCP Apps 的主机可以呈现
compose_post
、
view_posts
、
view_channels
、
view_media
view_analytics
。
扩展的本地工具集:
本地包增加了标签、话题组、模板、日历备注、审阅和客户连接链接、渠道集、重复调度、RSS 自动发布和配额工具等功能。
基于计划的操作:
渠道、帖子、媒体、API、标签、团队和 RSS 限制在 Free、Pro 和 Business 计划之间有所不同;每日限制在 UTC 午夜重置。
name: using-bulkpublish description: Schedule, publish and analyse social media posts across 15 networks through BulkPublish. Use whenever the user wants to draft, queue, cross-post, retry or measure social content, or asks about their channels, queue or posting quota.
Working with BulkPublish
BulkPublish schedules and publishes posts to 15 social networks from one place, and reads the numbers back. This skill covers the tools available over MCP, the shape of a post, what each network accepts, and the mistakes that produce a rejected request.
Connect the hosted server at mcp.bulkpublish.com/mcp over Streamable HTTP. Sign-in is OAuth, so there is no key to paste. To run the server locally instead, start @bulkpublish/mcp-server over stdio with an API key from Settings then Developer in the BULKPUBLISH_API_KEY environment variable.
How to behave
These are not style preferences. Getting them wrong costs the user real posts on real accounts.
Show a draft before you schedule it, and never publish without being asked. create_post with status: "draft" is the safe default and is what the tool does when status is omitted. publish_post sends immediately, to a live audience, and cannot be undone from here.
Never invent a channel id. Call list_channels and use what it returns. A guessed id either fails or posts to the wrong account.
Ask before deleting. delete_post on a published post does not retract what already went out.
Adapt per network rather than pasting one text everywhere. Use platformContent for per-channel copy. A 3,000-character LinkedIn post truncated into a tweet reads like a mistake, because it is one.
Check the character limit before writing, not after. The limits table below is the contract; an over-long post is rejected, not trimmed.
Confirm every reply, message and comment deletion one by one. They go to a real person immediately and cannot be unsent.
Say what you did. After creating posts, list what went where and when, so the user can correct you before anything publishes.
Tools
The hosted server exposes 20 tools, or 27 where it serves the Inbox and comment tools. The local package exposes 79, adding labels, hashtag groups, templates, calendar notes, review and client-connect links, channel sets, schedules, RSS autopost and quota.
Posts
create_post create a draft or a scheduled post
update_post change content, timing, channels or media
get_post one post, with its per-channel results
list_posts filter by status, channel, label, date, approval, assignee
publish_post send now (irreversible)
retry_post retry failed destinations
delete_post remove a post
get_post_metrics per-post numbers once published
get_queue_slot the next free time in the queue
Channels
list_channels connected accounts, with ids, platform and health
Media
upload_media from a public URL or an absolute local path
create_media_upload start a direct upload
finalize_media_upload finish one
list_media the library
Analytics
get_analytics totals and per-platform breakdown for a date range
Inbox and comments (see the manage-inbox skill before sending anything)
list_conversations DMs, reviews and comment threads
get_conversation messages in one conversation
reply_to_conversation send a DM or review reply now (cannot be unsent)
update_conversation mark read, archive, snooze, assign
list_post_comments comments on a published post
reply_to_comment public reply under a comment (cannot be unsent)
moderate_comment like, hide or delete a comment
The Inbox is part of the Pro and Business plans; comment replies are on every plan except Free, and reading a post's comments works on every plan. A channel connected before message or comment access existed may need reconnecting, and some networks do not allow DMs or replies yet. Always show the exact text and recipient and get a yes before any reply or deletion.
Interactive panels (render in hosts that support MCP Apps)
compose_post view_posts view_channels view_media view_analytics
Creating a post
content post text; optional for media-only posts
channels [{ channelId, platform }] from list_channels
status "draft" (default) or "scheduled"
scheduledAt ISO 8601; required when status is "scheduled"
timezone IANA zone, e.g. "America/New_York"; defaults to UTC
mediaFileIds [ids] from upload_media
labels [label ids]
platformContent per-platform text overrides
platformSpecific per-platform options
postTypeOverrides per-platform post type, e.g. reel instead of feed_photo
postFormat "post" (default), "video", "reel", "story", "carousel", "thread"
threadParts [{ content, mediaFileIds }]; required when postFormat is "thread", minimum 2
requestApproval true holds a scheduled post for a teammate to approve
publishWhenApproved true publishes it the moment it is approved, even past its time
(set it for "post now, once approved", not for a chosen time)
Notes that catch people out:
The label field on create and update is labels. The filter on list_posts is labelId. They are different names on purpose.
Every thread part is length-checked, not only the first. An over-long part is rejected naming the part number, the platform and its limit. URLs count as 23 characters on X and Mastodon and their real length elsewhere.
YouTube and TikTok require video. Do not include them in an image-only post.
Instagram defaults to feed_photo. For video, set postTypeOverrides to reel or feed_video, or the post is rejected.
Scheduling
get_queue_slot reads only timezone, position and excludePostId. It does not take a channel or a date. position is "next" for the first free slot or "end" for the bottom of the queue.
The normal flow is: get a slot, create the post as a draft with that time, show it to the user, then update it to scheduled once they agree.
Post status
draft not going anywhere yet
scheduled waiting for its time
publishing going out now
published all destinations succeeded
partial some destinations succeeded, some failed
failed no destination succeeded
processing the network is still handling it (video encoding, for example)
partial and processing are real states and are easy to forget. A post sitting in processing is not stuck; a partial post needs retry_post, which retries only the destinations that failed.
Approval is separate from status. approvalStatus is none, pending, approved or rejected. A scheduled post whose approval is pending or rejected will not publish. Approved more than 15 minutes after its time, a post goes back to draft for a new time unless it has publishWhenApproved or the approver passes whenLate: "publish" to approve_post ("hold" forces draft).
Networks
Network Characters Threads Post types
X 280 yes tweet
Instagram 2,200 no feed_photo, feed_video, reel, story, carousel
Facebook 63,206 no post, reel, story
LinkedIn 3,000 no post, multi_image, pdf_carousel, article
Threads 500 yes text, image, video, carousel
Bluesky 300 yes post
Mastodon 500 yes post
TikTok 2,200 no video, photo_slideshow
YouTube 5,000 no video, short
Pinterest 500 no pin, video_pin, carousel
Google Business 1,500 no standard, event, offer
Discord 2,000 no post
Telegram 4,096 no post
Tumblr 32,768 no post
Snapchat 160 no story, saved_story, spotlight
The platform key for Google Business is gmb, not google_business.
Media
upload_media takes either a public url or an absolute filePath, not both. Attach the returned id through mediaFileIds.
Uploaded media is kept by default. deleteMediaAfterPublish defaults to false, so files stay in the library after their post goes out.
Analytics
get_analytics takes a required from and to in ISO date form, plus optional channelIds, platforms, labelIds, postFormat, mediaType and compare. Set compare: true to get the previous equal-length window back alongside the current one. It is only available for windows of 15 days or fewer, so it answers "is this week better than last week", not month over month.
Link clicks are reported separately from platform clicks. Do not add the two together: one visit can appear in both.
Plan limits
-1 means unlimited, 0 means not available on that plan.
Free Pro Business
Channels 3 30 75
Accounts per network 1 2 5
Posts per day 3 30 unlimited
Posts per month 30 900 unlimited
Scheduled posts pending 10 unlimited unlimited
Media storage 100 MB 2 GB 10 GB
API requests per day 30 5,000 50,000
API keys 1 5 10
Repeating schedules 0 10 unlimited
Labels 10 50 unlimited
Team members 1 3 10
RSS feeds 1 10 50
RSS auto-publish no yes yes
Daily limits reset at midnight UTC. Storage is cumulative, so deleting old media frees it.
Mistakes that produce an error
Using cronExpression or content on a repeating schedule. The fields are frequency, timeOfDay, dayOfWeek, dayOfMonth and contentTemplate. frequency is daily, weekly, biweekly or monthly.
Passing labelIds in a create or update body. It is labels there.
Passing a channel or a date to get_queue_slot.
Writing google_business instead of gmb.
Treating partial as success, or as total failure. It is neither.
Scheduling without scheduledAt, or sending scheduledAt without setting status to scheduled.
Assuming a post with approvalStatus: "pending" will go out. It will not.
Recipes
Post one thing, safely
list_channels
get_queue_slot with the user's timezone
create_post as a draft, with platformContent per network
Show the user every variant and the time
update_post to scheduled once they agree
Turn an article into a set of posts
Read the article
list_channels
Write one variant per network, respecting each limit in the table above
One create_post with all channels and platformContent
Show all variants before scheduling anything
Fix a bad day
list_posts with status: "failed" and a recent from date
get_post on each to see which destinations failed and why
retry_post only where the cause looks temporary
Tell the user which ones need them to act, such as reconnecting an account
Report on the month
get_analytics for the range (compare works only for 15 days or fewer)
list_posts with status: "published" over the same range
get_post_metrics on the strongest few
Answer with their numbers, naming specific posts
BulkPublish
BulkPublish 平台参考