mcpField
L
lexaudit

lexaudit

Local
github.com/nareykoProductivity0Updated 5d ago

About lexaudit

lexaudit is a local CLI for auditing vocabulary in articles, courses, and documentation. It flags calques, misused words, and invented terms, then ranks pages for review; it does not edit text and supports seven languages without internet access or a GPU.

Key features

  1. 01Detects calques, misused words, and invented terms
  2. 02Ranks pages by issue scores
  3. 03Explains why a word was flagged
  4. 04Supports seven languages
  5. 05Runs locally without editing text

Use cases

  1. 01Reviewing suspicious terms in multilingual documentation
  2. 02Prioritizing pages with more issues
  3. 03Checking words that spellcheckers often miss

Configuration

Local server config is the same for every client. Copy it into your client’s MCP config file.

mcp.json · Universal config
{
"mcpServers": {
"nareyko-lexaudit": {
"command": "uvx",
"args": [
"lexaudit"
]
}
}
}
Run commanduvx lexaudit

Local servers need a runtime on your machine (e.g. Node.js 18+). Config file locations differ by client; see your client’s docs.

Packages
pypilexaudit0.3.1

Tools

No tool list yet

Local servers expose tools only once running on your machine, and the maintainer has not provided a tool list.

Details

From the project README

lexaudit

Finds odd, wrong or copied-from-another-language words in your texts, and tells you which pages to fix first.

In plain words

You write or translate articles, courses or documentation. A normal spellchecker shouts about every brand name, abbreviation and long German word, and still misses the words that really hurt: a word copied from another language ("calque"), a real word used with the wrong meaning ("false friend"), or a word someone invented.

lexaudit reads your files, ignores the harmless things, and gives you a short ranked list: "look at this page first." It runs on an ordinary laptop in about a second. No graphics card, no internet, no account.

It only reports. It never changes your texts.

Unknown terms? See the glossary.
0.3.0 prep and publish path: docs/p1-INDEX.md.

  • Languages: English (en), German (de), Spanish (es), Polish (pl), Russian (ru), Swedish (sv), Ukrainian (uk)
  • Hardware: CPU only
  • Author: Vadim Nareyko (github.com/nareyko, Founder at Arviser Sp. z o.o.)
  • License: dual MIT package and AGPL-3.0-or-later hosted SaaS (details)

How lexaudit works


Try it in 30 seconds

pipx run lexaudit audit --path . --locale en --check
# or: uvx lexaudit audit --path . --locale en --check

Missing spelling dictionaries download automatically into your user cache. No GPU. No config file required. Exit code 1 means confirmed calques or invented words remain.

Optional helpers: lexaudit doctor, lexaudit fetch-dicts, lexaudit init.

Check a file or a whole project
# One file or folder, no settings file needed
uv run lexaudit audit --path ./README.md --locale en

# Or create starter settings first, then check everything
uv run lexaudit init
uv run lexaudit audit --locale en
Open the report

The reports are in the output folder, one subfolder per language. Start with queue.md:

| score | unique_suspects | path | top_words |
|---|---|---|---|
| 12.0 | 2 | docs/en/en-04-defect-known-calques.md | orientir surveyness |
| 6.0 | 1 | docs/en/en-05-defect-false-friend.md | denseness |
| 1.6 | 2 | docs/en/en-03-clean-unseen-jargon.md | vinylester haulout |

A higher score means "look here first". top_words shows the words behind the score.

Ask why a word was flagged
uv run lexaudit explain orientir --locale en
word: orientir (normalized: orientir, locale: en)
status: calque (tier: confirmed)
reason: loan-calque-orientir | detectors: calque, hunspell
editorial hint: working rule / ballpark / figures - not orientir
Reproduce our test results
uv run lexaudit audit --config examples/synthetic-demo/lexaudit.config.yaml

Then open tmp/synthetic-demo-out/<language>/queue.md.


How good is it? An honest answer

We built a 42-page test set in all 7 languages: 21 clean technical pages and 21 pages with planted problems. Some problems are known to the rules, some are brand new words the rules have never seen. Details: docs/synthetic-benchmark.md.

Benchmark results

SetupBad page in top 2Bad page in top 3Recall@2Recall@3MAP (0 to 1, higher is better)Known problems foundBrand-new neologisms foundCombined planted problemsClean-page FP / 1k tokensTime
A. Plain spellchecker0.0%23.8%0.0%23.8%0.3890.0% (0/26)0.0% (0/7)0.0% (0/33)81.20.48 s
B. Plus your word lists7.1%23.8%4.8%23.8%0.4210.0% (0/26)0.0% (0/7)0.0% (0/33)47.10.56 s
C. Full lexaudit100.0%100.0%66.7%100.0%1.000100.0% (26/26)100.0% (7/7)100.0% (33/33)47.12.97 s

What this means:

  • Pages with known problems come first in every language. The plain spellchecker puts clean pages first.
  • Known-rule problems: 100.0% (26/26). Unseen single-occurrence neologisms (Zipf + char n-gram / affix-glue): 100.0% (7/7). Combined planted problems (honest fraction): 100.0% (33/33).
  • With exactly 3 defective pages per locale, Recall@2 is 66.7% when the top-2 slots are both bad (Precision@2 = 100.0%). Precision@3 / Recall@3 are 100.0% (singleton inventeds outrank repeated domain jargon).
  • Clean-page false positives: 47.1 unique flagged words per 1000 tokens (36 unique FP / 764 tokens).
  • Domain terms that recur on a page (or sit in H1/title) are tagged domain-term-candidate, nearly zero-weighted in ranking, and listed under Suggested glossary additions.

Documentation

Start with docs/README.md.

GuideWhat you learn
GlossaryEvery term in plain words
BenchmarkThe 42-page test, step by step
ArchitectureWhat goes in, what comes out
PipelineThe gates every word passes
CLI referenceAll commands
Agent workflowFrom report to fixed page
Scores and metricsHow pages are scored

Word classification ladder


More commands

# Re-rank pages, filter by source (docs, academy, model_pack)
uv run lexaudit rank --locale ru --mode weighted --sources=docs

# Add every page that contains a known bad word to your to-do list
uv run lexaudit expand-needle --needle orientir --locale all \
  --write-queue /abs/path/to/rewrite-queue.md

# Optional: ask a language model for a second opinion (your own endpoint)
uv run lexaudit label --locale ru --top-pages 20 --top-words 50 --tiers likely,weak --profile cpu

# Compare two runs
uv run lexaudit diff --baseline .../report.json --current .../report.json --out /tmp/diff.json

For contributors

Setup and checks:

uv sync --extra dev
uv run ruff check . && uv run ruff format --check .
uv run mypy --strict src/
uv run pytest
uv run python scripts/crap_report.py
uv run mutmut run && uv run python scripts/check_mutation_score.py --min-percent 80
uv build

Test layers: unit and integration tests (branch coverage 80% or more), the 7-language benchmark, property-based fuzzing (Hypothesis), golden regression with a read-only check of your files, JSON Schema contract, complexity gate (CRAP), mutation testing (kill rate 80% or more).

Pictures in docs/images are generated from code: run python scripts/render_diagrams.py (needs Inkscape and Pillow). Never edit the JPG files by hand.

License

WhatLicense
PyPI / this repo’s code (CLI, library, YAML rules, packs)MIT — use in products and private SaaS is fine under MIT
Intended future hosted multi-tenant network service (not shipped here)Policy text: AGPL-3.0-or-later — not a second license on the MIT wheel
Benchmark corpora & fetched spelling dictionariesLICENSE-THIRD-PARTY.md + upstream *.license.txt

Full wording: docs/licensing.md. Adding rules: docs/contributing-rules.md.

Origin and author

Created and maintained by Vadim Nareyko (github.com/nareyko). It grew out of auditing multilingual courses and encyclopedias at FairHelm.

Comments

Markdown supported

New to MCP?

From what the protocol is to installing your first server, these answers cover most first questions.

An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.