内容
<p align="center">
<img src="apps/web/public/posthivemain.png" alt="Posthive" width="180" />
</p>
<h1 align="center">Posthive</h1>
<p align="center">
开源社交媒体调度平台。计划、创建和发布跨多个主要社交网络的帖子,内置MCP支持Claude、Cursor、ChatGPT和AI代理。<br/>
可自行托管 · 开源 · AGPL-3.0
</p>
<p align="center">
<a href="https://github.com/AstaBlackClove/posthive/blob/main/LICENSE"><img alt="License: AGPL-3.0" src="https://img.shields.io/badge/license-AGPL--3.0-blue.svg" /></a>
<a href="https://github.com/AstaBlackClove/posthive"><img alt="GitHub Repo" src="https://img.shields.io/badge/github-AstaBlackClove%2Fposthive-181717?logo=github" /></a>
</p>
---
## 功能特点
**调度管理**
- **多平台发布** - 一次编写,同步发布到所有11个平台
- **批量CSV调度** - 上传电子表格以调度数百个帖子;每行平台排除(`!instagram`)
- **帖子模板** - 保存、加载和删除可重复使用的帖子草稿
- **干燥运行模式** - 在不进行实际API调用的情况下进行完整流程测试
- **首条评论调度** - 在主帖子发布后自动回复
- **每平台覆盖** - 每个账户自定义文本和首条评论(Pro+)
**AI & 代理**
- **MCP服务器** - 通过一个裸URL连接Claude、ChatGPT、Cursor、VS Code、Claude Code、Codex、OpenClaw、Hermes Agent或任何MCP兼容的代理
- **OAuth 2.0 + PKCE** - 完整的动态客户端注册流程;无需粘贴任何客户端的API密钥 - 代理打开浏览器进行登录
- **`posthive-cli`** - 具有`login`/`logout`/`whoami`的shell CLI(`npx posthive-cli`),镜像完整的公共API,附带代理自我发现的`SKILL.md`
- **`posthive-mcp`** - 独立的MCP服务器包(`npx posthive-mcp`);与`posthive-cli`共享相同的登录凭证 via `~/.posthive/config.json`
- **10个MCP工具** - 列出账户、创建/获取/更新/删除帖子、批准草稿、复制、使用模板
- **媒体类型支持** - 通过MCP支持Instagram媒体类型(帖子/短片/故事)和YouTube类型(短片/视频)
- **草稿优先** - 除非明确请求调度,否则每个代理创建的帖子都会作为草稿供人工审核
- **计划门控** - MCP/API访问需要Pro或Team计划(自行托管且禁用计费:无限)
**媒体**
- 图片(每个帖子最多4张)、视频(最多100MB)
- Instagram短片、故事和轮播图(最多10个项目)
- YouTube短片 + 长视频,附带专属标题和描述字段
- Pinterest图钉,附带专属标题和描述字段,需要图片
- 每张图片都支持替代文本
- 剪贴板粘贴和拖拽上传
**日历 & 帖子**
- FullCalendar月/周/日视图,支持拖拽调整
- 通过服务器发送事件实现实时作业状态
- 列表和日历视图中的平台过滤器
- 重试失败的平台(仅重新排队失败的目标;跳过已成功的目标)
- 从列表视图进行内联编辑和重新调度
**身份验证 & 账户**
- 邮箱 + 密码身份验证(JWT,bcrypt,静默刷新)
- 通过Resend进行邮箱验证和密码重置
- 用于程序化访问的API密钥(Pro/Team计划)
- 带有“一键重新连接”的令牌过期警告
- 后台令牌自动刷新(Threads、Instagram、Facebook、YouTube每12小时)
**基础设施**
- 由Redis(Upstash或Railway)支持的BullMQ队列
- 所有存储的OAuth凭证均使用AES-256-GCM加密
- Sentry错误监控
- 孤立上传清理定时任务(每6小时)
- 每路由速率限制
- 所有OAuth流程中的CSRF随机数
**计费(可选)**
- Dodo Payments - 创作者、Pro、团队计划
- 14天免费试用;INR/USD货币检测
- 设置`ENABLE_BILLING=false`以进入自行托管模式,解锁所有功能,无计划限制
---
## 技术栈
| 层级 | 技术 |
| ---------- | ----------------------------------------------------------------------- |
| 前端 | Next.js 16(应用路由器)、React 18、Tailwind CSS |
| 后端 | Fastify v4、TypeScript ESM、Node.js |
| 数据库 | Prisma 5 - Postgres(开发环境使用Docker或本地安装)/ Postgres(生产环境) |
| 队列 | BullMQ 5 + Redis(Upstash或Railway) |
| 邮箱 | Resend |
| 存储 | 本地磁盘(开发环境)/ Supabase存储(生产环境) |
| 计费 | Dodo Payments |
| 监控 | Sentry |
| 日历 | FullCalendar 6 |
---
## 项目结构
```
posthive/
├── apps/
│ ├── api/ # Fastify v4 API(Node.js,TypeScript,ESM)
│ │ ├── prisma/ # 架构 + 迁移
│ │ └── src/
│ │ ├── adapters/ # 平台适配器(Bluesky、Threads、Instagram、LinkedIn、Mastodon、YouTube、Facebook、Pinterest、X/Twitter、Telegram、Nostr)
│ │ ├── lib/ # 身份验证、队列、工作线程、加密、存储、邮件发送、计划
│ │ └── routes/ # 身份验证、账户、作业、模板、上传、计费、用户、API密钥、公共API、MCP、OAuth
│ ├── web/ # Next.js 16 前端
│ │ └── src/
│ │ ├── app/ # 页面:撰写、作业、账户、计费、设置、文档、代理、功能、平台
│ │ └── components/ # 侧边栏、日历视图、批量调度模态框、Toast、平台预览、代理设置选项卡等
│ ├── cli/ # posthive-cli - 发布到npm的shell CLI(登录/注销/whoami + 完整API)
│ └── mcp/ # posthive-mcp - 发布到npm的独立MCP服务器
└── package.json # pnpm工作区根目录
```
---
## 先决条件
- **Node.js** >= 20
- **pnpm** >= 9 - `npm install -g pnpm`
- **Redis** - [Upstash](https://upstash.com) 免费层级或Railway Redis
- **Postgres** - [Docker Desktop](https://www.docker.com/products/docker-desktop/) (推荐,无需配置`pnpm dev:db`在首次运行时自动拉取`postgres:15`)或本地Postgres安装
---
## 快速开始
### 1. 克隆并安装
```bash
git clone https://github.com/AstaBlackClove/posthive.git
cd posthive
pnpm install
```
### 2. 配置环境
```bash
cp apps/api/.env.example apps/api/.env
```
填写以下值,详见[环境变量](#环境变量)。
### 3. 数据库
**选项A - Docker(推荐,无需Postgres安装)**
```bash
# 启动Postgres容器(首次运行创建,之后运行启动)
pnpm dev:db
```
在`apps/api/.env`中使用此`DATABASE_URL`:
```
DATABASE_URL="postgresql://postgres:postgres@localhost:5432/postgres"
```
容器名为`posthive-pg`。使用`pnpm db:stop`停止它,使用`pnpm db:start`重启它。
**选项B - SQLite(无需Docker,设置最快)**
在`apps/api/prisma/schema.prisma`中更改提供商:
```prisma
datasource db {
provider = "sqlite"
url = env("DATABASE_URL")
}
```
在`apps/api/.env`中使用此`DATABASE_URL`:
```
DATABASE_URL="file:./dev.db"
```
> SQLite适用于本地开发和单服务器自行托管。在生产环境中使用Postgres以确保可靠性和并发写入。
### 4. 运行迁移
```bash
cd apps/api
pnpm db:migrate
```
### 5. 运行开发服务器
```bash
# 从项目根目录启动Docker Postgres + API + Web并行
pnpm dev
```
> 如果您选择了SQLite(选项B),请跳过`pnpm dev:db`,只需单独运行`pnpm dev:api`和`pnpm dev:web`,或在注释掉`dev:db`步骤后使用`pnpm dev`。
| 服务 | URL |
| ------------- | ---------------------------------------- |
| Web | http://localhost:3000 |
| API | http://localhost:3001 |
| Prisma Studio | `pnpm db:studio` → http://localhost:5555 |
---
## 环境变量
### `apps/api/.env`
**核心**
| 变量 | 必需 | 描述 |
| ---------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------- |
| `PORT` | 否 | API端口。默认为`3001` |
| `DATABASE_URL` | 是 | `postgresql://postgres:postgres@localhost:5432/postgres`(Docker开发环境)或`file:./dev.db`(SQLite开发环境)或生产环境Postgres URL |
| `ENCRYPTION_KEY` | 是 | 64字符十六进制。凭证的AES-256-GCM密钥。**写入数据后切勿更改** |
| `REDIS_URL` | 是 | Upstash或Railway Redis URL |
| `WEB_URL` | 是 | 前端来源,用于CORS + OAuth重定向。开发环境为`http://localhost:3000` |
| `NODE_ENV` | 生产环境 | 设置为`production` |
| `SECURE_COOKIES` | 生产环境 | 设置为`true`以要求HTTPS进行身份验证cookie |
**身份验证**
| 变量 | 必需 | 描述 |
| --------------------------- | ---------- | ---------------------------------- |
| `AUTH_PROVIDER` | 否 | `local`(默认)或`supabase` |
| `JWT_ACCESS_SECRET` | local auth | 64字符十六进制 |
| `JWT_REFRESH_SECRET` | local auth | 64字符十六进制 |
| `SUPABASE_URL` | Supabase | `https://your-project.supabase.co` |
| `SUPABASE_ANON_KEY` | Supabase | Supabase匿名密钥 |
| `SUPABASE_SERVICE_ROLE_KEY` | Supabase | Supabase服务角色密钥 |
**邮箱**
| 变量 | 必需 | 描述 |
| ---------------- | -------- | ------------------------------------------------------------------ |
| `RESEND_API_KEY` | 否 | [Resend](https://resend.com) API密钥。开发环境默认为控制台 |
| `EMAIL_FROM` | 否 | 验证的发送者地址。示例:`Posthive <noreply@posthive.co>` |
**存储**
| 变量 | 必需 | 描述 |
| ------------------------- | --------- | --------------------------------------------------------- |
| `STORAGE_PROVIDER` | 否 | 生产环境使用`supabase`;不设置 = 本地磁盘 |
| `SUPABASE_STORAGE_BUCKET` | Supabase | 存储桶名称。默认为`media` |
| `PUBLIC_API_URL` | Instagram | API的公共HTTPS URL,用于Meta获取图片 |
**OAuth - Threads**
| 变量 | 描述 |
| ---------------------- | -------------------- |
| `THREADS_APP_ID` | Meta应用ID |
| `THREADS_APP_SECRET` | Meta应用密钥 |
| `THREADS_REDIRECT_URI` | 必须为公共HTTPS |
**OAuth - Instagram**
| 变量 | 描述 |
| ------------------------ | -------------------- |
| `INSTAGRAM_APP_ID` | Meta应用ID |
| `INSTAGRAM_APP_SECRET` | Meta应用密钥 |
| `INSTAGRAM_REDIRECT_URI` | 必须为公共HTTPS |
**OAuth - LinkedIn**
| 变量 | 描述 |
| ------------------------ | -------------------------- |
| `LINKEDIN_CLIENT_ID` | LinkedIn应用客户端ID |
| `LINKEDIN_CLIENT_SECRET` | LinkedIn应用客户端密钥 |
| `LINKEDIN_REDIRECT_URI` | 必须为公共HTTPS |
**OAuth - Mastodon**
| 变量 | 描述 |
| ------------------------ | ---------------------------------------- |
| `MASTODON_CLIENT_ID` | 客户端密钥,从Mastodon应用设置 |
| `MASTODON_CLIENT_SECRET` | 客户端密钥,从Mastodon应用设置 |
| `MASTODON_REDIRECT_URI` | 必须为公共HTTPS |
**OAuth - YouTube**
| 变量 | 描述 |
| ----------------------- | ---------------------------------------------------------------------------------------------------- |
| `YOUTUBE_CLIENT_ID` | Google OAuth客户端ID |
| `YOUTUBE_CLIENT_SECRET` | Google OAuth客户端密钥 |
| `YOUTUBE_REDIRECT_URI` | 使用`http://localhost:3001/auth/youtube/callback` Google拒绝隧道域名;localhost被豁免 |
**OAuth - Facebook Pages**
| 变量 | 描述 |
| ----------------------- | -------------------- |
| `FACEBOOK_APP_ID` | Meta应用ID |
| `FACEBOOK_APP_SECRET` | Meta应用密钥 |
| `FACEBOOK_REDIRECT_URI` | 必须为公共HTTPS |
**OAuth - Pinterest**
| 变量 | 描述 |
| ------------------------- | --------------------------------------------------------------------------------------------------------------------- |
| `PINTEREST_CLIENT_ID` | Pinterest应用ID从developers.pinterest.com |
| `PINTEREST_CLIENT_SECRET` | Pinterest应用密钥 |
| `PINTEREST_REDIRECT_URI` | 必须为公共HTTPS |
| `PINTEREST_SANDBOX` | 设置`true`同时应用具有试验访问路由API调用到沙盒 |
| `PINTEREST_SANDBOX_TOKEN` | 手动生成的沙盒令牌(我的应用→生成访问令牌→沙盒)。仅在`PINTEREST_SANDBOX=true`时使用 |
> Pinterest需要**标准访问**权限以创建生产环境中的Pin。 在developers.pinterest.com → 我的应用 → 请求升级访问。 直到获得批准,请设置`PINTEREST_SANDBOX=true`并使用沙盒令牌。
**OAuth - X (Twitter)**
| 变量 | 描述 |
| ---------------- | ---------------------------------------------- |
| `X_API_KEY` | API密钥(消费者密钥)从developer.x.com |
| `X_API_SECRET` | API密钥秘密(消费者秘密) |
| `X_CALLBACK_URL` | 必须为公共HTTPS — OAuth 1.0a回调URL |
> 需要启用计费时使用OAuth 1.0a(不支持2.0)。当启用计费时需要Pro或Team计划。
**计费**
| 变量 | 必需 | 描述 |
| ---------------------- | -------- | ----------------------------------------------------- |
| `ENABLE_BILLING` | 否 | 设置为`true`启用Dodo Payments和计划限制 |
| `DODO_ENV` | 计费 | `test_mode`或`live_mode` |
| `DODO_API_KEY` | 计费 | Dodo API密钥 |
| `DODO_WEBHOOK_SECRET` | 计费 | `whsec_...` Webhook签名密钥 |
| `DODO_PRODUCT_CREATOR` | 计费 | Dodo Creator计划产品ID |
| `DODO_PRODUCT_PRO` | 计费 | Dodo Pro计划产品ID |
| `DODO_PRODUCT_TEAM` | 计费 | Dodo Team计划产品ID |
**监控**
| 变量 | 必需 | 描述 |
| ------------ | -------- | --------------------------- |
| `SENTRY_DSN` | 否 | Sentry DSN。省略以禁用 |
生成密钥:
```bash
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
```
### `apps/web/.env.local`
| 变量 | 必需 | 描述 |
| ---------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| `NEXT_PUBLIC_API_URL` | 是 | 浏览器中的API URL。开发环境为`http://localhost:3011` |
| `NEXT_PUBLIC_WEB_URL` | 是 | Web应用的公共URL。用于OG图片、站点地图、robots.txt。开发环境为`http://localhost:3000`,生产环境为`https://yourdomain.com` |
| `NEXT_PUBLIC_ENABLE_BILLING` | 否 | 必须与API中的`ENABLE_BILLING`匹配 |
---
## 连接平台
### Bluesky
1. 进入应用中的**账户**
2. 输入您的用户名(例如 `you.bsky.social`)
3. 在[bsky.app](https://bsky.app) → 设置 → 应用密码
4. 输入它并点击连接,无需OAuth
### Threads
1. 在[developers.facebook.com](https://developers.facebook.com)创建一个应用并添加Threads使用场景
2. 将OAuth重定向URI设置为 `https://your-domain/auth/threads/callback`
3. 在`.env`中添加`THREADS_APP_ID`和`THREADS_APP_SECRET`
> 在开发模式下,只有Threads测试者可以连接。提交Meta应用审查(`threads_basic` + `threads_content_publish`)以获取公共访问权限。
### Instagram
1. 将 Instagram 产品添加到您的 Meta 应用中
2. 将 OAuth 重定向 URI 设置为 `https://your-domain/auth/instagram/callback`
3. 需要一个 **专业**(企业或创作者)Instagram 账户
### LinkedIn
1. 在 [developer.linkedin.com](https://developer.linkedin.com) 上创建一个应用
2. 添加 **分享到 LinkedIn** 和 **使用 OpenID Connect 登录 LinkedIn** 产品
3. 将重定向 URI 设置为 `https://your-domain/auth/linkedin/callback`
### Mastodon
1. 登录到您的 Mastodon 实例 → 设置 → 开发 → 新应用程序
2. 作用域:`read:accounts`、`write:statuses`、`write:media`
3. 将重定向 URI 设置为 `https://your-domain/auth/mastodon/callback`
> 适用于任何 Mastodon 兼容实例 mastodon.social, fosstodon.org, hachyderm.io 等。
### YouTube
1. 在 [Google Cloud Console](https://console.cloud.google.com) 上创建一个项目
2. 启用 YouTube Data API v3
3. 创建 OAuth 2.0 凭证;将重定向 URI 设置为 `http://localhost:3001/auth/youtube/callback`
> Google 要求生产环境应用验证。验证前,刷新令牌在 7 天后过期。
### Facebook 页面
1. 使用与 Threads/Instagram 相同的 Meta 应用
2. 添加 **管理您的页面** 使用场景
3. 将重定向 URI 设置为 `https://your-domain/auth/facebook/callback`
4. 需要一个 **Facebook 页面**;个人资料不支持 Graph API
> 第一条评论支持需要 `pages_manage_engagement`(待 Meta 应用审核)。
### Pinterest
1. 在 [developers.pinterest.com](https://developers.pinterest.com) 上创建一个应用
2. 启用作用域:`boards:read`、`pins:read`、`pins:write`、`user_accounts:read`
3. 将重定向 URI 设置为 `https://your-domain/auth/pinterest/callback`
4. 在 `.env` 中设置 `PINTEREST_CLIENT_ID` 和 `PINTEREST_CLIENT_SECRET`
**试用访问(默认):** 新应用获得试用访问权限,只能在沙盒中创建 Pin。
- 设置 `PINTEREST_SANDBOX=true`
- 生成沙盒令牌:我的应用 → 管理 → 生成访问令牌 → 沙盒
- 将 `PINTEREST_SANDBOX_TOKEN` 设置为该令牌
**标准访问(生产):** 在 developers.pinterest.com → 我的应用 → 请求升级访问权限。获得批准后,设置 `PINTEREST_SANDBOX=false` 并删除 `PINTEREST_SANDBOX_TOKEN`。用户通过正常 OAuth 连接。
> 以用户的第一个板块发布 Pin。需要图片;没有图片的帖子在 UI 级别被阻止。
### X(Twitter)
1. 在 [developer.x.com](https://developer.x.com) 上创建一个项目 + 应用
2. 将应用权限设置为 **读取和写入**
3. 启用 **OAuth 1.0a** 并将回调 URL 设置为 `https://your-domain/auth/twitter/callback`
4. 将 API 密钥和 API 密钥秘密复制到 `X_API_KEY` / `X_API_SECRET`
> 需要启用计费的 Pro 或 Team 计划。使用 OAuth 1.0a 而不是 OAuth 2.0。
### Telegram
不需要 OAuth — 直接使用 Telegram Bot API。
1. 打开 Telegram 并消息 **@BotFather** → `/newbot` → 按照提示获取 **机器人令牌**
2. 创建一个 Telegram **频道**(公开或私有)
3. 将您的机器人添加到频道中作为 **管理员**,至少具有 **发送消息** 权限
4. 进入 Posthive 中的 **账户** → **连接 Telegram 频道**
5. 粘贴机器人令牌和您的频道用户名(例如 `@mychannel`)或数字聊天 ID(例如 `-1001234567890`)
> 私有频道:使用数字聊天 ID。将频道中的任意消息转发到 [@userinfobot](https://t.me/userinfobot) 以获取。
### Nostr
不需要 OAuth,不需要应用注册 — 直接使用您的密钥对。
1. 进入 Posthive 中的 **账户** → **连接 Nostr**
2. 粘贴您的 `nsec1...` 私钥 — 或点击 **生成新密钥对** 以创建新的密钥对
3. 从中继自动获取您的个人资料名称和照片
> 您的 `nsec` 以 AES-256-GCM 加密存储,永不暴露。帖子发布为 **Kind 1 notes** 到四个默认中继(Damus、Nostr.band、nos.lol、Snort)。图片作为 URL 附加在笔记内容中,并使用 NIP-92 imeta 标记客户端支持内联渲染。
不需要环境变量。
---
## 批量 CSV 调度
上传 CSV 以一次性调度多个帖子。从 **帖子** 页面(批量按钮)和 **撰写** 页面(批量 CSV 按钮)可用。
**CSV 格式:**
```
scheduled_for,text,accounts,comment,image_urls
2026-08-01 09:00,Good morning 🌅,all,,
2026-08-02 14:30,Blog post link,bluesky|mastodon,Link in first comment,
2026-08-03 18:00,Skip Instagram today,!instagram,,
2026-08-04 10:00,With an image,linkedin,,https://example.com/image.jpg
2026-08-05 12:00,Two images,bluesky|threads,,https://img1.jpg;https://img2.jpg
```
**账户列语法:**
- `all` - 所有连接的账户,除了 YouTube
- `bluesky|mastodon` - 特定平台,用管道分隔
- `!instagram` - 所有平台,除了 Instagram(和 YouTube)
- `all|!instagram|!linkedin` - 所有平台,除了 Instagram 和 LinkedIn
> YouTube 不支持批量调度;需要视频文件。使用撰写代替。
> Instagram 行必须至少包含一个图片 URL。
---
## 调度工作原理
1. 在撰写中编写帖子,选择账户,设置时间
2. API 在数据库中创建 `PostJob` 并排队 BullMQ 延迟作业
3. 在调度时间,BullMQ 触发作业(约 1 秒精度)
4. 工作器独立处理每个平台:
- 需要时刷新 OAuth 令牌
- 发布主要内容
- 发布第一个评论为回复(如果提供)
5. 每个步骤在继续之前持久化,崩溃安全且可恢复
6. 通过帖子页面的服务器发送事件实时更新状态
### 作业状态机(每个 PostJobTarget)
```
pending → running → post_done → comment_done (= done)
↘ post_failed
↘ comment_failed
```
---
## 帖子模板
在撰写页面保存和重用帖子草稿:
1. 编写帖子并点击 **+ 保存** 在帖子部分标题中
2. 给它一个名称(必须唯一)
3. 点击 **模板** 打开下拉菜单并加载任何已保存的模板
4. 悬停模板并点击 **✕** 删除它
模板保存:帖子文本、第一个评论、YouTube 标题/描述/类型和 Pinterest 标题/描述。
---
## API 参考
Posthive 为 Pro 和 Team 计划(或禁用计费时所有用户)包含一个完整的公共 REST API。
**基准 URL:** `https://your-api-domain/api/v1`
**身份验证:** 承载令牌 — 在设置中创建 API 密钥。
```
Authorization: Bearer ph_your_api_key
```
**端点:**
| 方法 | 路径 | 描述 |
| ------ | -------------------- | ------------------------------------------------------- |
| GET | /me | 识别认证用户(用于 CLI/MCP 登录) |
| GET | /accounts | 列出连接的账户 |
| POST | /posts | 调度帖子 |
| GET | /posts | 列出帖子(光标分页) |
| GET | /posts/:id | 获取单个帖子 |
| PATCH | /posts/:id | 更新/重新调度待处理帖子 |
| POST | /posts/:id/approve | 推广草稿到调度 |
| POST | /posts/:id/duplicate | 克隆帖子为新草稿 |
| DELETE | /posts/:id | 删除帖子 |
| POST | /upload | 上传媒体文件 |
| GET | /templates | 列出模板 |
| POST | /templates | 创建模板 |
查看完整 [文档](https://posthive.co/docs) 获取请求/响应模式。
---
## MCP — AI 代理集成
Posthive 暴露一个 MCP(模型上下文协议)服务器,以便 AI 代理可以直接调度和管理帖子。下面每个客户端都使用相同的裸 URL 连接 — 无需生成、复制或粘贴 API 密钥。
**需要:** Pro 或 Team 计划(自托管,禁用计费:无限)· 速率限制:60 req/min
### Claude / ChatGPT(OAuth 连接器,无需安装)
1. **Claude**:设置 → 连接器 → 添加自定义连接器。**ChatGPT**:设置 → 应用 → 高级设置 → 启用开发者模式,然后设置 → 应用 → 添加应用。
2. 输入 `https://your-api/mcp`
3. 在打开的浏览器提示中批准访问权限
### Claude 代码
```bash
claude mcp add --transport http posthive https://your-api/mcp
```
第一个工具调用会打开您的浏览器进行登录。
### Cursor
添加到 `.cursor/mcp.json`:
```json
{
"mcpServers": {
"posthive": { "url": "https://your-api/mcp" }
}
}
```
### VS Code(GitHub Copilot Chat)
添加到 `.vscode/mcp.json`:
```json
{
"servers": {
"posthive": { "type": "http", "url": "https://your-api/mcp" }
}
}
```
### Codex
添加到 `~/.codex/config.toml`:
```toml
[mcp_servers.posthive]
url = "https://your-api/mcp"
```
### OpenClaw
```bash
openclaw mcp set posthive '{"url":"https://your-api/mcp","transport":"streamable-http"}'
```
### Hermes Agent
添加到 `~/.hermes/config.yaml`:
```yaml
mcp_servers:
posthive:
url: "https://your-api/mcp"
```
### 用于 shell 代理的 CLI(OpenClaw、自定义管道、脚本)
并非所有代理都支持 MCP。`posthive-cli` 是一个薄壳包装器,封装了相同的公共 API:
```bash
npx posthive-cli login # 打开您的浏览器,不需要 API 密钥
npx posthive-cli accounts:list
npx posthive-cli posts:create --content "Hello" --accounts acc_1,acc_2
```
每个命令输出结构化 JSON 并附带一个 `SKILL.md` 用于代理自我发现。`posthive-mcp`(npm 发布)与 `~/.posthive/config.json` 共享相同的登录凭证 — 登录一次即可使用两者。
### 回退:在 URL 中嵌入 API 密钥
对于不支持 OAuth 发现的客户端,请直接在 URL 中嵌入密钥:`https://your-api/mcp/ph_your_api_key_here`。请保持此 URL 私有 — 如果泄露,请在设置 → API 密钥中撤销并重新生成。
### 可用工具
| 工具 | 描述 |
| ---------------------- | ------------------------------------------- |
| `list_accounts` | 列出所有连接的社交账户 |
| `create_post` | 创建一个调度的帖子或草稿 |
| `get_post` | 获取单个帖子 ID |
| `list_scheduled_posts` | 列出帖子并可选状态筛选 |
| `approve_draft` | 推广草稿到调度 |
| `update_post` | 更新内容或重新调度待处理帖子 |
| `duplicate_post` | 克隆帖子为新草稿 |
| `delete_post` | 删除帖子 |
| `list_templates` | 列出保存的帖子模板 |
| `create_from_template` | 从模板创建帖子 |
### 通过 MCP 的媒体
MCP 工具接受 `media_urls`(公共 URL 数组)。不支持二进制上传 — 首先通过 `POST /api/v1/upload` 上传文件,并将返回的 URL 传递给 `create_post`。
Instagram `media_type`:`post` · `reel` · `story`
YouTube `youtube_type`:`short` · `video`
---
## 计划
| 计划 | 账户 | 每月帖子 | API 密钥 |
| ------- | -------- | ----------- | --------- |
| 创作者 | 3 | 400 | - |
| 专业版 | 15 | 无限 | 无限 |
| 团队 | 50 | 无限 | 无限 |
所有计划都包含 **14 天免费试用**。由 [Dodo Payments](https://dodopayments.com) 提供支持。
在自托管模式下设置 `ENABLE_BILLING=false` — 所有功能解锁,无计划限制,无 Dodo 账户需求。
---
## 字符限制
| 平台 | 限制 |
| -------------- | ------------------------------- |
| Bluesky | 300 个图形符号 |
| Threads | 500 个字符 |
| Instagram | 2,200 个字符 |
| LinkedIn | 3,000 个字符 |
| Mastodon | 500 个字符 |
| YouTube | 标题:100 · 描述:5,000 |
| Facebook Pages | 63,206 个字符 |
| Pinterest | 标题:100 · 描述:500 |
| X(Twitter) | 280 个字符 |
| Telegram | 4,096 个字符 |
| Nostr | 10,000 个字符 |
---
## 自托管
Posthive 设计用于自托管。计费是可选的。
**无需计费(默认):**
```env
# apps/api/.env
ENABLE_BILLING=false
# apps/web/.env.local
NEXT_PUBLIC_ENABLE_BILLING=false
```
所有功能对所有用户解锁。无需 Dodo 账户。对话跳过计划选择。
**启用计费:
```env
ENABLE_BILLING=true
NEXT_PUBLIC_ENABLE_BILLING=true
```
创建 [Dodo Payments](https://dodopayments.com) 账户并填写所有 `DODO_*` 环境变量。用户注册时可享受 14 天免费试用。
---
## 生产部署
推荐的堆栈:**Railway**(API + Redis)· **Supabase**(Postgres + 存储)· **Vercel**(Next.js)
### 1. Supabase
1. 在 [supabase.com](https://supabase.com) 上创建项目
2. 存储 → 创建一个名为 `media` 的存储桶 → 设置为 **公共**
3. 设置 → 数据库 → 连接字符串 → 会话池(端口 5432)→ 复制 URI
### 2. Railway - API
1. 新项目 → 从 GitHub 部署 → 根目录:`apps/api`
2. 添加 Redis 服务 → 复制私有 URL 作为 `${{ Redis.REDIS_URL }}`
3. 设置环境变量(参见上表)
4. **构建命令:** `npm install && npx prisma generate && npm run build`
5. **启动命令:** `npx prisma migrate deploy && node dist/index.js`
6. 添加自定义域名 → 设置端口为 `3001`
### 3. Vercel - 前端
1. 导入相同的仓库 → 根目录:`apps/web`
2. 添加环境变量:`NEXT_PUBLIC_API_URL` 和 `NEXT_PUBLIC_ENABLE_BILLING`
### 4. 迁移
迁移在部署时通过 `prisma migrate deploy` 自动运行。要在本地创建迁移:
```bash
cd apps/api
npx prisma migrate dev --name describe_your_change
git add prisma/migrations
git commit -m "db: add <describe_your_change> migration"
```
> 在本地运行 `prisma migrate dev` 时,请使用直接连接 URL(而不是连接池)。
---
## 添加新平台
1. 创建 `apps/api/src/adapters/<platform>.ts` 实现 `PlatformAdapter`
2. 在 `apps/api/src/adapters/index.ts` 中注册
3. 在 `apps/api/src/routes/auth.ts` 中添加 OAuth 路由
4. 在 `apps/web/src/app/accounts/page.tsx` 中添加平台卡
5. 在 `apps/web/src/components/PlatformIcon.tsx` 中添加 favicon 域名
6. 在 `apps/web/src/app/compose/page.tsx` 中添加字符限制 `PLATFORM_LIMIT`
---
## 许可证
GNU Affero 通用公共许可证 v3.0,请参阅 [LICENSE](LICENSE) 获取详细信息。
如果您修改此项目并将其作为网络服务运行,您必须使您的修改后的源代码对该服务的用户可用。
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器