Etincel
Étincel Find the AI tells in your prose.
What it can do
- List Styles: List every available style: premade emotional-tone presets plus any voices this installer has trained from their own samples.
- Get Style Guide: Fetch the full drafting guide for one style (a preset id like 'direct-warm', or the id of a trained voice).
- Train Style: Analyze one or more of the installer's own writing samples and persist a trained voice profile under that name, scoped to this installer only. Call again with the same name (or the voice'
What data it sees
Do you need an account
No: the server works without sign-in
Étincel
Find the AI tells in your prose. Deterministically, locally, in your agent's own drafting loop.
Étincel gives Claude, Cursor, or any MCP client two things most writing tools don't pair together: a trained voice to draft in, and a rule-based audit to check the result against. Neither step calls a model. The audit runs on pattern and rhythm analysis against your own past writing, not a wrapped API call to another LLM.
Tools an agent gets
audit_text: scores a draft for AI-writing tells (uniform paragraph length, hedged authority, stock transitions), with locations and severities, not just a verdicttrain_style/create_style_from_dials: builds a voice profile from your own writing samples or explicit parameterscheck_voice_match/ `check_self_repom a trained voice, and habits repeatedacross a writer's own past piecesget_style_guide/list_styles: pur a saved voice before drafting starts- word-list and instruction tools to tune what counts as a tell per style
Why this fits an agent's workflow, not just a human's
A skill file that says "don't sound like AI" is a suggestion the model can silently ignore. audit_text returns a score an agent can branch on:audit, done. It's a gate, not a hint.
Measured, not asserted
Pooled AUC per register, checked againsixed bootstrap seed, in CI:
| Register | AUC |
|---|---|
| memo | 0.909 |
| essay | 0.900 |
| blog | 0.820 |
| docs | 0.735 |
Email and general-register scores are tracked too but are deliberately uncalibrated; the four above are the ones to trust.
Install
```json { "mcpServers": { "etincel-nonfiction": { "command": "npx", "args": ["etincel", "serve"] } } } ```
No account, no network call in the audit path, MIT licensed.
Server tool list (20)
Raw names from tools/list. Only developers need these.
| list_styles | List every available style: premade emotional-tone presets plus any voices this installer has trained from their own samples. |
| get_style_guide | Fetch the full drafting guide for one style (a preset id like 'direct-warm', or the id of a trained voice). |
| train_style | Analyze one or more of the installer's own writing samples and persist a trained voice profile under that name, scoped to this installer only. Call again with the same name (or the voice's id, from list_styles, if it's been renamed) and new samples to add more training data; the new samples blend into its existing measurements rather than replacing them. |
| create_style_from_dials | Build a style profile from explicit dial values instead of writing samples: 3 persona dials (formality, warmth, directness, 0-10) plus 8 mechanical dials (0-100, including entropy: how much AI-typical structural regularity to break) mapping onto the same measurements train_style extracts from real text. Call again with the same name to overwrite. |
| update_style | Rename a trained voice or adjust its dials in place, keeping its id stable, for this installer only. Persona dials always apply; mechanical dials only take effect if the voice has no writing samples. |
| fork_style | Copy a style into a new trained voice for this installer, seeded with its persona dials and drafting guide. Two kinds of source: a premade preset (e.g. 'pr-review', 'linkedin-post'), or another installer's style published publicly on the gallery, addressed as "handle/slug" (e.g. "jpleblanc/blunt-memo", the same address shown on its public page at etincel.ai/v/handle/slug). The fork is then a normal trained voice: retrain it with train_style, or hand-tune it with update_style, without touching the original. |
| delete_style | Permanently delete a trained voice profile by id, for this installer only. |
| set_default_style | Set which style (preset or trained voice) this installer defaults to. |
| check_voice_match | Compare a piece of drafted text's measured sentence/paragraph rhythm and mechanics against a trained or custom voice's baseline. Returns a verdict ('on rhythm' / 'some drift' / 'off rhythm'), a match score, specific dials that drifted with a plain-language note for each, and a caveat you should relay alongside the verdict: this is a rhythm/mechanics measurement, not an authorship or AI-detection check, so text merely shaped like the voice can come back 'on rhythm' regardless of who wrote it. Confidence comes back "low" on short input; treat a low-confidence verdict as provisional. Only works against trained/custom voices for this installer, not bare presets; fork_style a preset first if you want to check against one. |
| check_self_repetition | Compare a piece of drafted text against a trained voice's own recent training samples for self-repetition: the same opening words, or a characteristic phrase, recurring across several past pieces. Not an AI-writing-tells check; see audit_text for that. Sample history isn't tracked for hosted/remote connections yet, so this currently always reports zero history here; use a local install for this tool to be useful. |
| audit_text | Deterministically scan a piece of non-fiction text for common AI-writing tells, plus this installer's own banned/custom word lists from add_banned_word/add_custom_word (the 'global' list, merged with a style's own list if styleId is given). Returns a tier, score, specific findings, and a strengths signal (specificity, concrete-vs-abstract ratio, sentence-rhythm variation). Weigh strengths against findings so fixes don't flatten the prose. Never a silent rewrite. |
| contribute_corpus_sample | Opt-in only, never call this without the installer explicitly agreeing first: silently contributing a draft is exactly the kind of thing this product exists to not do. Saves a piece of text, labeled human-written or etincel-assisted, toward improving detection for everyone, including the Etincel-processed tier that keeps this tool honest about its own output. Ask after an audit_text call, in the installer's own words ('want to contribute this draft to the corpus?'), and only call this if they say yes. Revocable any time from the Material settings page. |
| add_banned_word | Add a term to this installer's own banned-words list, checked by audit_text alongside the built-in AI-tell corpus. Without styleId, this adds to the global list, which applies to every style. With styleId, it only applies when auditing against that specific style, merged on top of the global list. Use this when the user says something like 'add [word] to my banned words list' or 'never let me use [word] again'. |
| remove_banned_word | Remove a term from this installer's banned-words list (global, or a specific style's list). |
| add_custom_word | Add a term to this installer's own allowed-words list, so audit_text never flags it even if it matches the built-in corpus or a banned word: the 'corporate dictionary' case, e.g. an org's own acronyms or house terms. Without styleId, this adds to the global list. With styleId, it only applies to that specific style, merged on top of the global list. Use this when the user says something like 'add [word] to my custom words list' or 'stop flagging [word], it's one of ours'. |
| remove_custom_word | Remove a term from this installer's allowed-words list (global, or a specific style's list). |
| list_dictionary | Show the banned-words and custom (allowed) words lists for a scope: the global list (default), or a specific style's list, for this installer. For a style, also returns the effective merged list (that style's words plus the global ones): what audit_text actually applies when that style is selected. |
| set_style_instructions | Save free-text drafting rules layered on top of a style's voice, for this installer: required elements ('always include a CTA'), audience notes, forbidden topics, format constraints, anything that isn't about sentence rhythm or tone. Overwrites whatever was saved for this scope. Without styleId, this sets the global instructions, which apply to every style. With styleId, it only applies to that specific style, merged after the global instructions (get_style_guide returns the merged result automatically). Use this when the user says something like 'for this style, always end with a CTA' or 'remember: never mention pricing in emails'. |
| clear_style_instructions | Remove the saved instructions for a scope (global, or a specific style), for this installer. |
| get_style_instructions | Show the saved instructions for a scope, for this installer: the global instructions (default), or a specific style's own. For a style, also returns the effective merged text (global plus that style's own) that get_style_guide already folds in automatically. |