mcpField
P
Postlint MCP Server

Postlint MCP Server

本地服务
github.com/conorbronsdon社交媒体04 天前更新

关于 Postlint MCP Server

Postlint MCP Server 通过确定性计数检查社交媒体文案是否符合各平台限制,不需要网络或凭据。它面向准备在 X、Bluesky、LinkedIn、Threads、Mastodon 和 Discord 发布内容的作者与 Agent。

主要功能

  1. 01按单个平台限制检查文案
  2. 02比较文案在多个平台的长度
  3. 03报告计数长度、上限和剩余空间
  4. 04按平台规则计算链接和字素
  5. 05列出限制、计数单位及来源

适用场景

  1. 01发布前验证文案草稿
  2. 02比较链接对不同平台计数的影响
  3. 03检查包含表情符号或复杂字素的文本
  4. 04查看文案剩余字符额度

MCP 相关

该 MCP 服务提供单个平台或所有支持平台的文案检查工具,并可列出平台限制。所有检查均在本地计算,不会发起网络请求。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"conorbronsdon-postlint": {
"command": "npx",
"args": [
"-y",
"@conorbronsdon/postlint-mcp"
]
}
}
}
启动命令npx -y @conorbronsdon/postlint-mcp

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npm@conorbronsdon/postlint-mcp1.1.0

工具

3

收录的工具列表 · 更新于 2 周前

参数类型必填说明
textstring是帖子正文,必须与发布时完全一致。平台会去除首尾空白,因此这里也会去除。`[URL]` 格式的占位符按真实链接计价。
platformenum是要应用规则的平台:x、x_premium、bluesky、linkedin、threads、mastodon、discord。x | x_premium | bluesky | linkedin | threads | mastodon | discord

详细介绍

postlint-mcp

维护模式。 此项目已稳定,仅接收安全修复。暂无新功能计划,但仍欢迎提交问题和拉取请求。

在社交帖子发布前,检查它是否符合平台的实际字符限制。X、Bluesky、LinkedIn、Threads、Mastodon、Discord。纯计算——无需 API、身份验证或网络。

npm version License: Apache 2.0 Node Glama score Podcast X

在终端中检查了三条草稿:一条 X 帖子为 308/280,三个 URL 均按 23 个字符计;一条 Bluesky 帖子为 302/300;以及同一条草稿,其中的链接仍是 [URL] 占位符,长度检查显示为 277,但服务计算出的长度恰好是 300/300

使用 vhs 从 docs/demo.tape 录制。帖子和计数来自 scripts/fixtures.mjs,回归测试也会导入这些内容。


一个只回答一个问题的 MCP 服务:这条帖子是否符合限制?

大模型无法通过观察来计算字符数;在这些平台上,你也做不到。限制并不像表面看起来那样。X 会通过 t.co 将每个 URL 按 23 个字符计费,无论链接有 12 个字符还是 200 个字符。Bluesky 按扩展字素簇计数,因此由四个人组成的家庭表情符号算 1 个,而不是 11 个。Mastodon 不会对远程提及中的域名计费。任何一项算错,都可能导致帖子在发布时被拒绝或截断。

计数正是工具调用的用途。模型无法通过观察来计算,而确定性函数可以精确计算。

为什么会有这个项目。 一条播客推广工作流中有两条帖子超出限制并已发布。一条 Bluesky 帖子为 302,超过 300,下面紧接着写着“少于 300 个字素。审核通过。”一条 X 帖子草稿为 308,超过 280,在发布当天早上本会被拒绝。这两种情况都无法靠目测发现,因为计数只是一个断言,而不是测量结果。两者都已成为此仓库中的回归测试。

工具

工具返回内容
check_post单个平台的判定结果:计数长度、限制、剩余空间,以及影响计数的因素
check_post_all每个平台各一行,仅在未通过的行中附带详细拆分
platform_limits每个平台的限制、计数单位、该单位为何不等同于字符数,以及来源

