Writing Style Checker

io.github.theserverlessdevPublished by GitHub account theserverlessdevv2.2.2Updated Oct 26, 2026

Prose linter + AI-slop detector: weasel words, passive voice, hedging, and research-cited AI tells

VerifiedStreamable HTTPWeb executableDeveloper ToolsAI & ML

Overview

AI-generated overview

A prose linter MCP server that flags weasel words, passive voice, hedging, long sentences and research-cited AI tells in text you send it.

What you can do
  • Analyze text for eight writing-style issues (weasel words, passive voice, duplicate words, long sentences, nominalizations, hedging, filler adverbs, AI tells), optionally with a custom config
  • Remove duplicate adjacent words and get back the cleaned text plus the removed words
  • List the detector word and phrase lists with entry counts, config keys and sample entries
  • Read a file from disk and analyze it (local stdio server only, with automatic config discovery)
When to use it
Useful when an assistant drafts or edits prose and you want concrete, explainable style flags rather than an authorship verdict. Handy for tightening documentation, articles or reports, and for catching AI-sounding phrasing before publishing.
Requirements
Either the hosted remote endpoint (no installation) or the local npm package wsc-mcp run through npx with Node.js. No account, API key or environment variable is declared. The hosted API accepts up to 100,000 characters per request.
Before you install
Text sent to the hosted endpoint is processed on that server; the README says it is not stored, but it does leave your machine, so avoid confidential drafts. The local stdio server can read files from disk when asked. The tool flags patterns only and cannot prove authorship.

Installation

In SourceWeft

  1. Open Writing Style Checker in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.theserverlessdev%2Fwsc/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "writing-style-checker": {
      "type": "http",
      "url": "https://wsc.theserverless.dev/mcp"
    }
  }
}

README

Writing Style Checker

[CI] [npm] [smithery badge] [wsc MCP server] [M8ven Score] [License: MIT]

A prose linter and AI-slop detector. WSC finds AI tells — words, phrases, and sentence structures overrepresented in AI-generated text, each flag backed by a published corpus study. It also catches classic writing issues: weasel words, passive voice, duplicate words, long sentences, nominalizations, hedging, and filler adverbs. Available as a web editor, HTTP API, MCP server, CLI, and GitHub Action.

Live: wsc.theserverless.dev

[Screenshot of Writing Style Checker]

Features

  • Web Editor - Real-time highlighting with inline fix buttons for all 8 detectors
  • HTTP API - POST text with optional config, retrieve structured JSON responses
  • MCP Server (Remote) - Connect AI assistants via Streamable HTTP transport
  • MCP Server (Local) - Stdio-based server via wsc-mcp on npm
  • CLI - Check files from the command line via wsc-lint
  • GitHub Action - Run checks in CI with ::warning annotations
  • Configurable - Customize detectors with .wscrc.json files

