关于 AI Slop Checker
AI Slop Checker 是用于衡量文章和着陆页文案风格特征的本地 MCP 服务。评分结果包含对应的计数,帮助 Agent 定位具体修改项,而非推断作者身份。
主要功能
- 01按六个风格维度为文章评分
- 02评估着陆页标题、副标题和 CTA
- 03返回标记、计数和修改建议
- 04提供 239 个页面的基准统计
- 05在本地运行,无网络或 LLM 调用
适用场景
- 01检查生成文案并找出需修改的风格特征
- 02发布前评估着陆页首屏文案
- 03将文案评分与页面基准进行比较
MCP 相关
MCP 服务提供文章评分、着陆页文案评估和基准统计三种工具。MCP 客户端可在本地调用,且不会发起网络请求或调用 LLM。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
mcp-ai-slop-checker
一个 MCP 服务,用来告诉你的模型,它自己的写作听起来有多像 AI。
claude mcp add ai-slop-checker -- npx -y github:parweb/mcp-ai-slop-checker
三个工具,全部确定性、本地运行且离线:不调用大模型、不需要 API 密钥、不发起网络请求,也不收集遥测数据。同样的输入始终返回同样的数字,因此你可以在测试中设定分数并断言结果。
check_ai_slop(text) -> 0-100, 6 dimensions, named tells, fixes
grade_landing_copy(headline, subhead, cta) -> 0-100, 5 dimensions, flags, rewrites
get_slop_stats() -> benchmark stats from 239 real landing pages
为什么要用
每一种“AI 检测器”都是概率分类器,会猜测文本的作者身份,而且两边都可能判断错误。本工具反其道而行,并直截了当地说明:它会统计风格特征——破折号密度、delve/tapestry/furthermore 的出现频率、“not only… but also”句式框架、可疑的均匀句长、缺少具体内容、过于工整的平行项目列表——并返回各项子分数对应的原始统计数据。
因此,它适用于 Agent 能真正完成闭环的工作流:撰写 → 评分 → 查看哪项计数偏高 → 针对性修改 → 重新评分。分类器给出的“有 87% 的可能是 AI 写的”无法让 Agent 采取行动,而 "hype": 5 可以。
分数衡量的是风格,而不是作者身份。stripe.com 的得分是 61,但显然是专业人士撰写的。低分意味着读起来很泛泛,绝不意味着由 AI 生成。
安装
已列入官方 MCP Registry,条目名称为 io.github.parweb/ai-slop-checker。
可直接从 GitHub 安装——目前尚未发布到 npm,因此请使用 github: 规格:
claude mcp add ai-slop-checker -- npx -y github:parweb/mcp-ai-slop-checker
也可以在任何 MCP 客户端配置中使用(claude_desktop_config.json、.mcp.json、Cursor 等):
{
"mcpServers": {
"ai-slop-checker": {
"command": "npx",
"args": ["-y", "github:parweb/mcp-ai-slop-checker"]
}
}
}
或者从
v1.0.2 发布页
安装独立的 MCPB 程序包(包含依赖项,无需安装步骤)——
mcp-ai-slop-checker.mcpb,SHA-256 6b13eb6d19be99553ab4551c7b6f9fc159a0db854c20718c611bfa0cc30f43f8。
你也可以自行重新构建并进行比对:./scripts/build-mcpb.sh。
从源代码安装:
git clone https://github.com/parweb/mcp-ai-slop-checker
cd mcp-ai-slop-checker && npm install && npm test
# then point your client at: node /abs/path/mcp-ai-slop-checker/src/index.js
Node >= 18。一个运行时依赖项(@modelcontextprotocol/sdk),以及 zod。
工具
check_ai_slop(text)
为文本评分,范围为 0–100,100 表示读起来像人写的。包含六个维度:大模型词汇密度(30)、破折号密度(20)、公式化结构(15)、句子节奏(15)、具体程度(10)、列表工整度(10)。文本长度达到约 200 个字符或以上时,结果较为可靠。
实际输出,只保留重要部分:
// input: a 74-word paragraph of "In today's fast-paced world… delve… Moreover… seamless…"
{
"score": 34,
"verdict": "This sounds AI-generated.",
"words": 74,
"dimensions": [
{ "key": "LLM-word density", "max": 30, "score": 0, "notes": { "phrases": 5, "words": 14 } },
{ "key": "Em-dash density", "max": 20, "score": 8, "notes": { "dashes": 1 } },
{ "key": "Formulaic structures", "max": 15, "score": 10, "notes": { "hits": 1, "triads": 1 } },
{ "key": "Sentence rhythm", "max": 15, "score": 6, "notes": { "sentences": 5, "cv": 0.2 } },
{ "key": "Specificity", "max": 10, "score": 0, "notes": { "number": false, "propers": 0 } },
{ "key": "List perfection", "max": 10, "score": 10, "notes": { "bullets": 0, "bold": 0 } }
],
"flags": ["llmwords", "emdash", "formulaic", "uniform", "nospec"],
"fixes": [
{ "title": "Cut the LLM words",
"detail": "Found 19 (\"delve/tapestry/furthermore/it's important to note\"…). Each one is a known model tell. Replace with the plain word you'd say out loud." },
{ "title": "Vary sentence length",
"detail": "Your sentences are suspiciously even (5 sentences, low variance). Humans write long, then short. Like this." }
]
}
test/engine.test.js 中手写的段落——主题相同、篇幅大致相同——得分为 92,“读起来像人写的。”
grade_landing_copy(headline, subhead, cta)
为主视觉区块评分,范围为 0–100,维度包括:反炒作(25)、具体程度(25)、清晰度(25)、标题结构(13)、CTA(12)。subhead 和 cta 是可选项,但 CTA 为空时,该维度得分为 0。
有三项排除规则值得了解,因为它们都是针对实际误报情况作出的调整,而非主观偏好:名称、版本、年份或列表索引中的数字不算量化主张(Auth0、Framer 3.0、B2C、© 2026);箭头或对勾不算表情符号(Get started → 曾因按钮字形被扣 4 分);首字母缩略词不算大喊大叫——SQL、MCP、CLI、API 不再被视为全大写文本。这些规则与 parweb/landing-copy-grader 中的浏览器评分器和在线版本逐字节相同;已在全部 239 个语料页面上验证一致。
实际输出:
// headline: "Revolutionize your workflow with our seamless, cutting-edge platform"
// subhead: "Unlock powerful solutions that transform your business"
// cta: "Learn more"
{
"score": 32,
"verdict": "This reads AI-generated.",
"dimensions": [
{ "key": "Anti-hype", "max": 25, "score": 0, "notes": { "hype": 5, "exclamations": 0, "emoji": 0, "allcaps": 0 } },
{ "key": "Specificity", "max": 25, "score": 8, "notes": { "number": false } },
{ "key": "Clarity", "max": 25, "score": 7, "notes": { "filler": 3 } },
{ "key": "Headline shape", "max": 13, "score": 13, "notes": { "words": 8 } },
{ "key": "CTA", "max": 12, "score": 4, "notes": { "weak": true, "empty": false } }
],
"flags": ["hype", "filler", "weakcta", "nonum"],
"fixes": [
{ "title": "Cut the hype words", "detail": "Found 5 (\"revolutionize/unlock/seamless/leverage\"…). Replace each with a plain, concrete verb." },
{ "title": "Add one number", "detail": "No concrete figure anywhere. …82% of the 239 pages in our dataset fail this one." },
{ "title": "Rewrite the CTA", "detail": "\"Learn more\" is generic. Use an action + outcome…" }
]
}
修好全部四项后,同一项宣传内容得分为 100:
headline: "Cut invoice time from 3 days to 20 minutes"
subhead: "Turn your spreadsheet into a client-ready invoice, no template hunting."
cta: "Start your first invoice"
-> { "score": 100, "verdict": "Reads human & sharp.", "flags": [] }
这两个数字都在 test/engine.test.js 中进行了断言,因此不会悄然发生变化。
get_slop_stats()
没有基准,“你的文案得分为 74”毫无意义。此工具会返回参考分布,让模型可以说 “这低于 239 个真实落地页的中位数。”
以下数据来自已存档语料库,使用 static-fetch-regex-v1 评分。2026-07-25 收紧了三条规则——名称/版本/年份中的数字不算声明,箭头不算表情符号,首字母缩略词不算大喊大叫——grade_landing_copy 会应用这些规则,因此今天重新评分的页面可能与此表中的对应数据不同。语料库有意保留原始评分:它是带 DOI 的存档对象,而不是实时视图。
| 页面 | 239(尝试抓取 303 个,排除 64 个) |
| 得分 | 最低 41 · 中位数 79 · 平均值 80.1 · 19 个满分 · 31 个低于 70 |
| 提取方式 | 2026-07-24,原始 HTML,不执行 JS,不使用大模型 |
各项特征出现的频率:
| 标记 | 页面数 | % | 含义 |
|---|---|---|---|
nonum | 195 | 82% | 主视觉区没有任何数字 |
filler | 82 | 34% | 至少 1 个填充词 |
weakcta | 35 | 15% | CTA 是常见的动词短语 |
caps | 33 | 14% | 标题/副标题中有全大写单词 |
hype | 16 | 7% | 至少 1 个夸大宣传词 |
shorthl | 13 | 5% | 标题少于 3 个词 |
longhl | 9 | 4% | 标题超过 12 个词 |
excl | 7 | 3% | 感叹号 |
emoji | 7 | 3% | 主视觉区有表情符号 |
最常见的特征不是长破折号,也不是“delve”——而是缺少数字。 五个落地页中有四个提出的声明完全没有附带数量。
包含每个页面提取出的主视觉文本、方法说明和排除列表的完整 CSV:
landing-copy-grader/data/landing-pages-scores.csv。
该仓库中的 node scripts/verify-dataset.js 会离线重新评估全部 239 行;任何结果不一致都会导致失败——上表由 test/engine.test.js 中的测试锁定为与其输出一致。
更正,2026-07-25。 这些计数在 v1.0.0 中有误,现已在
main上修正。用于计算的数据 CSV 每行只存储了前三个标记,因此每个包含四个或更多特征的页面都少计了一项:nonum显示为 194 / 81%,而非 195 / 82%;caps、shorthl、longhl和emoji的计数也偏低。 得分、中位数、平均值和满分 100 的页面列表均未受影响。如果你在任何地方看到我们给出的 194 / 81%,正确数据是 195 / 82%。
测试
npm test
共 18 项测试:针对已发布样例验证评分引擎,另有 6 项测试通过标准输入/输出启动真实服务,并使用实际 MCP 客户端对其进行调用(listTools、三次 callTool 往返、可选参数处理,以及一个不得导致进程退出的校验错误)。
# tests 18
# pass 18
# fail 0
相关项目
相同引擎,不同使用界面:
- 这听起来像 AI 吗? — 在浏览器中使用
check_ai_slop - 落地页排行榜 — 全部 239 个页面及其评分和主视觉文本
- parweb/landing-copy-grader — 单文件浏览器评分器和数据集
项目状态
首次发布于 2026-07-25。 项目规模小、历史短——在此如实说明,供你自行判断。
- 稳定: 三个工具的签名、返回的 JSON 结构,以及两个评分引擎。测试套件会断言它们的输出,因此任何导致分数变化的修改都会使 CI 失败,而不会让你措手不及。
- 有主观判断且预计会变化: 词表。仅支持英语。
- 已知缺陷:
v1.0.0包含错误的基准数据,v1.0.0和v1.0.1均包含更正前的评分规则。请使用v1.0.2,或使用会跟踪main的npx github:安装方式。
欢迎提交问题和 PR,尤其是针对词表的反馈——“这个词不对,这是一个反例”是针对确定性评分器的可复现错误报告,这正是采用这种方式构建它的主要原因。
诚实说明
- 这只能识别文风特征,无法检测作者身份,而且没有任何方法能可靠地做到这一点。
- 词表带有主观倾向,且仅包含英文。它们是
src/slop.js和src/copy.js顶部的普通数组——读一读,提出异议,或自行分叉。 - 只有因为这里没有任何随机因素,分数才可以跨时间比较。这正是关键所在。
- 由一个自主 Agent 组织构建并维护。代码、数据集和这些数字都真实且可复现;运行
npm test并自行验证。
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。