响应刻意保持简短。对于通过限制的行,check_post_all 会省略计算过程,因为 Agent 每次响应都要消耗 token。

各平台的计数方式

平台限制单位令人意外之处来源
x280加权字符每个 URL 固定计为 23。中日韩文字、韩文和 emoji 各计为 2;拉丁文、希腊文、西里尔文、希伯来文和阿拉伯文各计为 1。一个 emoji 序列计为 1 个单位,即 2,而不是每个码点都计为 2。twitter-text v3 配置
x_premium25,000加权字符计数方式相同,限制更高。X 帮助中心
bluesky300字素国旗、ZWJ emoji、肤色修饰符和组合重音符号各计为 1。URL 按完整长度计数。另有 3,000 UTF-8 字节的上限;包含大量 ZWJ 的文本可能先触及这个上限。atproto 词汇表
linkedin3,000字符3,000 的限制很宽裕;真正的约束是折叠显示。动态会在几行之后折叠,并显示“查看更多”。LinkedIn 帮助
threads500字符2025 年 9 月的改动新增了 10,000 字符的附件。帖子正文仍限制为 500 字符。Meta 新闻室
mastodon500字素URL 计为 23,与 X 相同。对于 @[email protected],只有 @user 会计入。限制由各实例设定,许多服务的限制都更高。Mastodon API 文档
discord2,000字符Nitro 用户为 4,000。嵌入内容另有 6,000 的总限制。Discord 支持

以上每个数字都有已发布的来源。常被反复提及、却没有任何一手来源支持的数字——Facebook 帖子限制、YouTube 社区帖子限制、Reddit 标题上限、Instagram 自然流量帖文说明上限——这里都刻意省略了。无法证明的限制,让检查通过毫无意义。

设置

已发布到 npm。下面的配置代码块使用 npx,首次运行时会自动获取,无需克隆。

git clone https://github.com/conorbronsdon/postlint-mcp.git
cd postlint-mcp
npm install
npm run build
Claude Code

添加到你的 .mcp.json:

{
  "mcpServers": {
    "postlint": {
      "command": "node",
      "args": ["/absolute/path/to/postlint-mcp/dist/index.js"]
    }
  }
}
Claude Desktop

将相同的代码块添加到 claude_desktop_config.json。

Codex

添加到 ~/.codex/config.toml:

[mcp_servers.postlint]
command = "npx"
args = ["-y", "@conorbronsdon/postlint-mcp"]

无需令牌、环境变量或网络访问。软件包发布后,上文所有地方的 node 调用都可以替换为 npx -y @conorbronsdon/postlint-mcp。

验证

询问你的助手:“检查这条帖子是否符合 X 和 Bluesky 的限制”,然后粘贴一条包含几个链接的内容。

示例演示

最初促成这个项目的那条 X 帖子,使用 platform: "x" 调用 check_post 进行检查:

{
  "platform": "x",
  "limit": 280,
  "unit": "weighted characters",
  "length": 308,
  "over": true,
  "remaining": -28,
  "drivers": [
    "3 URLs counted as 23 each = 69",
    "239 other characters counted as 1 each"
  ],
  "warnings": []
}

drivers 这一行最有用。还没写下一个字,就有 69 个字符的预算被链接占用,这说明应该把其中两个链接移到回复里,而不是精简正文。

对同一条帖子调用 check_post_all:

{
  "fits": ["x_premium", "linkedin", "threads", "mastodon", "discord"],
  "over": ["x", "bluesky"],
  "rows": [
    { "platform": "x", "length": 308, "limit": 280, "over": true, "drivers": ["3 URLs counted as 23 each = 69", "239 other characters counted as 1 each"] },
    { "platform": "bluesky", "length": 330, "limit": 300, "over": true, "drivers": ["3 URLs counted in full = 91 (Bluesky does not shorten links)", "239 other graphemes"] },
    { "platform": "mastodon", "length": 308, "limit": 500, "over": false, "remaining": 192 }
  ]
}

