关于 iHatePosting
iHatePosting 让 Agent 通过 ihateposting.com 已连接的账号管理社交媒体帖子,支持在 14 个网络上起草、校验、排期、发布、处理媒体和查看分析。帖子默认保存为草稿;Agent 使用 iHatePosting 账号登录,无需提供 API 密钥。
主要功能
- 01起草、校验、排期和发布帖子
- 02覆盖 14 个社交网络
- 03按网络设置文本和选项
- 04上传或复用媒体
- 05管理现有帖子及失败项
- 06查看频道分析
适用场景
- 01为多个网络准备并检查帖子
- 02在社交账号间排期发布活动内容
- 03重试失败发布或修改草稿
- 04按频道查看帖子表现
MCP 相关
托管的 iHatePosting MCP 服务为已连接的社交账号提供帖子管理、媒体和分析工具。支持的 Agent 配置通过 iHatePosting 账号进行身份验证;README 也提到部分手动配置使用 API 密钥。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://ihateposting.com/mcp/oauthclaude mcp add --transport http com-ihateposting https://ihateposting.com/mcp/oauth{"mcpServers":{"com-ihateposting":{"type":"http","url":"https://ihateposting.com/mcp/oauth"}}}在 Cursor 中打开{"servers":{"com-ihateposting":{"type":"http","url":"https://ihateposting.com/mcp/oauth"}}}在 VS Code 中打开{"mcpServers":{"com-ihateposting":{"type":"http","url":"https://ihateposting.com/mcp/oauth"}}}{"mcpServers":{"com-ihateposting":{"serverUrl":"https://ihateposting.com/mcp/oauth"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
https://ihateposting.com/mcp/oauthhttps://ihateposting.com/api/mcp需要授权工具
详细介绍
面向 AI Agent 的 iHatePosting
让 Claude、Claude Code、Cursor、Gemini CLI、Grok Build、Kimi Code 或 Qwen Code 在你通过 ihateposting.com 连接的账号上,为 14 个社交网络撰写、检查、安排并发布帖子。此 软件包为每个 Agent 提供托管的 iHatePosting MCP 服务(16 个工具),以及一项教它安全发布内容的技能。这里的每个 Agent 都使用你的 iHatePosting 账号登录;无需 API 密钥。
VS Code 中的 GitHub Copilot 使用相同的托管服务: 在 VS Code 中安装, 然后在浏览器中使用你的 iHatePosting 账号登录。无需粘贴 API 密钥。相关步骤见安装。
各 Agent 的设置页面: Claude · Claude Code · Claude Cowork · ChatGPT · Codex · Cursor · Gemini CLI · Grok Build · VS Code 和 GitHub Copilot · OpenClaw · Hermes Agent · DeepSeek Harness · Perplexity Computer · Muse · NanoClaw · Paperclip · Antigravity CLI · Amp · Cline · Kilo Code · Zed · Warp · Devin Desktop · OpenHands CLI · Freebuff CLI · omp · 全部
其中一些页面需要手动添加服务,并使用 API 密钥;对于 Claude、 Claude Code、Cursor、Gemini CLI、Grok Build、Kimi Code 和 Qwen Code,本仓库中的 插件会代为登录(安装)。
未经你的确认,内容绝不会发布。 新帖子会保存为草稿,除非你要求立即发布或安排在指定时间发布。
Agent 可以做什么
- 起草、安排或发布一条帖子,同时发布到多个社交网络;可以发布到你在某个网络上的所有账号,也可以发布到你选择的一个账号。像“上午 9:00”这样的时间,会按 iHatePosting 设置(Settings → Scheduling)中设定的时区解读,而不是按你电脑的时区。
- 在帖子尚未创建前检查它。
validate_post会运行发布器发布前执行的检查,但不会创建任何内容。它还会告知你某个网络没有已连接的账号,或有账号需要重新连接。 - 了解每个网络的规则:字符数限制、媒体规则,以及网络要求的选项,例如 Pinterest 看板。
- 针对不同网络撰写内容:为某个网络单独撰写不同文本,并设置该网络专属的选项。这包括 X、Bluesky、Threads 和 Mastodon 上的串帖,Instagram、LinkedIn 和 Threads 上的首条评论,Instagram Reels、快拍和轮播帖子,Facebook Reels 和快拍,TikTok 图片帖子和隐私设置,以及 YouTube 视频的标题、隐私设置和播放列表。
- 附加媒体:上传带替代文本的图片或短视频,或重复使用媒体库中的现有内容。
- 管理现有内容:查看各网络上的发布情况,重写草稿、已安排或失败的帖子,将帖子改到其他时间,只重新发送失败的部分,或删除帖子。
- 查看报告:按渠道查看数据、关注者数量、发布时间和热门帖子,范围从过去 7 天到所有已记录数据。
每个套餐都包含 MCP 服务、REST API 和 CLI 使用的 API 密钥。所有套餐也都提供 Webhook。
工具
托管服务提供以下 16 个工具,另有一个供上传框自行使用的工具。最后一列说明工具对你的帖子和账号会产生什么影响。
| 工具 | 功能 | 影响 |
|---|---|---|
whoami | 显示此连接所代表的 iHatePosting 登录身份(电子邮件和账号名称),以及登录方式是账号登录还是使用密钥;不显示社交媒体账号名 | 读取 |
list_accounts | 列出已连接的社交账号及其平台、账号名、状态和 ID | 读取 |
get_platform_rules | 列出各网络的字符数限制、媒体规则、视频格式和时长,以及所有可用选项及其允许值 | 读取 |
validate_post | 根据你指定的每个网络检查帖子,不会创建任何内容 | 读取 |
create_post | 创建帖子:默认创建草稿,也可按要求选择 now 或 schedule | 创建;使用 now 或 schedule 时发布 |
list_posts | 列出帖子及其在各网络上的状态和在线 URL——可按 status 和 from/to 计划日期范围筛选,使用 cursor 翻页,并读取 total 获取实际数量 | 读取 |
get_post | 查看一篇帖子的完整信息:正文、各网络的副本和选项、媒体,以及每次发送的结果或错误 | 读取 |
update_post | 用你提供的内容替换草稿、已安排或发送失败的帖子 | 修改;使用 now 或 schedule 时发布 |
reschedule_post | 将已安排的帖子改到新的日期和时间;草稿无法使用此工具 | 在新时间发布 |
retry_post | 仅在一个或所有网络上重新发送失败的内容 | 发布 |
delete_post | 删除 iHatePosting 中的帖子记录;已发布的帖子需要使用 force | 删除;不会撤回已发布的帖子 |
list_media | 按时间倒序列出你的媒体库及帖子所附媒体的 ID | 读取 |
upload_media | 向媒体库添加图片或视频并返回其 ID——通过 url 上传(首选;最大 100 MB,图片最大 25 MB),或使用 base64 上传(最大 8 MB) | 创建媒体库文件 |
open_upload_widget | 在对话中显示文件选择器,让用户从自己的设备上传文件 | 创建媒体库文件 |
get_upload_ticket | 内部工具——上传框自行调用此工具以获取一次性上传凭证。已注册为 visibility: ["app"],因此宿主会对模型隐藏它,Agent 不会调用此工具 | 发放短期有效凭证 |
list_pinterest_boards | 列出你可以发布图钉的 Pinterest 看板及其所需的看板 ID | 读取 |
get_analytics | 查看你选择的时间范围内,各个已连接渠道上的帖子表现 | 读取 |
网络
全部 14 个网络都使用相同的工具。在 platforms 中指定一个网络
(bluesky、x、linkedin、facebook、threads、mastodon、telegram、
discord、tumblr、slack、instagram、pinterest、tiktok、youtube),
或传入 list_accounts 返回的账号 ID。
| 网络 | 文本上限 | 媒体 | 必须设置 | 还支持 |
|---|---|---|---|---|
| Bluesky | 300 | 最多 4 张图片;视频 | 多帖串、替代文本 | |
| X | 280,按权重计算(链接计 23) | 最多 4 张图片;视频 | 多帖串、回复设置 | |
| 3,000 | 最多 20 张图片;视频 | 公司主页和个人资料、首条评论 | ||
| 63,000 | 最多 10 张图片;视频 | 公共主页、Reels、Stories | ||
| 2,200 | 必须:最多 10 张图片或视频 | Reels、Stories、轮播、首条评论、协作者、标记的账号 | ||
| Threads | 500 | 最多 20 张图片或视频 | 多帖串、轮播、首条评论 | |
| 800 | 必须:一张图片或一个视频 | 一个画板 | Pin 标题和目标链接 | |
| TikTok | 2,200 | 必须:一个视频,或照片(此处每篇最多 20 张) | 隐私设置、发送到 TikTok 收件箱、AI 生成标签、评论、合拍和拼接设置 | |
| YouTube | 5,000(说明) | 必须:一个视频 | 标题,以及是否面向儿童 | 隐私设置、播放列表、标签、类别、自定义缩略图 |
| Mastodon | 500 | 最多 4 张图片;视频 | 多帖串、可见性、替代文本 | |
| Telegram | 4,096(作为媒体说明时为 1,024) | 最多 10 张图片;视频 | ||
| Discord | 2,000 | 最多 10 张图片;视频 | ||
| Tumblr | 4,096 | 每篇最多 20 张图片;视频 | 标题、标签 | |
| Slack | 3,000 | 最多 5 张图片;视频 |
如果不填写这些内容,create_post 会将文本的首行用作 YouTube 标题和 Pinterest
Pin 标题,将文本中的第一个 URL 用作 Pinterest 链接,并将文本中的话题标签用作
YouTube 和 Tumblr 标签。validate_post 不会自动填写,因此会将缺少 YouTube 标题报告为问题。
各网络支持的内容及其主要选项见 docs/platforms.md。帖子可能需要的选项键及其取值和默认值,见技能按需加载的参考文档 (skills/ihateposting/references/platform-options.md)。 无论网络允许多少媒体,每篇帖子最多可附加 20 个媒体项。
示例提示词
- “本周安排发布什么内容?有没有发布失败的?”
- “将这则公告分别改写成适用于 LinkedIn、Bluesky 和 X 的版本。给 X 写一个更短的版本,并在保存前检查这三个版本。”
- “把这些笔记整理成适用于 X 和 Threads 的帖子串,并保存为草稿。”
- “上传这张照片并添加替代文本,再用它起草一篇 Instagram 帖子。把话题标签放在首条评论中。”
- “我的哪个 Pinterest 画板适合这份食谱?起草一个 Pin 并发布到该画板。”
- “昨天的 LinkedIn 帖子为什么发布失败了?”
- “过去 30 天我的帖子表现如何?哪个网络表现最好?”
examples/ 中提供了可直接使用的 create_post 载荷,适用于帖子串、
Reels、轮播、YouTube、Pinterest、TikTok 等。所有内容都是草稿。
安装
下面列出的每个 Agent 都会在浏览器中引导你登录 iHatePosting 账号。 它们都不需要 API 密钥。
| Agent | 安装方式 | 连接方式 |
|---|---|---|
| Claude(claude.ai、桌面应用、Cowork) | 在付费 Claude 计划中选择 Customize → Plugins,并将此仓库添加为市场 | 在浏览器中登录 |
| Claude Code | 从此仓库的市场运行 /plugin install | 在浏览器中登录 |
| Cursor | 上架后从 Cursor Marketplace 安装、本地副本,或使用 ~/.cursor/mcp.json | 在浏览器中登录 |
| VS Code with GitHub Copilot | 使用 Install in VS Code 链接,或配置 .vscode/mcp.json | 在浏览器中登录 |
| Gemini CLI | 运行 gemini extensions install | 在浏览器中登录 |
| Grok Build | 运行 grok plugin install ... --trust | 在浏览器中登录 |
| Kimi Code | 在 Kimi Code 中运行 /plugins install | 在浏览器中登录 |
| Qwen Code | 运行 qwen extensions install | 在浏览器中登录 |
| 任何可读取技能的 Agent | 运行 npx skills add(仅安装技能) | 按照该 Agent 页面上的说明连接服务 |
| ChatGPT 等 | 使用各自的 MCP 设置 | 请参阅设置指南 |
Claude(claude.ai、桌面应用、Cowork)
在 Customize → Plugins 中,选择 Add → Add marketplace,输入
https://github.com/iHatePostingOrg/agent-skill,然后安装 iHatePosting。
接着打开插件的 Connectors 标签页并连接 iHatePosting:登录你的
iHatePosting 账户,然后点击 Allow。无需粘贴密钥。
已经从 Claude 的目录添加了 iHatePosting 连接器?该插件使用相同的 地址,因此你只会获得一组工具,而不是两组。
插件需要付费 Claude 计划(Pro、Max、Team 或 Enterprise)。使用 Free 计划时,请改为从 Claude 的连接器目录添加 iHatePosting:登录方式相同, 提供的工具也相同,只是不包含此插件的技能。
Claude Code
/plugin marketplace add iHatePostingOrg/agent-skill
/plugin install ihateposting@ihateposting
然后运行 /mcp,选择 iHatePosting 服务并选择 Authenticate。此时会打开
浏览器窗口:登录你的 iHatePosting 账户,然后点击 Allow。无需粘贴密钥。
- 已经手动添加 iHatePosting? 使用
claude mcp remove ihateposting删除该条目,否则每个工具都会出现两次。 - 从 0.3.x 版本升级? 早期版本要求提供 API 密钥。更新后,按上述说明
在
/mcp中完成一次身份验证;该插件不再发送密钥。
Cursor
插件上架到 Cursor Marketplace 后,在 Cursor 侧边栏中打开 Customize,
找到 iHatePosting 并选择 Install,即可为单个项目或所有项目安装。
Cursor 会在浏览器中引导你登录 iHatePosting 账户;点击 Allow。Cursor
团队中的每个人都使用自己的账户登录,因此不会有人通过他人的账户发帖。
如果你的 Cursor Enterprise 计划启用了 MCP 允许列表,请允许
https://ihateposting.com/mcp/oauth。
在插件上架前,请安装本地副本。将此仓库克隆或复制到
~/.cursor/plugins/local/ihateposting(Windows 上为
%USERPROFILE%\.cursor\plugins\local\ihateposting)。Cursor 会跳过指向其他
文件夹的符号链接,因此请复制文件。然后重启 Cursor 或运行
Developer: Reload Window,并在 Customize 下确认已列出
iHatePosting 技能和 MCP 服务。在 Teams 和 Enterprise 计划中,管理员可通过
Allow Local Plugin Imports 控制此功能;该选项在 Enterprise 中默认关闭。
安装 Marketplace 版本后,将使用该版本,而非本地副本。
如果你已经在 ~/.cursor/mcp.json 中手动添加了服务,请在安装插件时删除该
条目,以免出现两个 iHatePosting 服务。
若要仅手动添加服务,请将以下内容放入 ~/.cursor/mcp.json 并重启
Cursor:
{
"mcpServers": {
"ihateposting": {
"type": "http",
"url": "https://ihateposting.com/mcp/oauth"
}
}
}
然后打开 Customize,再打开 MCPs,启用 iHatePosting 并点击 Connect 以登录。
以下是相同配置的一键链接:
VS Code 与 GitHub Copilot
选择
在 VS Code 中安装
(或 VS Code Insiders),
或者将服务添加到项目中的 .vscode/mcp.json:
{
"servers": {
"ihateposting": {
"type": "http",
"url": "https://ihateposting.com/mcp/oauth"
}
}
}
VS Code 文件使用 servers 作为顶层键,而不是像大多数其他编辑器那样使用 mcpServers,因此从 Cursor 配置中复制的代码块无法加载。该文件不包含机密信息,可以安全地提交。
服务首次启动时,VS Code 会提示你登录。浏览器窗口将打开:登录你的 iHatePosting 账户,然后按 Allow。无需粘贴密钥。接着在 Agent 模式下打开 Copilot Chat,iHatePosting 工具会显示在工具列表中,然后让它起草一篇帖子。
如果使用 Copilot Business 或 Enterprise,你所在组织的管理员可能需要先在 Copilot 策略中允许 MCP 服务。
Gemini CLI
gemini extensions install https://github.com/iHatePostingOrg/agent-skill
无需 API 密钥。下次启动 Gemini CLI 时,它会连接到服务并打开浏览器:登录 iHatePosting,然后按 Allow。它会将令牌保存在 ~/.gemini/mcp-oauth-tokens.json 中,并根据需要刷新令牌。之后需要重新登录时,使用 /mcp auth ihateposting。
Gemini CLI 本来也无法从请求头中读取我们的密钥:它会根据经过清理的环境变量展开 MCP 请求头中的 ${...},并将名称包含 KEY、TOKEN、SECRET 或 AUTH 的变量清空,因此使用我们的密钥变量构建的请求头会变成空值,每次调用都会失败,而 Google 的文档对此也没有任何警告。登录可以避免这个问题,而不是设法绕过它。
该扩展使用 url 和 type: "http",这是 Gemini CLI 0.21 及更高版本识别为 Streamable HTTP 的形式。
Grok Build
grok plugin install iHatePostingOrg/agent-skill --trust
在信任插件之前,插件的 MCP 服务会保持关闭状态,而 --trust 的作用就是信任插件。然后启动 grok,打开 /mcps,选择 ihateposting 并按 i:Grok Build 会打开浏览器,登录你的 iHatePosting 账户,然后按 Allow。登录后,工具便会显示。之后需要重新登录时,重复上述步骤即可。
Kimi Code
在 Kimi Code 中:
/plugins install https://github.com/iHatePostingOrg/agent-skill
Kimi Code 会安装此仓库的最新版本,并读取其 .kimi-plugin/plugin.json,以添加服务和技能。当服务首次提示需要登录时,Kimi Code 会提供一个 authenticate 步骤:批准后,浏览器会打开;登录 iHatePosting,然后按 Allow。你也可以运行 /mcp 查看服务名称,然后使用该名称运行 /mcp-config login。无需粘贴密钥。Kimi Code 会将令牌保存在 ~/.kimi-code/credentials/mcp/ 下。
Kimi Code 的清单会直接写明服务名称,而不是放在单独的文件中,并将 transport 设置为 http(Streamable HTTP)。此信息来自 Kimi Code 的源代码(版本 2.1.1);尚未在 Kimi Code 本身中运行验证。
Qwen Code
qwen extensions install iHatePostingOrg/agent-skill:ihateposting
然后在 Qwen Code 中打开 /mcp,选择 iHatePosting 并选择 Authenticate。浏览器窗口会打开:登录你的 iHatePosting 账户,然后按 Allow。无需粘贴密钥。Qwen Code 会将令牌保存在 ~/.qwen/mcp-oauth-tokens.json 中,并根据需要刷新令牌;之后需要重新登录时,在同一位置选择 Re-authenticate。
其他 Agent
ChatGPT、Codex、OpenClaw、Hermes Agent、 DeepSeek Harness、Perplexity Computer、Zed、Cline 等都可以连接到同一服务,无需此软件包。每种 Agent 都有相应的设置页面(见本 README 顶部的列表),而 设置指南 涵盖了所有这些 Agent。
OpenClaw 的文档称,它会将带有 .cursor-plugin/ 文件夹的软件包视为 Cursor 捆绑包,因此预计在 OpenClaw 中安装此仓库不会添加 MCP 服务。请改用 OpenClaw 页面上的 MCP 配置方式。
任何可读取技能的 Agent
此技能列在 skills.sh 上,因此可读取技能的 Agent 可以从那里获取:
npx skills add https://github.com/ihatepostingorg/agent-skill --skill ihateposting
这只会复制技能,不会连接 iHatePosting 服务:请按照 Agent 设置页面中的说明连接服务。此技能通过服务的工具运行;ihateposting 命令行
(下文)是一个独立工具,拥有自己的说明(ihateposting skill --print)。
获取 API 密钥
上述 Agent 均不需要 API 密钥。密钥适用于 ihateposting 命令行、本地 npm 服务、REST API,以及无法登录的 Agent。
请在 ihateposting.com 登录,打开 Settings →
Developers 并创建密钥。密钥以 pk_live_ 开头,之后可以在同一页面再次查看(2026 年 9 月下旬之前创建的密钥无法再次查看;页面会对此进行说明,重新生成即可获得可再次查看的密钥)。每个账户只有一个密钥:
重新生成会使旧密钥在所有使用它的地方失效。密钥可以代表你发布内容,因此请勿将其放在聊天中、截图里或共享文件中。
安全
- 默认保存为草稿。
create_post会保存为草稿,除非传入action: "now"(立即发布)或action: "schedule"(在指定时间 发布)。除非另有说明,CLI 也会保存为草稿。REST API 没有默认行为: 未传入action的请求会被拒绝。 - 有问题的帖子在保存前会被拒绝。 创建或更新准备发布的帖子时, 系统会根据帖子面向的每个网络进行检查;如果任一网络会拒绝该帖子, 系统就会拒绝该帖子,并说明相应网络给出的原因。草稿会跳过此检查, 因此尚未完成的帖子也可以保存。发布器会在发送前再次检查每个帖子, 并跳过检查未通过的帖子。
- 每个帖子的选项名称和值都会经过检查,包括草稿。 如果网络不读取
某个键(例如,
ytMadeForKids对应的madeForKids),或不接受某个 值,系统会拒绝该帖子,并提示正确的名称或值,而不会保存后忽略这些 设置。 - 使用
update_post为草稿安排发布时间。reschedule_post会拒绝 草稿。使用action: "schedule"调用update_post时,会执行创建时 的检查,并像create_post一样按账号拆分帖子。 - 时间会以两种形式返回。
scheduledAt使用 UTC;旁边的scheduledLocal表示同一时刻在账号所有者时区中的时间,whoami会将该时区列为ownerTimezone。未使用action: "schedule"却传入日期,或传入不存在的日期,都会被拒绝。 - 已安排发布时间的帖子不能再改回草稿。
update_post会拒绝此操作。 请删除该帖子,并将其重新创建为草稿。 - 面向多个网络安排发布时间的帖子会被拆分。 当
create_post或update_post为多个账号安排或发布帖子时,帖子会拆分为每个账号对应 一条,并共享同一个组 ID;create_post的响应会列出每条帖子。草稿 不会拆分,仍是一条帖子。拆分后,reschedule_post和delete_post每次只会操作其中一条;update_post可以修改某条帖子的文本、选项和 媒体,但必须传入该帖自身的accountIds——添加或替换账号会被拒绝。 - 删除不会撤回已发布的帖子。
delete_post只会删除 iHatePosting 的记录。除非设置了force,否则已发布的帖子会被拒绝删除;该帖子 仍会在网络上保持发布状态。正在发布的帖子无法删除。 - 重试只会重新发送失败的内容。 已成功发布的内容会保持不变。网络 可能会报告失败,但帖子实际上已经上线,因此重试前请先检查该网络。
- 审批提示取决于 Agent。 在 Claude Code 中,技能只会预先批准读取 工具,因此任何会创建、更改、发布或删除内容的操作都会先请求批准, 除非你自己的权限设置允许这些操作。Cursor、Gemini CLI、Grok Build、 Kimi Code 和 Qwen Code 使用各自的审批设置。
- 社交账号只能在 ihateposting.com 连接,不能通过 Agent 连接。 每个 网络自己的登录页面会处理密码,帖子则通过各网络的官方 API 发布,与 iHatePosting 应用发送帖子的方式相同。Agent 永远不会看到社交账号的 登录信息。
媒体
upload_media接受我们自行获取的url(首选,也是唯一适用于任何实际大小视频的方式,最大 100 MB;图片最大 25 MB),或作为base64提供的文件,并可附带替代文本;它会返回一个媒体库 ID,供填入mediaIds。通过对话传递的 base64 上限为 8 MB,而且这些字节是模型自己输入的,因此会被截断:绝不要将它用于仅作为聊天附件存在的文件。open_upload_widget会在对话中显示文件选择器来处理这种情况;对于使用 shell 的 Agent,则可使用ihateposting upload <path>命令。图片可以是 JPEG、PNG、WebP 或 GIF;视频可以是 MP4、MOV 或 WebM。list_media返回已上传内容的 ID、大小和尺寸,不会返回下载链接。(RESTGET /api/v1/media会包含下载链接。)- 一篇帖子最多可使用 20 个媒体 ID,并按提供的顺序附加。
- 较大的文件:将其上传到 ihateposting.com,再用
list_media查找;或使用 REST 上传路由,单次上传支持最大 25 MB 的图片和最大 512 MB 的视频,分段上传则最大可达 2,000 MB。请参阅 docs/api.md。 - 媒体库有存储配额:90 天免费试用期内为 500 MB。付费套餐(开售后)分别为 5 GB(Creator)、25 GB(Growth)和 100 GB(Pro)。
- 替代文本会发布到 Bluesky、Instagram、Threads、Mastodon、Pinterest、Tumblr 和 Slack。LinkedIn 会将其用作视频标题。
- 自定义视频封面需使用媒体库中的图片,并在该网络的选项中通过
coverAssetId设置。YouTube、Instagram、Facebook、LinkedIn、Pinterest、Telegram、Mastodon 和 Tumblr 支持此设置。TikTok 不接受上传的封面。 - TikTok 照片帖子接受 JPEG 或 WebP,不接受 PNG。
分析
get_analytics 接受 7d、15d、30d(默认值)、90d、12m 或 all 范围。对于每个已连接的频道,它会返回该网络自己的指标、关注者数量、浏览量、互动次数和互动率、按星期几和一天中的时段统计的发帖时间、每日趋势以及排名前五的帖子。所有套餐的分析功能相同,包括较长的时间范围。通过 REST API,GET /api/v1/analytics?range=30d&format=xlsx 会返回一份电子表格,其中包含你在该时间范围内通过 iHatePosting 发布的帖子。
每篇帖子的统计数据来自 Bluesky、Facebook、Instagram、Threads、LinkedIn Pages、Pinterest、TikTok(仅公开帖子)、YouTube、Mastodon、Tumblr、Slack,以及通过机器人连接的 Discord 频道。Telegram 不提供每篇帖子的统计数据,只提供成员数量;LinkedIn 个人资料也不会纳入统计。仅当服务已启用 X 读取权限时,才会统计 X。回答中的 unmeasuredPlatforms 字段会列出所有已连接但完全不提供统计数据的网络,以免将缺失的数字误认为没有覆盖面。
其他连接方式
本地 MCP 服务(npm)。 对于会启动本地进程的客户端,同样的
16 个工具也可通过 ihateposting-mcp 运行,
该包需要 Node.js 20 或更高版本(自 0.10.0 起):
{
"mcpServers": {
"ihateposting": {
"command": "npx",
"args": ["-y", "ihateposting-mcp"],
"env": { "IHATEPOSTING_API_KEY": "pk_live_…" }
}
}
}
IHATEPOSTING_API_URL 可更改其连接的服务(默认为
https://ihateposting.com)。
命令行。 ihateposting
(npm i -g ihateposting,或无需安装即可运行 npx ihateposting <command>)
可起草、检查、安排发布时间并发布内容,上传磁盘上的文件,还可列出帖子。其命令包括 login、logout、whoami、accounts、platforms、
posts、upload、post 和 skill;ihateposting help 会列出命令
和主要标志。
ihateposting login <key> # saved in ~/.ihateposting/config.json
ihateposting whoami # which account the key belongs to
ihateposting accounts --json # connected accounts, with ids
ihateposting upload ./launch.mp4 --alt "Product demo" # prints a media id
ihateposting post "text" --to bluesky,linkedin --check # validates this draft, creates nothing
ihateposting post "text" --to instagram --media "$ID" # draft with the uploaded file
ihateposting post "text" --to x --at "2026-10-01 9:00 AM" --check # check the scheduled version first
ihateposting post "text" --to x --at "2026-10-01 9:00 AM" # scheduled
ihateposting posts --status scheduled --from 2026-12-01 --to 2026-12-31 # prints the total too
ihateposting skill # writes .claude/skills/ihateposting/SKILL.md
--check 会按原样验证命令,因此请提供与实际发布时相同的
--now 或 --at。--now 会立即发布。命令行目前无法设置各网络的选项,因此 Pinterest 看板或 YouTube 的儿童内容设置需要使用 MCP 工具或 REST API。每条命令成功时退出码为
0,失败时为 1。ihateposting skill --print 会打印 CLI 自带的技能,而不是将其写入文件。
要将 CLI 的技能提供给任何 Agent——Claude Code、Cursor、Codex、GitHub
Copilot 等——请使用开源的
skills 安装程序从此仓库安装;该安装程序会询问要为哪些 Agent 进行设置:
npx skills add iHatePostingOrg/agent-skill --skill ihateposting-cli
该技能位于 cli/ihateposting-cli/SKILL.md:它与 ihateposting skill
写入的内容相同,供使用命令行发布内容的 Agent 使用。它不属于上文提到的任何插件。命令行和 npm
服务读取的设置,列在它们各自在 npm 上的 README 中
(ihateposting,
ihateposting-mcp)。
在 URL 中包含密钥。 某些连接器对话框只接受 URL,不提供填写标头的字段。对于这类情况,服务也会从
地址中读取密钥:https://ihateposting.com/mcp?key=pk_live_…。URL 中的密钥可能会出现在浏览器历史记录、代理日志和 Referer 标头中,因此,只要客户端允许,请优先使用标头;如果包含密钥的 URL 曾被分享,请创建新密钥。
MCP Registry。 该服务已列入官方 MCP Registry,名称为
com.ihateposting/mcp,并提供两个地址:客户端登录用的
https://ihateposting.com/mcp/oauth,以及
https://ihateposting.com/api/mcp(与 /mcp 是同一服务),后者通过 Authorization: Bearer 接收密钥。该条目还列出了本地 npm 服务 ihateposting-mcp。
REST API 和 Webhook
MCP 工具是公共 REST API 的轻量封装,使用相同的密钥,格式为 Authorization: Bearer pk_live_…:
| 方法和路径 | 工具 |
|---|---|
GET /api/v1/accounts | list_accounts、whoami |
GET /api/v1/platforms | get_platform_rules |
POST /api/v1/posts/validate | validate_post |
GET /api/v1/posts、POST /api/v1/posts | list_posts、create_post |
GET、PATCH、DELETE /api/v1/posts/{id} | get_post、update_post、delete_post |
POST /api/v1/posts/{id}/reschedule | reschedule_post |
POST /api/v1/posts/{id}/retry | retry_post |
GET /api/v1/media、POST /api/v1/media/presign、POST /api/v1/media/confirm、POST /api/v1/media/from-url | list_media、upload_media |
GET /api/v1/pinterest/boards | list_pinterest_boards |
GET /api/v1/analytics | get_analytics |
请求和响应格式见 docs/api.md。
Webhook 会在帖子发布完成时通知其他系统。请在 ihateposting.com 的 Settings → Webhooks 中添加(最多 10 个)。每个 Webhook 都会收到带签名的 POST,事件类型为 post.published、post.partial 或 post.failed:
X-iHatePosting-Signature标头的值为sha256=,后接使用该 Webhook 密钥(whsec_…)计算的原始请求正文的 HMAC-SHA256。- 重试投递时,载荷中的
id保持不变,因此可用它去除重复项。 - Webhook 可限制为指定账户。此时,只有涉及这些账户的帖子会触发 Webhook,且载荷仅包含这些账户的结果。
- Send test 会发送格式相同的示例载荷,并添加
X-iHatePosting-Test: true标头。
Zapier、Make 和 n8n 的设置说明见本指南。
限制
- 每个账户每分钟的请求数: 创建 30 次、更新 60 次、重新安排 30 次、重试 15 次、验证 60 次、读取分析数据 60 次、列出媒体 120 次、查询 Pinterest 看板 60 次,以及上传 30 次。
list_posts、list_accounts、whoami和get_platform_rules共用每分钟 60 次的限额。超过限额会返回 HTTP 429;请等待一分钟后重试。 - 每次
create_post调用只能创建一条帖子,最多可附带 20 个媒体 ID。 list_posts使用分页。 默认每页 50 条,最多 200 条。响应中包含符合筛选条件的总数total和当前页数量returned,以及hasMore和nextCursor。请使用total获取总数,不要根据当前页统计;统计时请使用status和from/to进行筛选。- 90 天免费试用。 付费方案尚未开售;各方案及其包含的内容请见下方链接中的价格页面。
- X 所有方案均可使用,但每月发帖数量取决于方案,且每天也有数量限制。X 帖子中的链接需要付费 Pro 方案;免费试用期间,请发布不带链接的 X 帖子,或为 X 单独提供文案。
方案和价格:ihateposting.com/pricing。
故障排除
- 缺少工具。 Agent 尚未登录。在 claude.ai 和 Cowork 中,通过插件的 Connectors 标签页连接 iHatePosting;在 Claude
Code 中,运行
/mcp并选择 Authenticate;在 Cursor 中,打开 Customize, 然后选择 MCPs,开启 iHatePosting 并按 Connect;在 Gemini CLI 中,运行/mcp auth ihateposting;在 Grok Build 中,打开/mcps并按i;在 Kimi Code 中,批准其authenticate步骤,或运行/mcp-config login,并使用/mcp显示的名称;在 Qwen Code 中,打开/mcp, 选择 iHatePosting 并选择 Authenticate。以上方式均不使用密钥。 - 在 Cursor 或 Grok Build 上从 0.4.x 升级? 这些插件过去会发送 API 密钥。现在改为按上述方式登录一次。插件不再读取你为 0.4.x 设置的密钥, 因此可以从 Cursor 的插件设置或你的 shell 配置文件中删除它。如果没有其他地方使用该密钥, 请前往 Settings → Developers 重新生成密钥,让旧密钥失效。
- 命令行或 npm 服务提示“No API key”。 未提供密钥。运行
ihateposting login <key>。 - 基于密钥的设置提示“iHatePosting API 401”。 密钥错误、已被更新的密钥替换,或客户端发送的是未填写的占位符, 而不是密钥。先检查客户端的设置,再判断密钥是否已被撤销。
- 账户显示
needs_reauth。 必须在 ihateposting.com 的 Accounts 页面重新连接;Agent 无法执行此操作。待处理的 发布会暂缓,重新连接同一账户后就会发送。如果待处理的发布在原定时间 14 天后仍未发送,则会失败;请重新连接账户,然后重试。 - HTTP 429。 已达到每分钟限制(请参阅限制)。
- 发布到的社交网络少于请求数量。
create_post的答复会在unresolved中列出所有未匹配到已连接且活跃账户的请求名称或 ID。 - 部分社交网络发布成功,其他网络失败。 帖子的状态为
partial。get_post会显示每个网络的错误,retry_post只会重新发送 失败的部分。如果发布方的最后一次检查拒绝了某条内容,该次发送也可能为skipped;请修改帖子,而不是重试。 - 创建或更新时被拒绝。 消息来自社交网络自身的规则,例如说明文字超出限制或缺少媒体内容。请修改内容,或为 该网络指定覆盖设置,然后重新发送。草稿会跳过这些检查。
- 选项被拒绝(“你是不是想用 ytPrivacy?”)。 键或值不属于该网络支持的选项。请使用消息中指出的选项;
get_platform_rules会列出所有选项。草稿也会进行此项检查。 - YouTube 发布被拒绝。 需要一个视频、一个标题,以及面向儿童内容的声明:在
youtube选项中将ytMadeForKids设为true或false。除非设置ytPrivacy,否则隐私状态默认为公开。 - Pinterest 发布被拒绝。 Pin 必须指定看板。通过
list_pinterest_boards获取 ID,并在pinterest选项中将其设为boardId。 列表为空表示该账户还没有看板;请先在 Pinterest 上创建一个。 - TikTok 的受众不正确,或根本没有发布。 如果未设置
tiktokPrivacy,通过 Agent 或 API 发送的帖子会面向 TikTok 为该账户提供的最广泛受众;对于公开账户,该受众为所有人。 请将其设为public、followers、friends或private;其他值都会被拒绝。使用tiktokSendAsDraft时,视频会发送到创作者的 TikTok 收件箱,并报告为已完成,但只有创作者在 TikTok 应用中发布后,视频才会公开。
网络端点和凭据
- 此软件包中的每个 Agent 都会调用同一个地址:
https://ihateposting.com/mcp/oauth:通过 Streamable HTTP 使用 MCP,并通过 OAuth 登录。它不会发送密钥。每个 Agent 都会从服务自身的元数据中发现登录方式,使用 PKCE 并注册自身, 然后保存自己的令牌(Gemini CLI 位于~/.gemini/mcp-oauth-tokens.json,Grok Build 位于~/.grok/mcp_credentials.json,Kimi Code 位于~/.kimi-code/credentials/mcp/,Qwen Code 位于~/.qwen/mcp-oauth-tokens.json)。可在 ihateposting.com 的“设置” → “开发者”中撤销登录。 - 对于基于密钥的设置(本地 npm 服务、无法登录的 Agent),
https://ihateposting.com/mcp是同一个服务,会发送Authorization: Bearer <key>。此软件包中的任何内容都不会使用它。 - 没有钩子或安装脚本,也不会在你的计算机上运行任何内容。
- 服务会收到的内容:你请求发布的帖子的文本、媒体和选项,以及列出、检查、更改或报告这些帖子的请求。服务会通过你所选社交网络各自的官方 API 将这些内容转发给它们。隐私政策位于 ihateposting.com/privacy。
此存储库包含的内容
| 路径 | 用途 |
|---|---|
.claude-plugin/plugin.json、.claude-plugin/marketplace.json、mcp.claude.json | Claude(claude.ai、Cowork、Claude Code) |
.cursor-plugin/plugin.json、mcp.cursor.json | Cursor |
gemini-extension.json | Gemini CLI |
.grok-plugin/plugin.json、.grok-plugin/marketplace.json、mcp.grok.json | Grok Build |
.kimi-plugin/plugin.json | Kimi Code |
qwen-extension.json | Qwen Code |
| assets/logo.svg | Cursor 和 Grok Build 显示的徽标 |
skills/ihateposting/SKILL.md | 全部六个:如何安全发布 |
skills/ihateposting/references/platform-options.md | 全部六个:各网络的选项键,按需加载 |
clawhub/ihateposting/SKILL.md | OpenClaw 和 Hermes Agent(通过 ClawHub):为手动添加的服务提供相同指导 |
clawhub/ihateposting/references/platform-options.md | 与插件中相同的文件,供 ClawHub 副本使用 |
cli/ihateposting-cli/SKILL.md | 使用 ihateposting 命令行发布的 Agent,通过 npx skills add iHatePostingOrg/agent-skill --skill ihateposting-cli 安装;不属于任何插件 |
docs/platforms.md | 每个网络接受的内容,完整说明 |
docs/api.md | REST API |
examples/ | create_post 草稿载荷及其用法 |
scripts/check.mjs、.github/workflows/check.yml | 发布检查,每次推送时运行 |
.github/workflows/release.yml | 每个版本标签都会发布一个 GitHub Release,并附上变更日志说明 |
CHANGELOG.md | 各版本的变更内容 |
每个 Agent 都有自己的 MCP 文件,因此每个清单只会指定一个服务;它们全部指向同一个登录地址。根目录有意不放置 .mcp.json,这样工具就不会拾取此软件包无意提供的服务。
node scripts/check.mjs 会在发布前检查清单、密钥处理、技能和示例。它还会检查此 README 是否列出了每个工具和网络,以及每个示例是否都是草稿。
反馈和问题
如需报告问题或提出需求,请在此存储库的议题区留言, 或通过 ihateposting.com/contact 联系我们。
链接
- 网站:ihateposting.com
- 每个 Agent 的设置页面:ihateposting.com/ai-agents
- 设置指南:从 AI Agent 发布到社交媒体
- REST API:docs/api.md
- 定价:ihateposting.com/pricing
- 隐私政策:ihateposting.com/privacy
- 条款:ihateposting.com/terms
Changelog
See CHANGELOG.md.
License
MIT. See LICENSE.
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。