关于 Postlint MCP Server
Postlint MCP Server 通过确定性计数检查社交媒体文案是否符合各平台限制,不需要网络或凭据。它面向准备在 X、Bluesky、LinkedIn、Threads、Mastodon 和 Discord 发布内容的作者与 Agent。
主要功能
- 01按单个平台限制检查文案
- 02比较文案在多个平台的长度
- 03报告计数长度、上限和剩余空间
- 04按平台规则计算链接和字素
- 05列出限制、计数单位及来源
适用场景
- 01发布前验证文案草稿
- 02比较链接对不同平台计数的影响
- 03检查包含表情符号或复杂字素的文本
- 04查看文案剩余字符额度
MCP 相关
该 MCP 服务提供单个平台或所有支持平台的文案检查工具,并可列出平台限制。所有检查均在本地计算,不会发起网络请求。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
3收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| text | string | 是 | 帖子正文,必须与发布时完全一致。平台会去除首尾空白,因此这里也会去除。`[URL]` 格式的占位符按真实链接计价。 |
| platform | enum | 是 | 要应用规则的平台: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、身份验证或网络。
使用 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。
各平台的计数方式
| 平台 | 限制 | 单位 | 令人意外之处 | 来源 |
|---|---|---|---|---|
x | 280 | 加权字符 | 每个 URL 固定计为 23。中日韩文字、韩文和 emoji 各计为 2;拉丁文、希腊文、西里尔文、希伯来文和阿拉伯文各计为 1。一个 emoji 序列计为 1 个单位,即 2,而不是每个码点都计为 2。 | twitter-text v3 配置 |
x_premium | 25,000 | 加权字符 | 计数方式相同,限制更高。 | X 帮助中心 |
bluesky | 300 | 字素 | 国旗、ZWJ emoji、肤色修饰符和组合重音符号各计为 1。URL 按完整长度计数。另有 3,000 UTF-8 字节的上限;包含大量 ZWJ 的文本可能先触及这个上限。 | atproto 词汇表 |
linkedin | 3,000 | 字符 | 3,000 的限制很宽裕;真正的约束是折叠显示。动态会在几行之后折叠,并显示“查看更多”。 | LinkedIn 帮助 |
threads | 500 | 字符 | 2025 年 9 月的改动新增了 10,000 字符的附件。帖子正文仍限制为 500 字符。 | Meta 新闻室 |
mastodon | 500 | 字素 | URL 计为 23,与 X 相同。对于 @[email protected],只有 @user 会计入。限制由各实例设定,许多服务的限制都更高。 | Mastodon API 文档 |
discord | 2,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
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。