内容
# pendpost
**由代理人操作的社交媒体,具有人类审批门槛。**
[](https://github.com/pendpost/pendpost/actions/workflows/ci.yml)
[](LICENSE)
[](package.json)
[](https://modelcontextprotocol.io)
[](CONTRIBUTING.md)
<p align="center">
<img src="brand/github/readme-hero-preview.png" alt="pendpost: AI 代理人撰写和安排帖子;人类审批门槛决定发布内容" width="820">
</p>
pendpost 是一个免费、开源(MIT)、本地优先的社交媒体计划工具,允许 AI 代理人撰写和安排跨多个平台的帖子,包括 Instagram、Facebook、LinkedIn、YouTube、X、Telegram、Discord、Mastodon、Nostr 以及 WordPress 和 Ghost 的长篇博客(带有新闻稿功能)。该工具具有人类审批门槛,您可以控制 AI 代理人的输出。pendpost 是 MCP 原生的,这意味着 AI 代理人可以撰写、检查、安排和排队您的帖子,但除非人类审批,否则不会发布任何内容。该工具适用于希望让代理人执行工作而不交出控制权,并避免账户被标记的开发者、机构和技术独行者。
## 为什么 pendpost 与众不同(不仅仅是一个调度工具)
大多数“AI 社交”工具只是带有代理人的调度器。pendpost 则相反。它是一个围绕代理人加人类工作流设计的运营层,而调度器无法提供以下功能:
<p align="center">
<img src="brand/github/approval-gate-diagram-preview.png" alt="审批门槛:代理人撰写,您默认审批,只有审批后才发布" width="820">
</p>
- **人类审批门槛。** 每个帖子都有一个审批状态(`draft`、`approved`、`rejected`),并且是关闭的:没有审批的帖子不会发布。`plan_create_post` 总是创建草稿,只有 `approve_post` 或 `reject_post` 可以更改状态。除非获得审批,否则不会发布任何内容。默认情况下,您是审批者;自动审批仅限所有者,并且可以撤销。
- **防封断路器。** Meta 错误 368(操作阻止)会触发断路器,暂停 Meta 通道,并且不会自动恢复,因为 368 没有机器可读的清除时间。健康探测在阻止时发送零 Graph 流量。节奏上限延迟突发,而不是丢弃它们,并且通道暂停的杀死开关始终可用。
- **品牌检查。** 在发布之前,字幕会根据 `rules.json` 中的可编辑规则进行检查。品牌检查层会标记英文 AI 写作的迹象。错误会阻止发布;警告是建议性的。
- **诚实的原生调度。** 在支持的平台(Facebook 调度帖子,YouTube `publishAt`)上,pendpost 使用原生调度,因此这些帖子即使在您的计算机关闭时也会触发。Instagram、LinkedIn 和 X 没有原生调度,因此 pendpost 必须运行才能发布它们;在始终在线的主机上运行以涵盖这些平台。关于哪些封面/缩略图机制实际适用于每个平台,它保持诚实。
- **双界面。** Web 仪表板和任何 MCP 客户端驱动相同的合同。兼容性测试强制每个功能在两个界面上都可用。
- **德语和瑞士本地化。** 在仪表板、摘要和通知中运行英语或真正的瑞士德语(`de-CH`,带有正确的变音符号和 24 小时瑞士日期);在“设置”中选择语言。参见 [本地化文档](https://docs.pendpost.com/localization)。
## 快速开始
一行命令,无需设置:
```bash
npx pendpost
# 然后打开 http://127.0.0.1:8090
```
无需账户,无需注册 - pendpost 在本地运行并立即启动。您可以立即草拟、审批和安排整个活动;第一次运行会在 `data/plans` 中提供一个示例“Acme Launch”活动,以便您立即看到真实的内容。在准备发布时,在 **设置** 中连接一个平台 - 在此之前,该通道是实时但未认证的,因此发布只需等待连接即可。
更喜欢 git 或 docker?
```bash
# git
git clone https://github.com/pendpost/pendpost pendpost
cd pendpost
npm start # 或:node bin/pendpost.mjs(在第一次运行之前构建仪表板)
# 然后打开 http://127.0.0.1:8090
```
```bash
# docker
docker compose up
# 然后打开 http://127.0.0.1:8090
```
## 仪表板
计划器和审批队列是您使用的两个屏幕:左侧是草稿和安排,右侧是审批或拒绝。右侧没有任何内容可以自行审批。
| 计划器 | 审批队列 |
| --- | --- |
|  |  |
## MCP 客户端
最简单的路径是自我启动:pendpost 通过原生 stdio 讲 MCP,因此客户端为您启动服务器 - 无需先启动任何内容。
Claude Desktop(一键式):安装 pendpost `.mcpb` 包,附在每个 [GitHub 发布](https://github.com/pendpost/pendpost/releases) 中。它自我启动 `npx -y pendpost --stdio` 并在同一进程中打开审批仪表板。
任何 stdio MCP 客户端:
```json
{
"mcpServers": {
"pendpost": { "command": "npx", "args": ["-y", "pendpost", "--stdio"] }
}
}
```
高级 / 开发(HTTP 传输):pendpost 还通过 `/mcp` 上的流式 HTTP 提供 MCP。这需要服务器已经通过 `npx pendpost` 运行:
```bash
claude mcp add --transport http pendpost http://127.0.0.1:8090/mcp
```
### AI 辅助设置(适用于 Chrome 的 Claude)
在真实平台上线意味着在每个供应商的门户中创建一个开发者应用并运行 OAuth 仪式。pendpost 使该代理人可驱动:在仪表板的 **设置** 页中,每个未完成的卡片上都有一个 **复制 AI 提示** 按钮,该按钮复制了一个准备好的、安全的提示,适用于 Claude for Chrome,用于驱动该平台的门户。您在每个登录/同意门槛处进行身份验证,并且凭证由 CLI 本地铸造 - 它永远不会通过代理人或聊天传递。相同的设置合同在 [`AGENTS.md`](AGENTS.md) 中为任何代理人记录。
## MCP 工具的作用
每个功能都是一个 MCP 工具,仪表板也反映了这一点。只读工具永远无法发布;写入工具会创建草稿,并由上述审批规则控制。按功能分组:
- **读取和检查:** `plan_list`、`plan_get`、`account_status`、`assets_list`、`activity_log`、`validate_media`、`platform_validate`、`pendpost_health`、`publish_preview`、`brand_lint`、`generate_digest`、`config_get`、`clients_overview`。
- **撰写:** `plan_create_post`、`plan_update_post`、`plan_delete_post`、`campaign_create`、`campaign_set_active`。
- **审批(人类门槛):** `approve_post`、`reject_post`。除非获得审批,否则不会发布任何内容;默认情况下,您是审批者。
- **安排和发布:** `scheduler_set`、`publish_due_run`、`reschedule`、`unschedule`、`mark_posted`、`verify_post`。
- **封面和资产:** `set_cover`、`clear_cover`、`asset_upload`、`rename_asset`、`delete_asset`。
- **洞察和安全:** `fetch_insights`、`token_refresh`、`pendpost_record_block`、`health_recheck`、`meta_lane_set`。
- **配置和客户端:** `config_set`、`client_create`、`client_update`、`client_archive`、`client_list`、`client_set_active`。
权威计数和读写分割源自 `lib/mcp.mjs`,并由 `test/parity-check.mjs` 验证(参见 [MCP 文档](https://docs.pendpost.com/mcp))。每个工具还带有 `readOnlyHint`/`destructiveHint`/`title` 注释,位于 `tools/list` 中。
## 上线
当您准备发布时,在 **设置** 中连接每个平台(或复制 `.env.example` 到 `.env` 并仅填写您使用的平台)。一个平台在凭证存在时发布;在此之前,它是实时但未认证的,发布等待连接。(`PENDPOST_MODE=mock` 仅作为测试/演示装置,适用于每个通道通过凭证免费的模拟驱动程序。)
每个平台都有一个交互式设置仪式,写入 `.env`:
```bash
# Meta(Facebook + Instagram)。系统用户令牌优先用于自动化。
node scripts/meta-social.mjs setup-system-user \
--system-user-token <T> --page-id <ID> --app-id <ID> --app-secret <S>
# (或 `node scripts/meta-social.mjs setup` 获取长期页面令牌)
# LinkedIn(在创建 OAuth 应用后)
node scripts/linkedin-social.mjs auth
# YouTube(在创建 OAuth 客户端后)
node scripts/yt-social.mjs auth
# X(Twitter),OAuth 2.0 PKCE(浏览器)。OAuth 1.0a 无需浏览器 - 参见下文。
node scripts/x-social.mjs auth
# 静态凭证通道(无需浏览器):将凭证粘贴到 .env(或使用
# 仪表板设置表单),然后使用引擎的身份验证命令进行验证。
node scripts/telegram-social.mjs auth # TELEGRAM_BOT_TOKEN + TELEGRAM_CHANNEL_ID
node scripts/discord-social.mjs auth # DISCORD_WEBHOOK_URL
node scripts/mastodon-social.mjs auth # MASTODON_INSTANCE_URL + MASTODON_ACCESS_TOKEN
node scripts/wordpress-social.mjs auth # WORDPRESS_SITE_URL + _USERNAME + _APP_PASSWORD
node scripts/ghost-social.mjs auth # GHOST_SITE_URL + GHOST_ADMIN_API_KEY
node scripts/nostr-social.mjs keygen --save && node scripts/nostr-social.mjs auth # + NOSTR_RELAYS
```
**X(Twitter)** 支持两种身份验证路径;**OAuth 1.0a 是推荐的**,因为它不需要浏览器,并且可以避免某些应用程序在 X 的 OAuth 2.0 同意屏幕上遇到的 `ERR_TOO_MANY_REDIRECTS`。
- **OAuth 1.0a(推荐,零浏览器)。** 在 X 开发者门户中:(1)将应用的 **用户身份验证设置设置为先读取然后写入**;(2)然后在 **密钥和令牌** 下,生成/重新生成 **两个** API 密钥/秘密 **和** 访问令牌/秘密;(3)将所有四个粘贴到 `.env` 中,分别为 `X_API_KEY`、`X_API_SECRET`、`X_ACCESS_TOKEN`、`X_ACCESS_TOKEN_SECRET`。通道在设置 `X_ACCESS_TOKEN_SECRET` 的那一刻上线 - 无需 `auth` 命令。验证 `node scripts/x-social.mjs probe`(打印 `connected as @handle`)。易错点,按顺序:
- 所有四个值必须来自 **同一个应用** 和 **同一代**。
- 重新生成 API 密钥/秘密 **使访问令牌/秘密失效** - 因此请始终在 API 密钥/秘密之后重新生成访问令牌/秘密,而不是之前。
- 一个错误字符会产生 `401 "Could not authenticate you"`(代码 32),这会伪装成访问令牌问题。**从门户复制值;不要手动输入它们。**
- **OAuth 2.0 PKCE(浏览器)。** 创建一个 OAuth 2.0 机密客户端,回调 URL 为 `http://localhost:8087/callback`,范围为 `tweet.read tweet.write users.read media.write offline.access`,然后运行 `node scripts/x-social.mjs auth`。访问令牌持续约 2 小时,刷新令牌会旋转;pendpost 在每次运行前会自动刷新两者。
参见 `.env.example` 获取每个平台的环境变量的完整列表。
## 品牌检查 + 人性化
在发布之前,字幕会经过品牌检查。规则集位于 `rules.json` 中,您可以直接编辑它。每个规则都是一个带有 `id`、`severity`(`error` 会阻止,`warn` 是建议性的)、`matcher`(正则表达式或平台感知的内置函数,如 `captionLength`、`hashtagCount`、`allCaps`、`brokenLink`)和 `hint` 的对象。随附的默认规则集还包括标记英文 AI 写作迹象(AI 词汇、破折号、负面平行结构、填充词和回避词、宣传吹嘘)的规则。要禁用规则,请删除其对象;要添加规则,请附加一个对象。位于工作区根目录的 `rules.json` 会覆盖默认规则集。`brand_lint` 既是 MCP 工具,也是仪表板作曲家中的检查面板。
## 架构
pendpost 是一个零依赖的 Node 进程(`server.mjs`),具有四个接口:`/api` 处的 REST API、`/mcp` 处的 MCP 服务器(流式 HTTP、JSON-RPC 2.0、48 种工具)、`/media` 处的接口,用于在 `data/` 下范围流式传输本地文件,以及 `/`,用于从 `app/dist` 提供构建的 React 仪表板。后台逻辑位于 `lib/*.mjs` 中。有 14 个发布引擎位于 `scripts/` - 每个平台一个(`meta-social.mjs` 处理 Facebook 和 Instagram)- 每个引擎作为子进程在调度器滴答或按需启动,并发出 JSON 信封。计划和状态是本地 JSON。工作区根目录包含 `.env`、`config.json`、`state.json` 和 `data/`,可通过 `PENDPOST_ROOT` 覆盖(默认:安装目录)。
## 平台
Instagram、Facebook、LinkedIn、YouTube、X、Telegram、Discord、Mastodon、Nostr、WordPress 和 Ghost 已上线。Reddit、Pinterest、TikTok 和 Google Business Profile 处于测试阶段。每个引擎都处理自己的身份验证、发布、原生调度、封面/缩略图机制和只读洞察。Facebook、YouTube、Mastodon、WordPress 和 Ghost 原生调度,因此这些帖子即使在 pendpost 关闭时也会触发。Instagram、LinkedIn、X、Telegram、Discord 和 Nostr 没有原生调度,因此预定帖子由调度器在预定时间发布。
## 安全 + 隐私
pendpost 默认绑定 `127.0.0.1`(环回地址),从不联网,并在您的 `.env` 中保留秘密(该文件被 git 忽略)。有关完整的安全性和如何报告漏洞,请参见 [SECURITY.md](SECURITY.md)。
## 状态
pendpost 由一个小团队兼职维护,仍处于早期阶段。预计会有粗糙的边缘,请相应地设定您的响应时间预期。
## 文档
完整的手册位于 **[docs.pendpost.com](https://docs.pendpost.com)**(源码位于 `site-docs/`)。市场、定价和每个 [下载选项](https://pendpost.com/download) 均位于 **[pendpost.com](https://pendpost.com)**。
## 许可证
MIT,版权 2026 Nomadik GmbH。参见 [LICENSE](LICENSE)。请同时阅读 [DISCLAIMER.md](DISCLAIMER.md) 中的负责任使用立场和 [CONTRIBUTING.md](CONTRIBUTING.md) 中的贡献指南,然后再开启拉取请求。