What WSC is (and isn't)

WSC flags patterns that research on AI-generated text finds overrepresented, and cites a source for every flag. It does not, and cannot, prove authorship. Classifier-based detectors carry a documented false-accusation risk: a Stanford study found that seven of them misflagged 61% of essays written by non-native English speakers. WSC avoids that trap by design — every flag is a specific, explainable edit that improves the text no matter who, or what, wrote it.


Detection Rules

DetectorItemsDescription
Weasel Words95 words/phrasesVague terms like "very", "basically", "arguably", "numerous"
Passive Voice260 irregular verbsAuxiliary verbs + past participles (regular -ed + irregular)
Duplicate Words—Adjacent repeated words across whitespace, case-insensitive
Long Sentencesthreshold: 30 wordsSentences exceeding a configurable word count
Nominalizations245 word pairsNouns replaceable with verbs ("utilization" → "use")
Hedging100 phrasesPhrases that weaken assertions ("I think", "it seems")
Filler Adverbs139 wordsAdverbs adding emphasis without substance ("totally", "utterly")
AI Tells98 words (+111 inflected forms) + 83 phrases + 12 structural patternsWords, phrases, and sentence constructions overrepresented in AI-generated text (delve, rich tapestry, It's not just X — it's Y)

Word lists sourced from Matt Might's shell scripts and expanded with additional entries. AI tells draw on published corpus studies: Kobak et al. 2025 (Science Advances), Juzek & Ward 2025 (COLING), Liang et al. 2024 (Stanford), and Reinhart et al. 2025 (PNAS). Wikipedia's editor-maintained Signs of AI writing catalogue and AI-detection vendor reports round out the sources.


Configuration

Create a .wscrc.json to customize detectors. All tools (API, MCP, CLI) support it.

json
{  "$schema": "https://wsc.theserverless.dev/schema.json",  "ignore": ["CHANGELOG.md", "docs/vendor/**"],  "detectors": {    "weaselWords": {      "enabled": true,      "add": ["synergy", "leverage"],      "remove": ["very"]    },    "longSentences": { "maxWords": 25 },    "adverbs": { "enabled": false }  }}

Every field is optional. Missing fields use defaults. JSON Schema provides autocompletion in VS Code.

ignore is an array of glob patterns relative to the working directory. The GitHub Action uses the repository root. The CLI adds these patterns to its built-in **/node_modules/** and **/.git/** skips, together with the Action exclude input and the CLI --ignore flag.


API Usage

POST /api/check

Analyze text for writing style issues. Accepts optional config object.

bash
curl -X POST https://wsc.theserverless.dev/api/check \  -H "Content-Type: application/json" \  -d '{"text":"The code was written very quickly."}'

Response:

json
{  "summary": {    "total": 2,    "weaselWords": 1,    "passiveVoice": 1,    "duplicateWords": 0,    "longSentences": 0,    "nominalizations": 0,    "hedging": 0,    "adverbs": 0  },  "issues": {    "weaselWords": [{ "word": "very", "index": 21, "line": 1, "column": 22, "context": "..." }],    "passiveVoice": [{ "phrase": "was written", "index": 9, "line": 1, "column": 10, "context": "..." }],    "duplicateWords": [],    "longSentences": [],    "nominalizations": [],    "hedging": [],    "adverbs": []  },  "meta": { "characterCount": 34, "wordCount": 6, "sentenceCount": 1, "processingTimeMs": 2 }}

With config:

bash
curl -X POST https://wsc.theserverless.dev/api/check \  -H "Content-Type: application/json" \  -d '{"text":"The code was written very quickly.", "config":{"detectors":{"weaselWords":{"enabled":false}}}}'

GET /api/check

Returns API documentation as JSON.

GET /api/detectors

Returns the list of all 8 detectors with descriptions, configurability, and word counts.

GET /health

Runs a smoke test with known text and returns {"status":"healthy"} or 503.

Limits: Max 100,000 characters per request. CORS enabled for all origins.


MCP Server

The Writing Style Checker is available as an MCP server, letting AI assistants check your writing directly.

Tools

ToolDescription
check_textAnalyze text for all 8 writing style issues. Accepts optional config.
fix_duplicatesRemove duplicate adjacent words and return cleaned text
list_word_listsReturn info about all detector word lists
check_file(Local only) Read a file from disk and analyze it. Auto-discovers .wscrc.json.

Remote MCP Server

Connect any MCP client to the hosted server - no installation required.

json
{  "mcpServers": {    "writing-style-checker": {      "type": "url",      "url": "https://wsc.theserverless.dev/mcp"    }  }}

Local MCP Server (stdio)

Install via npm for local usage. Includes check_file for analyzing files on disk with auto-discovery of .wscrc.json.

bash
npx wsc-mcp

Claude Desktop / Claude Code config:

json
{  "mcpServers": {    "writing-style-checker": {      "command": "npx",      "args": ["wsc-mcp"]    }  }}

See the wsc-mcp npm page for full documentation.


CLI

Check files from the command line.

bash
# Check all markdown filesnpx wsc-lint check "**/*.md"
# Read from stdinecho "The code was written very quickly." | npx wsc-lint check --stdin
# JSON output for scriptingnpx wsc-lint check "**/*.md" --format json
# GitHub Actions annotationsnpx wsc-lint check "**/*.md" --format github
# Create a config filenpx wsc-lint init

See the wsc-lint README for full documentation.


GitHub Action

yaml
- uses: theserverlessdev/wsc@v1  with:    files: '**/*.md'    max-warnings: 20    exclude: |      CHANGELOG.md      vendor/**
InputDefaultDescription
files**/*.mdGlob pattern for files to check
config—Path to .wscrc.json config file
max-warningsunlimitedMax warnings before failing
only-changedfalseOn a pull request, check changed files that match files. If none match, skip the check. Other events check files.
exclude—Glob patterns to skip. Separate with a comma or a new line. Adds to config ignore.

Privacy

The web editor runs in your browser - we never send text to any server. The API and MCP endpoints only process text you explicitly send to them.


Project Structure

.├── src/│   ├── core/                    # Shared detection engine│   │   ├── detector.ts          # 8 detection algorithms│   │   ├── words.ts             # Word/phrase lists (800+ entries)│   │   ├── config.ts            # Config types, merging, validation│   │   ├── config-node.ts       # Node-only: file loading, discovery│   │   ├── analyzer.ts          # Unified analyzeText() entry point│   │   └── index.ts             # Public API exports│   ├── docs/                    # Documentation content (Markdown files)│   ├── mcp/│   │   └── handler.ts           # MCP JSON-RPC 2.0 handler│   ├── lib/│   │   ├── App.svelte           # Main editor page component│   │   ├── stores/theme.ts      # Theme store (light/dark/system)│   │   └── components/          # UI components (StatsBar, ConfigPanel, etc.)│   ├── routes/│   │   ├── +layout.svelte       # Shared layout (header, nav, footer)│   │   ├── api/check/+server.ts # HTTP API endpoint│   │   ├── mcp/+server.ts       # MCP endpoint│   │   ├── health/+server.ts    # Health check endpoint│   │   ├── docs/+page.svelte    # Documentation page│   │   └── words/+page.svelte   # Word library browser│   └── styles/│       └── main.scss            # Global styles (light + dark themes)├── mcp-server/                  # Standalone stdio MCP server (npm: wsc-mcp)├── cli/                         # CLI tool (npm: wsc-lint)├── action/                      # GitHub Action (composite)├── tests/                       # 341 tests across 18 files├── static/│   ├── schema.json              # JSON Schema for .wscrc.json│   ├── llms.txt                 # AI/LLM discovery file│   └── llms-full.txt            # Detailed LLM context├── wrangler.toml                # Cloudflare Workers config└── svelte.config.js             # SvelteKit configuration

Local Development

bash
git clone https://github.com/theserverlessdev/wsc.gitcd wscnpm installnpm run dev

Visit http://localhost:5173. The API is at /api/check, MCP at /mcp, health at /health.

Commands

CommandDescription
npm run devStart dev server
npm run buildBuild for production
npm run checkType check with svelte-check
npm testRun all 341 tests
npm run test:coverageCoverage report

Deployment

Deployed as a Cloudflare Worker at wsc.theserverless.dev.

bash
npm run buildnpx wrangler deploy

Contributing

See CONTRIBUTING.md for development setup, testing, and pull request guidelines.

For substantial changes, please open an issue first.

Acknowledgements

License

MIT

Source: README.md at commit 5ecd1e8

Tools

3

check_text

Check text for writing style issues

Analyze text for writing style issues: weasel words, passive voice, duplicate words, long sentences, nominalizations, hedging, filler adverbs, and research-cited AI tells. Read-only and stateless — text is analyzed in memory on the hosted server and never stored. Returns a plain-text report with each issue's line and column, the matched text, surrounding context, and the reason for AI tells; texts over 100,000 characters return an error message. This hosted server has no filesystem access — the wsc-mcp npm package adds a check_file tool for local files. It only reports issues — to auto-remove duplicate words, follow up with fix_duplicates.

Parameterstextrequiredconfigformat

fix_duplicates

Remove duplicate adjacent words

Remove duplicate adjacent words (case-insensitive, including across line breaks) and return the cleaned text plus the list of words that were removed. Read-only with no side effects: the fix is returned in the response, nothing is written anywhere. Use after check_text reports duplicate words; other issue types are report-only and have no auto-fix.

Parameterstextrequired

list_word_lists

List detector word lists

Return every detector word/phrase list with its entry count, config key, and sample entries, plus a link to the full browsable library. Read-only, takes no parameters, and returns the same catalog for a given release. Use it to see what the detectors match before tuning a config for check_text; not needed for ordinary checking.

Takes no parameters.

Version history

1
  1. v2.2.2LatestSep 16, 2026

Score

100% 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 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts