mcpField
L
LinkedIn Content Planner

LinkedIn Content Planner

远程服务
linkedin-mcp.theona.app社交媒体06 周前更新

关于 LinkedIn Content Planner

LinkedIn Content Planner 是供 Agent 使用的 MCP 服务,可起草、修改 LinkedIn 帖子并将其送入人工审核流程。网页界面支持帖子发布前的审核与批准,并通过 OAuth 将访问限制在对应工作区。

主要功能

  1. 01起草和修改帖子
  2. 02管理帖子状态与日期
  3. 03人工审核与批准
  4. 04评论和版本历史
  5. 05附件与预览
  6. 06帖子生命周期 Webhook

适用场景

  1. 01准备待人工批准的帖子
  2. 02通过审核评论提出修改
  3. 03跟踪修订并恢复旧版本
  4. 04接收帖子状态变更事件

MCP 相关

Streamable HTTP MCP 端点提供帖子、审核、评论、附件、预览和 Webhook 工具。Agent 通过 OAuth 2.1 或工作区专属访问密钥认证,调用范围限于用户所在工作区。

配置

远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。

服务地址https://linkedin-mcp.theona.app/mcp
一键复制安装命令
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

命令在终端中运行;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/mcpRFC 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. 获取单独许可。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。