Context7
Up-to-date docs for AI agents
作者提供的说明(英文原文)
Deterministic prose linter for LLM text — flags AI slop, filler, buzzwords, hedges, clichés.
这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。
我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。
选择你使用的 AI 应用,然后复制设置。
你需要
你用的是哪个应用?
在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。
打开 Claude Desktop → Settings → Developer → Edit Config,把下面的内容粘贴到 claude_desktop_config.json
{
"mcpServers": {
"defluff": {
"command": "uvx",
"args": [
"defluff",
"defluff-mcp"
]
}
}
}在终端中运行这条命令
claude mcp add defluff -- uvx defluff defluff-mcp粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"defluff": {
"command": "uvx",
"args": [
"defluff",
"defluff-mcp"
]
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"defluff": {
"type": "stdio",
"command": "uvx",
"args": [
"defluff",
"defluff-mcp"
]
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
这个服务器在你的电脑上运行,而 ChatGPT 只能连接互联网上的服务器。请选择其他应用。
你的选择通过 Cookie 保存在这台设备上,无需账户。
这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
它在你的电脑上运行;安装后,工具列表会显示在你的 AI 应用中。
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月7日
注册名称已通过 GitHub 账户 ahmedak 验证,该账户拥有此仓库
我们还没有从 GitHub 读取这个仓库
我们还没有从 GitHub 读取这个仓库
它在你的电脑上运行,没有互联网端点
在你的电脑上运行,改用本地设置
它在你的电脑上运行;我们只能读取互联网端点的工具列表
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
注册中心没有列出必需的密钥,不过有些服务器会在首次使用时要求你登录。
它在你的电脑上运行。你的 AI 应用会在需要时启动它,数据不会经过作者的服务器(除非它自己调用在线服务)。
GitHub 仓库最后更新于–,最新版本(0.1.2)于5个月前进入注册中心。
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。你的电脑上还需要有 Python (uv)。
同一分类中有:Context7, Codebase Memory, Exa
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i
Up-to-date docs for AI agents
Codebase knowledge graph for AI agents — 162 languages, sub-ms queries, 99% fewer tokens.
Connect AI agents to Exa for web search, content fetching, and multi-step research.
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
*The deterministic slop check for AI-generated prose. Point it at a changelog, a doc, or an agent's own output and get back the filler phrases to cut — plus a CI exit code and a pinnable score, identical on every run. No model, no API key.*
Every flagged span carries no information, so cutting them loses nothing. Clean text, same tool, passes straight through:
What makes defluff worth installing over a one-off grep is the engine around the list: bring your own phrases, per-project overlays, and an MCP server your agents pick up with no wiring.
pip install defluff
Or on macOS/Linux via Homebrew:
brew install ahmedak/defluff/defluff
That's it. No model download. No API key. Runs anywhere Python does.
# Lint a file — exit 1 on slop, 0 when clean
defluff lint essay.md
cat draft.md | defluff lint
defluff score essay.md
defluff lint essay.md --json
Exposes three tools so any MCP-aware agent can self-check prose without bespoke wiring — including its own draft, before returning it.
Zero-install via uvx (recommended) — pulls the package and the mcp extra on first run:
{
"mcpServers": { "defluff": { "command": "uvx", "args": ["--from", "defluff[mcp]", "defluff-mcp"] } } }
Or install it and run the entry point directly:
pip install "defluff[mcp]"
defluff-mcp
{
"mcpServers": { "defluff": { "command": "defluff-mcp" } } }
Published to the MCP Registry as io.github.ahmedak/defluff (see server.json).
mcp-name: io.github.ahmedak/defluff
| Tool | Args | Returns | |
|---|---|---|---|
slop_detect | text: str | slop_score, spans (text, category, weight, offsets), categories, lexicon_version | |
slop_add | `pattern: str, category: str, scope: "user"\ | "project"` | adds a phrase to the lexicon overlay |
slop_ignore | `pattern: str, scope: "user"\ | "project"` | suppresses a phrase (e.g. domain jargon) |
slop_detect on a draft and revise the flagged phrases before returning it. Zero wiring, one session, no second model in the loop.Every "AI detector" tries to classify *whether* text was AI-generated — a hard, unreliable problem. defluff asks a different question: does this text contain removable filler? That's deterministic, and it's true whether a human or an LLM wrote "at the end of the day."
proselint is the closest prior art — deterministic, no model — but emits yes/no warnings rather than a tunable density score, and isn't built around a list you swap, overlay, or pin.
A grep over a word list gives you raw hits. defluff gives you what you'd otherwise have to build around that list:
"foster" won't fire inside "fostering".defluff lint draft.md --lexicon team-slop.md
# team-slop.md
paradigm shift
One phrase per line (# comments and -/* markers ignored). These layer on top of the built-in defaults and report under a neutral custom category. For real categories and per-phrase weights, use a .json list (see Lexicon overlays).
defluff lint post.md --pack marketing-growth
defluff lint post.md --pack marketing-growth,ai-llm # stack several
| Pack | Catches | Pack | Catches |
|---|---|---|---|
corporate-linkedin | office jargon | crypto-web3 | crypto hype |
startup-vc | pitch-deck speak | pr-press-release | press-release boilerplate |
marketing-growth | hype copy | academic | research hedging |
ai-llm | LLM tells | wellness-selfhelp | influencer-speak |
social-media | X/Twitter engagement-bait |
List them with defluff packs. High-false-positive terms (e.g. pivot, detox) ship commented-out so they're inert until you opt in. See the packs README.
~130 curated patterns across five weighted categories, case-insensitive, whole-word matched:
| Category | What it catches | Examples |
|---|---|---|
ai-vocab | Words disproportionately overused by LLMs | *delve, tapestry, nuanced, pivotal, robust, showcase* |
cliche | Hollow idioms that add no information | *at the end of the day, move the needle, circle back, game changer* |
hedge | Empty qualifiers | *it should be noted that, needless to say, basically, essentially* |
corporate | Buzzword inflation | *leverage, synergy, actionable insights, cutting-edge, scalable* |
transition | Filler connectives LLMs reach for by default | *furthermore, moreover, in conclusion, first and foremost* |
Some AI tells are sentence *shapes*, not fixed phrases — the antithesis: it's not X, it's Y, not just a list but a runtime. A regex pattern layer catches these under a rhetoric category:
| Mode | What it looks for | Default | Why |
|---|---|---|---|
| Compound *(confident)* | full shape: it's not X, it's Y · not just X but Y | on | the second clause proves the rhetorical move — rarely a false alarm |
| Fragment *(guessing)* | bare X, not Y — e.g. a signal, not a verdict | off, --pack rhetoric | also fires on plain corrections (shipped Tuesday, not Wednesday) |
Each match counts as one unit toward the score regardless of length. Turning on fragment mode changes the lexicon hash.
defluff lint draft.md # compound antithesis caught by default
defluff lint draft.md --pack rhetoric # also catch the punchy "X, not Y" fragment defluff lint draft.md --category rhetoric # gate CI on antithesis alone
import defluff
report = defluff.detect("It is worth noting that we should leverage synergies.") print(report.slop_score) # 0.0 – 1.0 print(report.spans) # flagged phrase locations + categories
score = defluff.score(text) # bare float clean = defluff.is_slop(text) # bool at default threshold
lex = defluff.load_lexicon() # pin for reproducible runs score = defluff.score(text, lexicon=lex)
SlopReport fields:
| Field | Type | Notes |
|---|---|---|
slop_score | float | Clamped [0, 1] — use for thresholds |
slop_density | float | Raw unclamped — better gradient for reward loops |
spans | list[Span] | Per hit: text, category, weight, char offsets *into the cleaned text* (see Limitations) |
categories | dict[str, float] | Per-category density |
n_words | int | Token count |
low_confidence | bool | True when n_words < 20 |
lexicon_version | str | SHA prefix of resolved entry set |
The bundled lexicon is the baseline; layer on top without editing the package:
# "synergy" is slop on this machine
defluff lexicon add "synergy" --category corporate --scope user
defluff lexicon rm "leverage" --scope project git add .defluff/ignore.json && git commit -m "allow 'leverage' in finance context"
~/.config/defluff/) — machine-wide, not committed.defluff/ at git root) — per-repo, commit it for your whole teamWrites are atomic and cross-process locked; a corrupt overlay is warned and skipped — detect() never crashes.
Every resolved lexicon (bundled + overlays + packs) carries a short content hash, printed on every run (lexicon: 2cc05ba84457) and exposed as SlopReport.lexicon_version. Pass lexicon=defluff.load_lexicon() once and every call scores against the same ruler — pinnable for CI baselines and RL rewards, and auditable since the hash changes if and only if the resolved entry set changes. Each release ships a dated lexicon with a changelog (CHANGELOG.md); ai-vocab is expected to turn over release to release, cliche/hedge/corporate/transition are near-stable.
slop_score = flagged words ÷ total, weighted by category (ai-vocab counts a little more, transition a little less). 0.20 ≈ "a fifth of this text is listed filler." Usually 0.0–1.0; can edge slightly above on text that's almost nothing but slop. Instead of being a quality quantfier, its just a tripwire that drives the CI exit code.Pick a threshold based on how filler-dense the text is *allowed* to be:
--threshold | Meaning | Good for |
|---|---|---|
0.05 | ~5% filler — strict | marketing copy, landing pages, customer-facing text |
0.08 *(default)* | ~8% filler — a tripwire for triage | general prose, blog drafts |
0.12–0.20 | only flag heavy padding | technical docs that legitimately use robust, scalable, in order to |
The default 0.08 is provisional — hand-chosen, not yet calibrated on a labeled corpus (hence the [threshold provisional] tag). For a hard CI gate, set your own threshold and suppress your domain
只显示了开头部分;其余内容请在仓库中阅读