{
  "markdown": "# Writing Style Checker\n\n[![CI](https://github.com/theserverlessdev/wsc/actions/workflows/ci.yml/badge.svg)](https://github.com/theserverlessdev/wsc/actions/workflows/ci.yml)\n[![npm](https://img.shields.io/npm/v/wsc-mcp)](https://www.npmjs.com/package/wsc-mcp)\n[![smithery badge](https://smithery.ai/badge/theserverlessdev/wsc)](https://smithery.ai/servers/theserverlessdev/wsc)\n[![wsc MCP server](https://glama.ai/mcp/servers/theserverlessdev/wsc/badges/score.svg)](https://glama.ai/mcp/servers/theserverlessdev/wsc)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n\nA 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.\n\n**[Live: wsc.theserverless.dev](https://wsc.theserverless.dev)**\n\n![Screenshot of Writing Style Checker](static/images/ss.png)\n\n## Features\n\n- **Web Editor** - Real-time highlighting with inline fix buttons for all 8 detectors\n- **HTTP API** - POST text with optional config, retrieve structured JSON responses\n- **MCP Server (Remote)** - Connect AI assistants via Streamable HTTP transport\n- **MCP Server (Local)** - Stdio-based server via [`wsc-mcp`](https://www.npmjs.com/package/wsc-mcp) on npm\n- **CLI** - Check files from the command line via `wsc-lint`\n- **GitHub Action** - Run checks in CI with `::warning` annotations\n- **Configurable** - Customize detectors with `.wscrc.json` files\n\n---\n\n## What WSC is (and isn't)\n\nWSC 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.\n\n---\n\n## Detection Rules\n\n| Detector | Items | Description |\n|----------|-------|-------------|\n| **Weasel Words** | 95 words/phrases | Vague terms like \"very\", \"basically\", \"arguably\", \"numerous\" |\n| **Passive Voice** | 260 irregular verbs | Auxiliary verbs + past participles (regular `-ed` + irregular) |\n| **Duplicate Words** | — | Adjacent repeated words across whitespace, case-insensitive |\n| **Long Sentences** | threshold: 30 words | Sentences exceeding a configurable word count |\n| **Nominalizations** | 245 word pairs | Nouns replaceable with verbs (\"utilization\" → \"use\") |\n| **Hedging** | 100 phrases | Phrases that weaken assertions (\"I think\", \"it seems\") |\n| **Filler Adverbs** | 139 words | Adverbs adding emphasis without substance (\"totally\", \"utterly\") |\n| **AI Tells** | 98 words (+111 inflected forms) + 83 phrases + 12 structural patterns | Words, phrases, and sentence constructions overrepresented in AI-generated text (`delve`, `rich tapestry`, `It's not just X — it's Y`) |\n\nWord lists sourced from [Matt Might's shell scripts](https://matt.might.net/articles/shell-scripts-for-passive-voice-weasel-words-duplicates/) 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](https://en.wikipedia.org/wiki/Wikipedia:Signs_of_AI_writing) catalogue and AI-detection vendor reports round out the sources.\n\n---\n\n## Configuration\n\nCreate a `.wscrc.json` to customize detectors. All tools (API, MCP, CLI) support it.\n\n```json\n{\n  \"$schema\": \"https://wsc.theserverless.dev/schema.json\",\n  \"detectors\": {\n    \"weaselWords\": {\n      \"enabled\": true,\n      \"add\": [\"synergy\", \"leverage\"],\n      \"remove\": [\"very\"]\n    },\n    \"longSentences\": { \"maxWords\": 25 },\n    \"adverbs\": { \"enabled\": false }\n  }\n}\n```\n\nEvery field is optional. Missing fields use defaults. JSON Schema provides autocompletion in VS Code.\n\n---\n\n## API Usage\n\n### `POST /api/check`\n\nAnalyze text for writing style issues. Accepts optional `config` object.\n\n```bash\ncurl -X POST https://wsc.theserverless.dev/api/check \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"text\":\"The code was written very quickly.\"}'\n```\n\n**Response:**\n\n```json\n{\n  \"summary\": {\n    \"total\": 2,\n    \"weaselWords\": 1,\n    \"passiveVoice\": 1,\n    \"duplicateWords\": 0,\n    \"longSentences\": 0,\n    \"nominalizations\": 0,\n    \"hedging\": 0,\n    \"adverbs\": 0\n  },\n  \"issues\": {\n    \"weaselWords\": [{ \"word\": \"very\", \"index\": 21, \"line\": 1, \"column\": 22, \"context\": \"...\" }],\n    \"passiveVoice\": [{ \"phrase\": \"was written\", \"index\": 9, \"line\": 1, \"column\": 10, \"context\": \"...\" }],\n    \"duplicateWords\": [],\n    \"longSentences\": [],\n    \"nominalizations\": [],\n    \"hedging\": [],\n    \"adverbs\": []\n  },\n  \"meta\": { \"characterCount\": 34, \"wordCount\": 6, \"sentenceCount\": 1, \"processingTimeMs\": 2 }\n}\n```\n\n**With config:**\n\n```bash\ncurl -X POST https://wsc.theserverless.dev/api/check \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"text\":\"The code was written very quickly.\", \"config\":{\"detectors\":{\"weaselWords\":{\"enabled\":false}}}}'\n```\n\n### `GET /api/check`\n\nReturns API documentation as JSON.\n\n### `GET /api/detectors`\n\nReturns the list of all 8 detectors with descriptions, configurability, and word counts.\n\n### `GET /health`\n\nRuns a smoke test with known text and returns `{\"status\":\"healthy\"}` or `503`.\n\n**Limits:** Max 100,000 characters per request. CORS enabled for all origins.\n\n---\n\n## MCP Server\n\nThe Writing Style Checker is available as an [MCP](https://modelcontextprotocol.io/) server, letting AI assistants check your writing directly.\n\n### Tools\n\n| Tool | Description |\n|------|-------------|\n| `check_text` | Analyze text for all 8 writing style issues. Accepts optional `config`. |\n| `fix_duplicates` | Remove duplicate adjacent words and return cleaned text |\n| `list_word_lists` | Return info about all detector word lists |\n| `check_file` | *(Local only)* Read a file from disk and analyze it. Auto-discovers `.wscrc.json`. |\n\n### Remote MCP Server\n\nConnect any MCP client to the hosted server - no installation required.\n\n```json\n{\n  \"mcpServers\": {\n    \"writing-style-checker\": {\n      \"type\": \"url\",\n      \"url\": \"https://wsc.theserverless.dev/mcp\"\n    }\n  }\n}\n```\n\n### Local MCP Server (stdio)\n\nInstall via npm for local usage. Includes `check_file` for analyzing files on disk with auto-discovery of `.wscrc.json`.\n\n```bash\nnpx wsc-mcp\n```\n\n**Claude Desktop / Claude Code config:**\n\n```json\n{\n  \"mcpServers\": {\n    \"writing-style-checker\": {\n      \"command\": \"npx\",\n      \"args\": [\"wsc-mcp\"]\n    }\n  }\n}\n```\n\nSee the [`wsc-mcp` npm page](https://www.npmjs.com/package/wsc-mcp) for full documentation.\n\n---\n\n## CLI\n\nCheck files from the command line.\n\n```bash\n# Check all markdown files\nnpx wsc-lint check \"**/*.md\"\n\n# Read from stdin\necho \"The code was written very quickly.\" | npx wsc-lint check --stdin\n\n# JSON output for scripting\nnpx wsc-lint check \"**/*.md\" --format json\n\n# GitHub Actions annotations\nnpx wsc-lint check \"**/*.md\" --format github\n\n# Create a config file\nnpx wsc-lint init\n```\n\nSee the [`wsc-lint` README](cli/README.md) for full documentation.\n\n---\n\n## GitHub Action\n\n```yaml\n- uses: theserverlessdev/wsc@v1\n  with:\n    files: '**/*.md'\n    max-warnings: 20\n```\n\n| Input | Default | Description |\n|-------|---------|-------------|\n| `files` | `**/*.md` | Glob pattern for files to check |\n| `config` | — | Path to `.wscrc.json` config file |\n| `max-warnings` | unlimited | Max warnings before failing |\n| `only-changed` | `false` | Only check files changed in this PR |\n\n---\n\n## Privacy\n\nThe 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.\n\n---\n\n## Project Structure\n\n```\n.\n├── src/\n│   ├── core/                    # Shared detection engine\n│   │   ├── detector.ts          # 8 detection algorithms\n│   │   ├── words.ts             # Word/phrase lists (800+ entries)\n│   │   ├── config.ts            # Config types, merging, validation\n│   │   ├── config-node.ts       # Node-only: file loading, discovery\n│   │   ├── analyzer.ts          # Unified analyzeText() entry point\n│   │   └── index.ts             # Public API exports\n│   ├── docs/                    # Documentation content (Markdown files)\n│   ├── mcp/\n│   │   └── handler.ts           # MCP JSON-RPC 2.0 handler\n│   ├── lib/\n│   │   ├── App.svelte           # Main editor page component\n│   │   ├── stores/theme.ts      # Theme store (light/dark/system)\n│   │   └── components/          # UI components (StatsBar, ConfigPanel, etc.)\n│   ├── routes/\n│   │   ├── +layout.svelte       # Shared layout (header, nav, footer)\n│   │   ├── api/check/+server.ts # HTTP API endpoint\n│   │   ├── mcp/+server.ts       # MCP endpoint\n│   │   ├── health/+server.ts    # Health check endpoint\n│   │   ├── docs/+page.svelte    # Documentation page\n│   │   └── words/+page.svelte   # Word library browser\n│   └── styles/\n│       └── main.scss            # Global styles (light + dark themes)\n├── mcp-server/                  # Standalone stdio MCP server (npm: wsc-mcp)\n├── cli/                         # CLI tool (npm: wsc-lint)\n├── action/                      # GitHub Action (composite)\n├── tests/                       # 341 tests across 18 files\n├── static/\n│   ├── schema.json              # JSON Schema for .wscrc.json\n│   ├── llms.txt                 # AI/LLM discovery file\n│   └── llms-full.txt            # Detailed LLM context\n├── wrangler.toml                # Cloudflare Workers config\n└── svelte.config.js             # SvelteKit configuration\n```\n\n---\n\n## Local Development\n\n```bash\ngit clone https://github.com/theserverlessdev/wsc.git\ncd wsc\nnpm install\nnpm run dev\n```\n\nVisit `http://localhost:5173`. The API is at `/api/check`, MCP at `/mcp`, health at `/health`.\n\n### Commands\n\n| Command | Description |\n|---------|-------------|\n| `npm run dev` | Start dev server |\n| `npm run build` | Build for production |\n| `npm run check` | Type check with svelte-check |\n| `npm test` | Run all 341 tests |\n| `npm run test:coverage` | Coverage report |\n\n## Deployment\n\nDeployed as a Cloudflare Worker at `wsc.theserverless.dev`.\n\n```bash\nnpm run build\nnpx wrangler deploy\n```\n\n---\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, testing, and pull request guidelines.\n\nFor substantial changes, please [open an issue](https://github.com/theserverlessdev/wsc/issues) first.\n\n## Acknowledgements\n\n- [Matt Might](https://matt.might.net/) for the [original shell scripts](https://matt.might.net/articles/shell-scripts-for-passive-voice-weasel-words-duplicates/)\n- Built with [SvelteKit](https://svelte.dev/) and [Svelte 5](https://svelte.dev/blog/svelte-5-is-alive), deployed on [Cloudflare Workers](https://workers.cloudflare.com/)\n- Logo made with [DiffusionBee](https://diffusionbee.com/)\n\n## License\n\n[MIT](LICENSE)\n",
  "bytes": 11242,
  "sha": "2a9fb571eea56810a6b8183acd76613d48f4bb8f4dd7e5a2a40673f8f89ee7bd",
  "repo_slug": "theserverlessdev/wsc",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_theserverlessdev_wsc_4747876e/readme"
}