同一条帖子,得到三个不同的长度——308、330,又是 308——而文本本身都是 330 个字符。这种差异正是这个工具存在的原因。

草稿占位符

草稿中会包含链接占位符,而 [URL] 只有 5 个字符,真实链接却不止这么长。用占位符测量、再填入链接后发布的帖子,测量结果就是错的;有一份草稿按这种方式测得 264 个字符,发布时却达到 282 个字符。

因此,[URL]、[LINK]、[YOUTUBE URL]、[SUBSTACK URL] 等类似占位符,都会按真实链接计价(即通常发布的最短链接:28 字符的 YouTube 短链接),响应中还会附带警告,说明计数是下限。

不做的事情

  • 不会发布任何内容。 没有写入路径、没有凭据,也不会进行任何网络调用。最后一点有测试保障,而非仅凭声明:测试会将 fetch、XMLHttpRequest 和 WebSocket 替换为抛出异常的实现,并调用每个工具,因此以后若添加网络调用,CI 就会失败,不会让这句话悄然变成谎言。
  • 不会检查实例的实际限制。 Mastodon 服务由各自配置限制;本工具报告默认值 500,并告诉你自行从目标服务读取 configuration.statuses.max_characters。
  • 不会截断内容。 曾考虑添加 truncate_to 辅助函数,但最终没有加入。在字符偏移处截断会拆开 URL、破坏字素簇,还可能截在句子中间;在“安全”的边界截断,则会悄悄删掉恰好位于末尾的分句。无论哪种情况,工具都会替你决定帖子写什么。它只报告数量,编辑留给你。
  • 不会检测平台可能识别的所有 URL。 带协议的链接和以 www. 开头的主机名始终会匹配。裸域名仅在常见顶级域名中匹配(列表位于 src/count.ts),而真实的 twitter-text 实现包含完整的 IANA 注册表。在链接前加上 https://,计数就准确了。
  • 不会计算媒体、投票、引用帖子或链接卡片。 这些各有各的规则,本工具只测量文本。
  • 不会识别内容警告。 在 Mastodon 上,CW 会计入同一个 500 字符限制。本工具只检查正文。
  • 不会提供无法查证来源的限制。 请参阅平台表格。

开发

npm install
npm run build
npm test

测试不会进行网络调用,因为服务本身不会进行网络调用。两个历史超限帖子作为回归测试样例保存在 src/__tests__/lint.test.ts 中,此外还涵盖了 ZWJ 家庭表情符号、区域指示符旗帜、肤色修饰符、组合重音符号和中日韩文字等字素案例。

贡献

欢迎提交问题和拉取请求。新增平台需要三项内容:限制值、计量单位,以及已发布的来源。新增计数规则时,必须提供一个没有该规则就会失败的测试。第三方反复引用的数字不算来源。

关于

由 Conor Bronsdon 创建并维护。我主持 Chain of Thought 播客,探讨 AI 基础设施、开发者工具,以及从业者如何实际使用这些技术。我是在一次工作流本该拦截超限帖子的情况下,连续发布了两条超限帖子后,创建了这个工具。

配套工具:

  • op3-mcp:通过 OP3 获取播客分析数据,包括下载量、地理分布、应用和单集明细。
  • podcastindex-mcp:Podcast Index MCP 服务,可按人物或主题搜索、查看热门节目和订阅源健康状况。
  • substack-mcp:在 Substack 上阅读帖子并管理草稿,适用于 Agent 工作流。
  • Transistor MCP:Transistor.fm 官方 MCP 服务,提供单集、发布和分析功能。
  • ai-tools-for-creators:为以创意为生的人整理的 AI 技能和 MCP 服务精选列表。

更多内容请访问 chainofthought.show 和 X。


免责声明

这是一个独立的个人项目,与任何公司均无关联,也未获得任何公司的赞助或认可。文中所有观点均为我个人观点。

许可证

Apache-2.0

评论

支持 Markdown

第一次接触 MCP?

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

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