Deterministic offline tool and MCP server to detect filler phrases and clichΓ©s in AI-generated prose with exact spans and scores.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
We haven't yet run this listing's install command through our automated sandbox check. This isn't a red flag β we're steadily working through the catalog.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
Inspect callable tools, capabilities, and parameters exposed to AI agents by Defluff.
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.
Or on macOS/Linux via Homebrew:
That's it. No model download. No API key. Runs anywhere Python does.
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:
Or install it and run the entry point directly:
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".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).
| 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.
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:
Factual signals from GitHub, npm, and our automated checks β not a rating.
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/ahmedak-defluff)<a href="https://allmcps.com/mcp/ahmedak-defluff"><img src="https://allmcps.com/api/badge/ahmedak-defluff?style=directory" alt="Defluff on AllMCPs" /></a>