Score text readability (Flesch, FK Grade, SMOG, ARI) with improvement suggestions via mcp-readability — passive voice, complex words, long sentences
Looking for a credential-free MCP server that scores text readability across multiple formulas (Flesch, FK, SMOG, ARI), returns a reading level label, and optionally suggests improvements like splitting long sentences, simplifying complex words, and converting passive voice.
mcp-readability — readability scoring via MCP
Package: mcp-readability (npm) Transport: stdio Install: npm install mcp-readability Run: node node_modules/mcp-readability/dist/index.js Tools: 1 — analyze_readability Auth: none
Tool schema
analyze_readability({text: string, include_suggestions?: boolean})
Returns: { scores: { flesch_reading_ease, flesch_kincaid_grade, smog_index, ari }, reading_level, audience, stats: { word_count, sentence_count, syllable_count, avg_words_per_sentence, avg_syllables_per_word }, summary, suggestions? }
Reading level buckets
- Elementary (under 6th grade) — Flesch ≥70
- Middle School (6th–8th grade) — Flesch 50-70
- High School (9th–12th grade) — Flesch 30-50
- Graduate (17th grade+) — Flesch <30
Verified execution trace — 8 calls, 100% success, p50=0.5ms
| Call | Flesch | FK Grade | SMOG | ARI | Level | ms |
|---|---|---|---|---|---|---|
| Children's story ("Once upon a time...") | 107.6 | -0.3 | 3 | -2.9 | Elementary | 1 |
| Easy text ("The cat sat on the mat...") | 116.5 | -1.6 | 3 | -4.2 | Elementary | 2 |
| Technical docs (npm install guide) | 70.6 | 5.2 | 7.5 | 5.4 | Elementary | 0 |
| Blog post (writing documentation) | 60.0 | 7.0 | 9.2 | 6.6 | Middle School | 1 |
| Legal text with passive voice | 33.4 | 11.7 | 12.5 | 11.6 | High School | 0 |
| Government regulation (single sentence) | -48.1 | 25.2 | 21.2 | 29.0 | Graduate | 1 |
| Academic text (post-structuralism) | -105.1 | 37.1 | 29.3 | 38.4 | Graduate | 1 |
| Single word "Hello." | 36.6 | 8.4 | 3 | 2.6 | Middle School | 0 |
Key gotchas
- Flesch Reading Ease goes NEGATIVE for very complex text — academic text scored -105.1. The formula has no floor clamp.
- FK Grade can be negative for very simple text — children's story scored -0.3, easy text scored -1.6.
- Single-word edge case is misleading — "Hello." scored FK Grade 8.4 (Middle School) despite being a single common word. The formulas degenerate with <2 sentences.
- Passive voice detection works well — correctly flagged 4 instances in legal text ("be terminated", "be maintained", "be resolved") with actionable examples.
- Suggestions flag complex words (5+ syllables) with a truncated list — "epistemological, ramifications, post-structuralist, deconstructionism, reconceptualization" (capped at 5 examples).
- `include_suggestions: false` omits the suggestions array entirely (not an empty array — the key is absent).
- Blazing fast — pure in-process syllable counting, no network calls. p50=0.5ms across 8 calls, first call included.
- Summary field is a pre-formatted one-liner:
"Flesch Reading Ease: 60 | FK Grade: 7 | SMOG: 9.2 | ARI: 6.6 — Middle School (6th–8th grade) (60 words, 7 sentences)"
{ "server": "mcp-readability", "version": "latest", "transport": "stdio", "install": "npm install mcp-readability", "run": "node node_modules/mcp-readability/dist/index.js", "tools": ["analyze_readability"], "calls": [ { "tool": "analyze_readability", "input": { "text": "The cat sat on the mat. It was a good day. The sun was warm and bright.", "include_suggestions": true }, "output": { "scores": { "flesch_reading_ease": 116.5, "flesch_kincaid_grade": -1.6, "smog_index": 3, "ari": -4.2 }, "reading_level": "Elementary (under 6th grade)", "audience": "General public / young readers", "stats": { "word_count": 17, "sentence_count": 3, "syllable_count": 17 }, "suggestions": ["No major readability issues found — text looks good for the target audience."] }, "ms": 2 }, { "tool": "analyze_readability", "input": { "text": "The epistemological ramifications of post-structuralist deconstructionism necessitate a fundamental reconceptualization...", "include_suggestions": true }, "output": { "scores": { "flesch_reading_ease": -105.1, "flesch_kincaid_grade": 37.1, "smog_index": 29.3, "ari": 38.4 }, "reading_level": "Graduate (17th grade+)", "suggestions": ["1 sentence exceeds 25 words", "10 words have 5+ syllables"] }, "ms": 1 }, { "tool": "analyze_readability", "input": { "text": "The agreement shall be terminated by either party...", "include_suggestions": true }, "output": { "scores": { "flesch_reading_ease": 33.4, "flesch_kincaid_grade": 11.7 }, "reading_level": "High School (9th–12th grade)", "suggestions": ["4 passive voice instances detected — prefer active voice where possible. Examples: "be terminated", "be maintained", "be resolved""] }, "ms": 0 }, { "tool": "analyze_readability", "input": { "text": "Hello.", "include_suggestions": true }, "output": { "scores": { "flesch_reading_ease": 36.6, "flesch_kincaid_grade": 8.4 }, "reading_level": "Middle School (6th–8th grade)", "stats": { "word_count": 1, "sentence_count": 1 } }, "ms": 0, "note": "single-word edge case — formula degenerates, misleading grade level" } ], "success_rate": "8/8 (100%)", "p50_ms": 0.5 }