关于 LinkedIn Content Planner
LinkedIn Content Planner 是供 Agent 使用的 MCP 服务,可起草、修改 LinkedIn 帖子并将其送入人工审核流程。网页界面支持帖子发布前的审核与批准,并通过 OAuth 将访问限制在对应工作区。
主要功能
- 01起草和修改帖子
- 02管理帖子状态与日期
- 03人工审核与批准
- 04评论和版本历史
- 05附件与预览
- 06帖子生命周期 Webhook
适用场景
- 01准备待人工批准的帖子
- 02通过审核评论提出修改
- 03跟踪修订并恢复旧版本
- 04接收帖子状态变更事件
MCP 相关
Streamable HTTP MCP 端点提供帖子、审核、评论、附件、预览和 Webhook 工具。Agent 通过 OAuth 2.1 或工作区专属访问密钥认证,调用范围限于用户所在工作区。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://linkedin-mcp.theona.app/mcpclaude mcp add --transport http app-theona-linkedin-content-planner https://linkedin-mcp.theona.app/mcp{"mcpServers":{"app-theona-linkedin-content-planner":{"type":"http","url":"https://linkedin-mcp.theona.app/mcp"}}}在 Cursor 中打开{"servers":{"app-theona-linkedin-content-planner":{"type":"http","url":"https://linkedin-mcp.theona.app/mcp"}}}在 VS Code 中打开{"mcpServers":{"app-theona-linkedin-content-planner":{"type":"http","url":"https://linkedin-mcp.theona.app/mcp"}}}{"mcpServers":{"app-theona-linkedin-content-planner":{"serverUrl":"https://linkedin-mcp.theona.app/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
详细介绍
LinkedIn 内容规划器(MCP)
专为 AI Agent 打造的 LinkedIn 内容工作流,而不是供人手动在文本框中输入。你的 Agent(Claude Code、Claude Desktop,或任何兼容 MCP 的客户端,无论你通过 cron、Agent 循环还是聊天会话安排它运行)都会直接调用 MCP 工具来起草、排版并将帖子送入审核工作流:create_post、update_post_content、submit_review 等。任何内容发布前,人只需在 Web UI 中审核、评论并批准或要求修改——这就像合并前审核 PR,而不是手动操作排期工具。
开箱即支持多租户和 OAuth 安全机制:Agent 通过规划器自带的 OAuth 2.1 授权服务器进行身份验证(PKCE、动态客户端注册),且每次 MCP 调用都限定在调用者的工作区内。
完整设计请参阅 PLAN.md 和 ARCHITECTURE.md。
本地开发
要求:Node 20+、pnpm、Postgres 16 实例(通过 infra/docker-compose.yml 或本地安装)。
# 1. Start Postgres
docker compose -f infra/docker-compose.yml up -d
# (or point DATABASE_URL at any local Postgres 16 instance)
# 2. Install dependencies
pnpm install
# 3. Configure env
cp apps/server/.env.example apps/server/.env
# edit DATABASE_URL if not using the default docker-compose credentials
# 4. Generate + run migrations, seed default workspace
pnpm --filter @linkedin-planner/db generate
DATABASE_URL=postgres://linkedin_planner:linkedin_planner@localhost:5432/linkedin_planner_dev pnpm --filter @linkedin-planner/db migrate
DATABASE_URL=postgres://linkedin_planner:linkedin_planner@localhost:5432/linkedin_planner_dev pnpm --filter @linkedin-planner/db seed
# 5. Run the server
pnpm dev:server
MCP 工具概览
帖子:create_post、list_posts、get_post、update_post_content、str_replace_post_content、set_post_state、set_post_date、delete_post。版本:list_versions、get_version_diff、revert_to_version。审核:submit_review、list_reviews。评论:add_comment、list_comments、resolve_comment。附件:prepare_attachment_upload、attach_file、list_attachments。预览:render_preview。Webhook(订阅帖子生命周期事件):create_webhook、list_webhooks、update_webhook、delete_webhook、list_webhook_deliveries。完整工具架构在 /mcp 端点本身提供;每项工具的设计依据请参阅 PLAN.md。
上传附件
attach_file 会将内容以内联 Base64 形式传入,这只适用于小文件:一张 160 KB 的图片约有 217,000 个 Base64 字符,消耗的上下文超出大多数 Agent 的承受范围,也超出它们能够重新输入且不发生静默损坏的程度。更大的文件需要通过上传凭证处理:
prepare_attachment_upload(postId, filename, mimeType)
-> { uploadUrl, method: "PUT", expiresAt, maxBytes }
curl -T ./carousel.pdf '<uploadUrl>' # bytes never enter the conversation
list_attachments(postId) # confirm it landed
该 URL 内含 HMAC 签名凭证,限定用于对应的单个帖子,有效期为 15 分钟,过期后会被拒绝。两种方式最终都会调用同一个 attachFile 服务,因此每个文件 25 MB、每个工作区 250 MB 的上限均相同。运行多个实例时请设置 ATTACHMENT_UPLOAD_SECRET;如果未设置,每个进程都会使用自己的随机密钥签名,因此由一个实例生成的凭证无法通过另一个实例的验证。
访问密钥
有些 MCP 客户端无法运行 OAuth 流程,例如 Apify Standby Actor,其 Authorization 请求头已经携带调用者的 Apify 令牌。对于这类客户端,已登录用户可以在 Connect 页面创建长期访问密钥(/connect?label=Apify 会预填表单),客户端则将其作为 Authorization: Bearer planner_mcp_… 发送。
访问密钥会以创建者的身份开放某个工作区的 /mcp,而 /mcp 仍会在每次请求时重新检查该用户的成员资格。存储的只有密钥的 sha256 哈希,因此密钥只会显示一次,之后只能撤销。如果无法访问密钥存储,/mcp 会返回 503 而不是 401,避免持有有效密钥的客户端被告知需要更换密钥。
发现
有两份无需身份验证的文档,可让客户端或 MCP 注册表了解此服务是什么,以及在提供任何凭据之前如何进行身份验证:
| 路径 | 内容 |
|---|---|
/.well-known/mcp.json | 服务卡片:名称、描述、版本、源代码仓库,以及位于 /mcp 的 streamable-http 端点。其格式遵循 MCP 注册表的 server.json schema,因此此处提供的字节内容,就是发布到注册表时提交的字节内容。身份验证方案通过 _meta 中注册表的反向 DNS 键提供,因为 server.json 没有专门的字段来存放此信息。 |
/.well-known/oauth-protected-resource/mcp | RFC 9728 受保护资源元数据:资源标识符、授权服务器,以及唯一的 planner:agents 范围。这是 /mcp 的 401 WWW-Authenticate 标头指向的内容,并且始终以它为准——卡片只提供指引。 |
无论何种配置,服务都会提供卡片;如果未设置 AUTH_ENABLED,卡片会声明 authorization: { type: "none" },且不会注册 PRM,因为它所指向的 OAuth 授权服务器也未挂载。这两份文档都基于 APP_PUBLIC_BASE_URL 生成,令牌检查也会使用同一值校验 aud。
服务的名称和版本定义在 apps/server/src/mcp/identity.ts 中,并用于卡片和 MCP initialize 响应的 serverInfo 块,因此注册表中的条目不会与已连接客户端看到的信息不一致。
发布到注册表
已作为 app.theona/linkedin-content-planner 列入官方 MCP 注册表。该命名空间是 theona.app 的反向 DNS 名称,并通过该域名顶点上的 Ed25519 TXT 记录证明所有权;私钥部分是 MCP_REGISTRY_DNS_KEY,除此之外不会存放在任何地方。轮换只需生成一对新密钥、编辑一条 TXT 记录、替换一个密钥——因此该密钥无需托管备份;如有任何疑虑,应通过轮换密钥来解决,而不是调查。
它是 mcp-registry 上的环境密钥,而不是仓库密钥。任何有写入权限的人添加的工作流都可以读取仓库密钥;而此密钥只会提供给声明该环境并满足其规则的作业——必须由指定审核者批准,且部署仅限于 v* 标签。因此,推送标签不会直接发布:它会启动一个等待人工批准的运行。
在部署新版本后,推送一次 v<version> 标签即可发布。Publish to MCP Registry 工作流会从生产环境获取 /.well-known/mcp.json 并提交这些字节内容;此仓库中不会另行重述卡片,因此不存在第二份可能不一致的副本。发布顺序很重要,工作流会强制执行:如果标签版本与已部署服务报告的版本不符,运行就会失败,而不会将上一版本的卡片以新版本的名称发布。先部署,再打标签。
Monorepo 布局
apps/server— REST API + MCP 服务(/mcp上的 Streamable HTTP),同一进程,共用核心逻辑。apps/web— React 界面:待办列表、日历、帖子审核。packages/core— REST 和 MCP 共用的领域类型与服务层。packages/formatting— Markdown 子集 ⇄ LinkedIn Unicode 格式转换。packages/db— Drizzle ORM schema 和迁移。
许可证
PolyForm Noncommercial License 1.0.0。源码可见,但不是 OSI 认可的开源软件:可免费用于任何非商业用途,包括使用、修改和自托管;任何商业或付费用途都需要从 Theona, Inc. 获取单独许可。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。