
Promptlint MCP
io.github.sean-sunagakuPublished by GitHub account sean-sunagakuv0.1.3Updated Oct 24, 2026
Static linter for AI prompts: contradictions, redundancy, ambiguity, and fluff.
Overview
Lints English AI prompts for contradictions, redundancy, ambiguity, and filler, and can return a trimmed version to save tokens.
- What you can do
- A static analyzer for English prose prompts such as system prompts, agent instructions, and tool descriptions. It exposes two tools: lint_prompt, which returns a one-line summary plus full JSON with a score, issues, and token counts, and trim_prompt, which returns a shortened prompt plus a savings footer. Rules cover paired opposing directives, near-duplicate sentences, oversized fenced code examples, ambiguous pronouns, and politeness filler. Both tools are pure and stateless.
- When to use it
- Useful when writing or reviewing system prompts and agent instructions and you want to catch silently contradictory or padded wording before sending them. Also handy for reclaiming tokens from verbose prompts. It is not a code linter and only handles English prose.
- Requirements
- Node.js 18 or newer. Runs as a local stdio process, typically launched with npx -y promptlint-mcp or a global install. No accounts, API keys, environment variables, or headers are declared, and the tools use no network or filesystem access.
Installation
In SourceWeft
- Open Promptlint MCP in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
promptlint-mcp
[npm] [npm downloads] [GitHub stars] [MIT License] [Node 18+] [MCP compatible]
Lint AI prompts like code. Save tokens. Catch contradictions.
A static analyzer for AI prompts — system prompts, agent instructions, tool descriptions — that runs as a CLI and as an MCP server so Claude Code (or any MCP-aware agent) can lint prompts before sending them.
Quick demo
Run promptlint on a typical (silently broken) system prompt:
Two error-level contradictions caught, score clamped to 14/100, 60 tokens (16%) reclaimable via --trim.
And here's --trim in action on a small input:
See docs/promo/ for posting drafts and the (TODO) asciinema cast.
Why
- Contradictions:
"be concise"+"be thorough"ships silently and wastes tokens on every request. promptlint flags paired opposites (length / tone / frequency / commenting / asking) aserror. - Redundancy: near-duplicate sentences (Jaccard > 0.6) get one
warnapiece — delete one. - Ambiguous pronouns:
"use it"/"handle that"without a mid-sentence referent is flagged with a line number. Start-of-sentence capitals do NOT count as referents, so normal English doesn't false-positive. - Long code examples: fenced code blocks over ~1200 chars or 30 lines
trigger a
warn— examples are almost always trimmable to shape-only. - Politeness fluff:
Please/Thanks/I hope this helps/Let me know if…/Feel free to…are detected, counted, and (with--trim) stripped while keeping your actual imperatives intact.
Scope: English prompts, prose — not source code. A Japanese prompt or a file of JavaScript will look clean even if it isn't.
Install
Install both the CLI and the MCP server in one go:
Two binaries are placed on your $PATH:
Run without installing
From source (hacking on it)
Requires Node >= 18. Zero runtime deps other than the MCP SDK.
CLI usage
Default human report
A clean prompt (see examples/good-prompt.md) returns score 100/100 with
zero issues — silence is a feature.
--json for machine consumption
Empty input adds "note": "empty input". Pure-fluff input (e.g. "Thanks!")
that would otherwise trim to empty instead returns the original with
"trimmerFallback": true — a safe drop-in never hands a blank prompt to your
LLM.
--trim to print trimmed output (for piping)
Fenced code blocks are preserved verbatim. Quoted strings ("…") and inline
backticks (`…`) are masked before fluff removal so example text survives
untouched.
Stdin
The report header shows promptlint <stdin>.
Other flags
Exit codes
MCP server usage
Register with Claude Code in one command (no clone, no global install needed):
Or add this to ~/.claude.json (user scope) or project .mcp.json
(project scope):
If you've globally installed the package, the absolute-path form also works
and skips npx's first-run download:
Tools exposed
Both tools are pure / idempotent. No network, no filesystem, no state.
Rules
Score formula: 100 - (errors*25 + warns*10 + infos*3), then clamped to <=59
if any error exists and <=79 if 2+ warnings exist. Severity ceilings are a
traffic-light: any error = red zone, regardless of count.
Pricing & Roadmap
Free (OSS, MIT)
- CLI (
node src/cli.mjs) — all three modes (report / JSON / trim), all 5 rules. - MCP server (
node src/mcp.mjs) — both tools, unlimited use. - No account, no telemetry, no network.
Pro (planned, $9/mo)
- Team-shared custom rule dictionary (your project's bannned phrases, required headers, forbidden contradictions).
- Per-project lint history with diff view.
- Cross-project token-savings dashboard ("your team saved 1.2M tokens this month").
Pro is not shipped yet. No signup form today — 👍 the early-access issue (#1) to register interest. We DM invites in 👍 order.
Development
Smoke test
Expected: exit 1 (2 error contradictions), score in the low teens, all
rules firing. If this drifts, a rule regressed.
Baseline
examples/good-prompt.md must always score 100/100 with 0 issues. If
a change breaks that, the change is wrong.
Adding a rule
Rules live in src/linter.mjs. Each rule is a plain function:
Add it to the issues array inside lint() and append its ID to the RULES
export. If it targets prose (not code), run it against the maskCodeBlocks()
copy so fenced examples don't trigger it. If it needs sentence splitting,
reuse splitSentences (quote-aware) or splitSentencesPreservingDelims
(quote-aware, keeps delimiters for the trimmer).
Contradictions
Extend CONTRADICTION_PAIRS at the top of src/linter.mjs. Each entry is:
Existing labels: length, tone, frequency, prohibition, commenting,
asking.
Community
- 💬 Discussions — questions, ideas, prompt war stories
- 🐛 Issues — bugs, feature requests
- ⭐ Star the repo if it saves you tokens — discovery helps other AI users find it.
How this was built
This package was produced end-to-end by two AI agent teams:
- ai-auto-improve-app — built and polished the product. Customer AI uses the tool and writes feedback → Developer AI patches the code → repeat. Each round's commit (
round-001…round-003) is the developer-AI's response to that round's customer-AI feedback. - ai-launch-team — published and distributed it. 5 sub-agents handled npm publish, GitHub Release, awesome-mcp PRs, Discussions threads, social copy drafts, and SVG/PNG asset generation.
Combined, this took the product from "empty repo" to "v0.1.2 on npm + 2 awesome-mcp PRs + 2 Discussions seed threads + 4 Issues + full social drafts" with the only manual step being the platform-mandated SMS / OTP authentications (X account creation, npm 2FA setup) — the rest was AI.
License
MIT — see LICENSE.
Source: README.md at commit 8a31da8
Tools
0Version history
1- v0.1.3LatestSep 16, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts