Skip to main content
Glama

Étincel: Non-Fiction Writing Connector

      ___           ___                       ___           ___           ___           ___
     /\  \         /\  \          ___        /\__\         /\  \         /\  \         /\__\
    /::\  \        \:\  \        /\  \      /::|  |       /::\  \       /::\  \       /:/  /
   /:/\:\  \        \:\  \       \:\  \    /:|:|  |      /:/\:\  \     /:/\:\  \     /:/  /
  /::\~\:\  \       /::\  \      /::\__\  /:/|:|  |__   /:/  \:\  \   /::\~\:\  \   /:/  /
 /:/\:\ \:\__\     /:/\:\__\  __/:/\/__/ /:/ |:| /\__\ /:/__/ \:\__\ /:/\:\ \:\__\ /:/__/
 \:\~\:\ \/__/    /:/  \/__/ /\/:/  /    \/__|:|/:/  / \:\  \  \/__/ \:\~\:\ \/__/ \:\  \
  \:\ \:\__\     /:/  /      \::/__/         |:/:/  /   \:\  \        \:\ \:\__\    \:\  \
   \:\ \/__/     \/__/        \:\__\         |::/  /     \:\  \        \:\ \/__/     \:\  \
    \:\__\                     \/__/         /:/  /       \:\__\        \:\__\        \:\__\
     \/__/                                   \/__/         \/__/         \/__/         \/__/

Find the AI tells in your prose. Deterministically, locally, in CI.

npx etincel lint README.md

No install, no account, no model call, no network.

$ npx etincel lint drafts/announcement.md --register blog
✗ drafts/announcement.md  RED 100/100  (8 findings, 169 words, register: blog)
  Heavy AI styling. Multiple strong tells stacking up, worth a structural
  rewrite, not a word-swap pass.

  Whole-piece rhythm
    medium  uniform-paragraph-length
            6 paragraphs, most running about the same length with little
            variation between them. Vary paragraph length more.
    medium  low-burstiness
            13 sentences averaging 13 words, with little variation in length
            from one sentence to the next. Mix short sentences with long;
            allow fragments.
    medium  mechanical-register-drift
            Fragment rate and structural variety (sentence openers,
            punctuation mix) sit off where blog prose typically lands. Allow
            more sentence fragments and vary openers/punctuation more.

  Vocabulary and phrasing
    high    comprehensive  L3:C30   → thorough, complete
    high    cutting-edge   L3:C109  → newest, latest
    high    leverage       L3:C99   → use
    high    seamless       L3:C150  → smooth, easy
    high    streamline     L3:C70   → simplify, speed up

  strengths  specificity 11.4/1k · concrete:abstract 0.40 · burstiness 0.32

1 file audited, 1 at or above orange.

Étincel is two things. A deterministic audit that finds the patterns making prose read as machine-written, as a CLI, a GitHub Action, and an MCP tool. And a voice layer that trains Claude, Cursor, or any MCP client to draft in a style measured from your own writing, so the problem is smaller before you ever read the draft.

AI-drafted prose has a recognizable shape: uniform paragraphs, hedged authority, em dashes where a comma would do, closings that resolve too neatly. Étincel encodes the rules against that shape and, just as important, shows you what it found and why instead of quietly overwriting your voice. There is no model call anywhere in the audit path, and you decide what changes. You stay the author.

Does it work?

We measure it rather than assert it. Pooled AUC per register, measured by assay against labeled corpora with a fixed bootstrap seed, so any PR that drops these numbers fails CI:

Register

AUC

memo

0.909

essay

0.900

blog

0.820

general

0.748

docs

0.735

email

0.540

Email is close to a coin flip. It's deliberately uncalibrated, and we track it anyway so an accidental regression doesn't go unnoticed. general is uncalibrated too. The calibrated registers are docs, blog, memo, and essay; use those if the number matters to you. See efficacy-baselines.json and src/data/SOURCES.md for method and provenance.

Related MCP server: Writing Assistant Ai MCP

How this compares

vs. Vale + vale-ai-tells Vale is an excellent markup-aware linter and vale-ai-tells is a serious 78-rule package. They match tokens against patterns. Étincel measures shape: sentence-rhythm variance, paragraph-length uniformity, and repetition against your own previous drafts, the kind of statistical layer vale-ai-tells' own README says needs analysis beyond what token matching can do. Étincel also feeds a trained voice to the model before you draft, which no linter does. Running both is reasonable; they overlap less than you'd expect.

vs. skill files (stop-slop, avoid-ai-writing, no-slop) Those are instructions to a model, and they help. But a prompt can't verify it worked, can't produce an exit code, and can't gate a merge. Use one and run this in CI.

vs. humanizers (Undetectable.ai, QuillBot, StealthWriter) Those rewrite your text to evade detectors. Turnitin now has a dedicated AI-paraphrasing detection feature, expanded in 2025 to target humanizer output specifically. Étincel does the opposite job: it never modifies your text, and it would be a poor tool for fooling anyone.

vs. detectors (GPTZero, Pangram, Originality.ai, Copyleaks) Those answer "was a machine involved?" with a probability, over a whole document, as a verdict on authorship, in the cloud. Étincel answers "which specific patterns make this read as machine-written?" with locations and severities, locally, and never renders a verdict on who wrote something.

Install

Also listed on the official MCP registry as ai.etincel/etincel-nonfiction, so MCP-aware clients that auto-discover servers from there (VS Code's @mcp gallery, for one) find it without any of the config below.

Claude Code

/plugin marketplace add AIStoryHub/etincel
/plugin install etincel-nonfiction

Or from a local clone: /plugin marketplace add /path/to/etincel.

Claude Desktop / other MCP hosts

{
  "mcpServers": {
    "etincel-nonfiction": {
      "command": "npx",
      "args": ["etincel", "serve"]
    }
  }
}

From a local clone instead: npm install && npm run build, then point args at ["/path/to/etincel/dist/server.js"] with "command": "node".

Remote (hosted, multi-tenant)

A hosted version is also available at etincel.ai, exposing the same tools over Streamable HTTP (https://etincel.ai/api/mcp) with per-account auth instead of stdio. Point any MCP client at it directly:

{
  "mcpServers": {
    "etincel-nonfiction": {
      "url": "https://etincel.ai/api/mcp"
    }
  }
}

The hosted server isn't part of this repo; this repo is the local/stdio engine, CLI, and skill that the hosted version is built on top of.

Using it

Once installed, just ask for what you'd normally ask for, like "draft an email to the team about the delay," "write a blog post about X," or "clean up this memo," inside Claude Code or Claude Desktop. The skill picks up automatically for non-fiction prose of meaningful length. To train your own voice:

Train a style called "me" from these three emails I wrote: [paste samples]

Then either name it per-request ("write this in my voice") or set it as default:

Set my default style to "me"

Style presets

Twelve premade presets ship out of the box: six emotional tones (Direct & Warm, Executive Brief, Reflective Essayist, Founder Memo, Plainspoken Analyst, Wry & Candid) plus six use-case presets (PR Review, Code Comment, Slack Message, LinkedIn Post, Website Copy, Blog Post). Each carries formality/warmth/directness dials plus a sentence-rhythm and voice description that gets fed to the model as drafting context, not a template that fills in blanks. The server reads these from src/data/presets.json. Fork any preset into a trained voice with fork_style to make it your own.

Command-line lint

audit_text is a pure function under the hood, so it also ships as a CLI, for linting prose outside a chat client (READMEs, docs, PR descriptions in CI):

npx etincel lint 'docs/**/*.md'
npx etincel lint README.md --register docs --threshold yellow

Exits non-zero if any matched file's tier is at or above --threshold (default orange). .md/.mdx files default to the docs register automatically (suppresses the Markdown-structure false positives, since a real heading isn't a chatbot tell); pass --register to override. Add --json for a machine-readable report. Run npx etincel lint --help for the full option list.

A GitHub Action wraps the same CLI (see action.yml, and .github/workflows/lint.yml in this repo for a working example):

- uses: AIStoryHub/etincel@main
  with:
    patterns: "docs/**/*.md README.md"
    threshold: orange

Repo-local config: dictionary, instructions, and a shared team style

A team's rules don't have to live only in each person's local ~/.etincel/. Drop a .etincelrc (or .etincelrc.json / etincel.config.json) at the repo root and it's picked up automatically by the CLI and by the local (stdio) server, reviewable in code review and versioned instead of invisible and gone when someone leaves:

{
  "bannedWords": ["Acme Cloud Platform"],
  "allowedWords": ["leverage"],
  "register": "docs",
  "threshold": "orange",
  "instructions": "Always include a one-line CTA at the end.",
  "style": {
    "name": "House Voice",
    "dials": {
      "formality": 6,
      "warmth": 4,
      "directness": 7,
      "sentenceLength": 40,
      "sentenceRhythmVariance": 50,
      "paragraphVariance": 30,
      "contractionUse": 20,
      "emDashUse": 0,
      "fragmentTolerance": 10,
      "questionUse": 5,
      "entropy": 60
    }
  }
}
  • bannedWords / allowedWords merge alongside whatever's in your account/style dictionary; register/threshold act as repo-wide defaults that an explicit --register/--threshold flag still overrides.

  • instructions is free text, folded into get_style_guide's instructions for every style, not just the team one, ahead of your own account-level global instructions: the team-wide equivalent of set_style_instructions with no styleId, but committed to the repo instead of living in one person's account.

  • style defines a shared "house voice" from dials, addressable everywhere as styleId: "team" (get_style_guide, and once forked into a real trained voice with fork_style, everywhere else too) so a team has one already-tuned starting voice from day one instead of everyone hand-training or hand-tuning their own from scratch. list_styles includes it automatically when a .etincelrc in the current repo defines one.

The hosted server doesn't use any of this (it has no local repo to look in).

Sharing config across a team without committing it

.etincelrc is the versioned, code-reviewable layer above; the layer beneath it is ETINCEL_HOME, an environment variable that points the local (stdio) server and CLI at a directory to use instead of the default ~/.etincel/. Point every teammate's ETINCEL_HOME at the same shared, synced, or mounted directory (a repo-external path everyone's machine can read, e.g. something synced by your usual file-sharing setup) and trained voices, the default style, and account-level instructions/dictionaries are shared too, not just the .etincelrc-committed subset:

{
  "mcpServers": {
    "etincel-nonfiction": {
      "command": "node",
      "args": ["/path/to/etincel/dist/server.js"],
      "env": { "ETINCEL_HOME": "/path/to/shared/etincel-home" }
    }
  }
}

Nothing else to export or import: pointing ETINCEL_HOME at the same directory is the sync, the same way it already is for a single person's ~/.etincel/.

What's in here

  • An MCP server (src/server.ts) exposing twenty tools:

    • list_styles: premade tone presets, any voices you've trained, and (if a repo-local .etincelrc defines one) a shared team style

    • get_style_guide: the drafting instructions for one style

    • train_style: learn a voice from your own writing samples (sentence rhythm, contraction rate, em-dash habits, paragraph variance, recurring phrasing: measured, not guessed)

    • create_style_from_dials: build a style from explicit formality/warmth/directness and mechanical dials instead of samples

    • update_style: rename a trained voice or adjust its dials in place

    • fork_style: copy a preset's dials and guide into a new trained voice you can retrain or hand-tune, or fork another installer's style once they've published it publicly on the hosted gallery (addressed as handle/slug, e.g. jpleblanc/blunt-memo, the same address shown on its public page at etincel.ai/v/handle/slug); a public-style fork also carries over its mechanical dials and any dictionary/instructions the source installer set specifically for that style (never their private, account-wide ones), and makes one network call to etincel.ai to fetch it, while a preset fork never leaves this install

    • delete_style: permanently remove a trained voice

    • set_default_style: remember which style to use without repeating yourself

    • check_voice_match: compare a draft's measured rhythm against a trained voice's baseline. A rhythm/mechanics check, not an authorship or AI-detection check, and low-confidence on short input

    • check_self_repetition: compare a draft against a voice's own recent training samples for habits, not AI tells: the same opener, or a phrase, recurring across several past pieces ("you've opened this way in 4 of your last 6 pieces"). Local install only for now

    • audit_text: a deterministic, rules-based scan for AI tells, returning a tier, specific findings with severity, and a strengths signal (specificity, concrete-vs-abstract ratio, sentence-rhythm variation) so fixes don't flatten the prose. Takes an optional register (email / blog / memo / essay / social / docs / general / personal, default general) to calibrate strictness against the kind of text it is: docs suppresses Markdown-structure false positives (headings, bolded terms) and recalibrates rhythm/vocabulary detection against long-form reference prose instead of punchier short-form copy. personal is scaffolded (accepted, suppresses nothing extra yet) but not yet calibrated: no term suppressions, rhythm weight, or labeled corpus of its own until one is measured. Also takes an optional sourceFacts (details elicited from the user, never generated): checks how many actually made it into the draft, flagging elicited-material-unused below a quota of two used and at least one in a sentence that isn't proving a qualification

    • second_read: a single model call that reads a draft and reports what a careful human editor would notice, unscored and untiered, never a rewrite. Hosted only: this install always fails with a clear explanation, since a model call needs an account, a pinned model, and a billing surface this install doesn't have. audit_text remains fully available, no account needed

    • add_banned_word / remove_banned_word: maintain your own banned-vocabulary list, checked by audit_text alongside the built-in corpus

    • add_custom_word / remove_custom_word: maintain a "never flag this" list: an org's own acronyms or house terms, the corporate-dictionary case

    • list_dictionary: see a scope's banned/custom words, and (for a style) what actually applies once merged with the global list

    • set_style_instructions / clear_style_instructions / get_style_instructions: save, remove, or read free-text drafting rules for a scope (required elements, forbidden topics, format constraints), merged into get_style_guide the same way dictionaries merge into audit_text

  • A Claude Code / Claude Desktop skill (skills/etincel-nonfiction/) that uses those tools when you're drafting or revising non-fiction prose of any meaningful length.

Trained voices, dictionaries, and your default style live locally in ~/.etincel/: nothing is sent anywhere. audit_text is plain deterministic code (string analysis + a curated corpus of AI-writing tells), not a model call. The one exception is forking a public style via fork_style, which fetches (never sends) that style's guide from etincel.ai's public gallery; forking a preset, or anything else in this list, still touches the network not at all.

Custom dictionaries

Beyond the built-in AI-tell corpus, you can maintain your own banned and "always allowed" word lists: just tell Claude (or any MCP client) things like "add [word] to my banned words list" or "add [word] to my custom words list, it's one of ours." Each list lives at a scope: global (applies everywhere, the default when no style is named) or a specific style id, whose list is merged on top of global when you audit against that style. list_dictionary shows what's saved for a scope, plus the effective merged list for a style. Editing the global list is already the way to keep a word in sync across every style: it's merged in automatically, live, every time audit_text or list_dictionary runs.

Development

npm install
npm test        # run the engine/tools test suite (node:test via tsx)
npm run dev     # run the MCP server over stdio via tsx, for local testing
npm run build   # compile to dist/

mcpscore audit MCP Registry CircleCI CI Étincel lint License: MIT Node Last commit

The mcpscore badge audits the hosted remote server (etincel.ai/api/mcp), not the local/stdio engine in this repo; the two expose the same tools but run as separate deployments.

Status and limitations

Early, and honestly so.

  • The audit corpus in src/data/ is a curated subset, not exhaustive. See src/data/SOURCES.md for provenance and what isn't ported yet. The full corpus is at aistoryhub.co/corpus.

  • email (AUC 0.540) and general (0.748) are uncalibrated. social has no labeled corpus at all and isn't tracked.

  • check_voice_match is a rhythm-and-mechanics check, not authorship detection, and it's low-confidence on short input.

  • check_self_repetition is local-install only for now.

  • AI tells are a moving target: OpenAI patched ChatGPT's em-dash habit in November 2025. That's why efficacy is measured rather than claimed: when a tell stops being a tell, the AUC moves and the regression check catches it.

Available Tools

19 tools
add_banned_wordAdd a word to a banned-words listA
Idempotent
Inspect

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'.

ParametersJSON Schema
NameRequiredDescriptionDefault
wordYesThe term or short phrase to ban.
styleIdNoStyle id to scope this ban to, from list_styles. Omit to add to the global list.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly=false, idempotent=true, destructive=false, but the description adds valuable context: the list is checked by audit_text, and the global vs. style-specific scoping with merge behavior is disclosed. This gives the agent a clear model of side effects and scope.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the core function, then expansion on scoping and usage triggers. No redundant words or repetition of schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter tool with no output schema, the description covers the essential behavior (add, check via audit_text), the two modes (global/style), and the usage context. It is complete enough for an agent to select and invoke correctly without further clarification.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even though schema coverage is 100%, the description adds meaningful semantics to styleId by explaining the global vs. scoped behavior and the merge on top of the global list. Word is self-evident, but the styleId enrichment is significant.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Add' and the resource 'banned-words list', and immediately contextualizes it as being 'checked by audit_text'. It distinguishes itself from siblings like remove_banned_word and add_custom_word by specifying the list type and the audit_context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit triggers ('when the user says something like...') and details when to use the global list vs. a style-scoped list via styleId. This goes beyond vague 'use for adding banned words' and gives actionable guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_custom_wordAdd a word to a custom (allowed) words listA
Idempotent
Inspect

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'.

ParametersJSON Schema
NameRequiredDescriptionDefault
wordYesThe term or short phrase to always allow.
styleIdNoStyle id to scope this to, from list_styles. Omit to add to the global list.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes beyond the annotations by explaining the merge behavior (style-specific list merged on top of global) and the effect of never flagging the term even if it matches a banned word. It does not contradict the idempotentHint annotation and provides useful context that the schema and annotations alone don't convey. Minor gaps exist around permissions or error handling, but they are not critical.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured, front-loading the primary action in the first sentence and then providing context and usage examples. Every sentence adds value, with no repetitive or unnecessary content. The length is appropriate for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple two-parameter tool with no output schema and helpful annotations, the description provides sufficient context about purpose, effect, and behavior. It covers the most relevant aspects, though it omits details about return values or possible validation errors. These are minor and not critical for a tool of this simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description adds meaningful semantics beyond the schema for styleId, clarifying that 'merged on top of the global list' and that omitting styleId targets the global list. It also reinforces the purpose of the word parameter with a practical example. This incremental information justifies a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Add a term to this installer's own allowed-words list'), the resource (the list), and the intended effect on audit_text. It also distinguishes itself from banning words and explains the global vs style-specific scope, which differentiates it from sibling tools like add_banned_word or remove_custom_word.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit user-phrase triggers ('add [word] to my custom words list' or 'stop flagging [word], it's one of ours') and clarifies when to use global vs style-scoped additions. It does not explicitly mention alternative tools for when not to use it (e.g., if the user wants to ban a word), so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

audit_textAudit text for AI writing tellsA
Read-onlyIdempotent
Inspect

Deterministically scan a piece of non-fiction text for common AI-writing tells: banned hype vocabulary, chatbot fingerprints, and structural patterns (uniform paragraph length, stacked transitions, em-dash overuse, rule-of-three compulsion, and more), 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), plus a repo-local .etincelrc/.etincelrc.json/etincel.config.json if one exists at or above the current directory (dictionary as code, reviewable and versioned). Returns a tier (green/yellow/orange/red), a numeric score, specific findings with severity and location, and a strengths signal (specificity density, concrete-vs-abstract ratio, sentence-rhythm variation). Read strengths too, not just findings: it's the counter-signal against fixing every flagged word into flat, sterile prose. Never a silent rewrite. Use this to show the user what's flagged and why, so they stay in control of any change; only rewrite what they ask you to rewrite.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesThe text to audit.
styleIdNoStyle id (from list_styles) whose own banned/custom word list should merge with the installer's global list. Omit to use only the global list.
registerNoRegister to calibrate strictness against. Defaults to 'general'.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only and idempotent; description adds determinism, config-file reading, strengths signal, and never-silent-rewrite promise. This enriches behavioral understanding beyond annotation hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but efficient paragraph front-loads the core action; every sentence contributes, but length may be slightly overwhelming. Could use paragraph breaks for readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, description fully explains return values (tier, score, findings, strengths). Also covers config file integration and usage philosophy, making the tool's contract clear.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers all parameters with descriptions (100% coverage). Description reinforces styleId merging and register calibration but adds no new syntactic detail beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it deterministically scans non-fiction text for AI-writing tells, listing specific patterns and output categories. Distinguishes from sibling tools focused on style management and narrower checks like check_voice_match.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit usage context: show the user what's flagged and why, only rewrite on request. Implies a broader audit role versus siblings but doesn't explicitly name alternatives or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_self_repetitionCheck a draft for habits repeated across a voice's past piecesA
Read-onlyIdempotent
Inspect

Compare a piece of drafted text against a trained voice's own recent training samples for two kinds of self-repetition: opening the same way ("you've opened this way in 4 of your last 6 pieces"), and reusing a characteristic phrase across several of them. This is about the writer's own recurring habits, not AI-writing tells; use audit_text for those. Only meaningful for a voice trained from real samples (train_style) with at least 3 recorded samples; dial-tuned or preset-forked voices, or ones with too little history yet, come back with an empty findings list rather than an error. Only the local install tracks sample history today, so a hosted/remote connection may always report zero history. A signal to weigh, same trust-mode spirit as audit_text: never rewrite the draft on the strength of this alone.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoDeprecated alias for styleId.
textYesThe drafted text to check.
styleIdNoId of the trained voice to compare against, from list_styles.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare safe read-only/idempotent behavior, and the description adds valuable context: it lists the two specific repetition patterns, empty-list behavior for insufficient history, local-only history tracking, and a caution not to over-trust results. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, each earning its place: purpose, distinction from audit_text, usage conditions including empty-list behavior, and a trust-mode warning. Information is front-loaded and compact without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even without an output schema, the description fully sets expectations: what the tool detects, when it may return empty, platform differences, and how to interpret its signal. This is sufficient for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema covers all three parameters with clear descriptions: text, styleId, and deprecated id alias. The tool description adds context about trained voices and recent samples but does not substantially enhance parameter-level meaning beyond the schema, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description specifies a clear action: comparing drafted text against a trained voice's samples to detect two named types of self-repetition. It explicitly differentiates from audit_text ('not AI-writing tells') and ties to train_style, making its purpose distinct among siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Directs users to use audit_text for AI-writing tells, and states that the tool is only meaningful for voices trained from real samples with at least 3 samples, otherwise returning empty findings. It also notes hosted/remote differences and advises against rewriting solely on this signal, covering when-to-use and exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_voice_matchCheck a draft's rhythm against a trained voiceA
Read-onlyIdempotent
Inspect

Compare a piece of drafted text's measured sentence/paragraph rhythm and mechanics against a trained or custom voice's baseline (sentence length, rhythm variance, paragraph variance, contraction rate, em-dash use, fragment use, question use, structural entropy). Use this after drafting in a voice to check whether the draft's rhythm actually landed close to it, instead of just eyeballing it. 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 (by anyone, or any tool) can come back 'on rhythm', and a genuine off-voice draft by the target writer can still come back drifted. Confidence comes back "low" on short input, since a handful of sentences isn't enough to read rhythm reliably; treat a low-confidence verdict as provisional. Only works against trained or custom voices (from train_style, create_style_from_dials, or fork_style), not bare presets, which have no measured baseline; fork_style a preset first if you want to check a draft against one.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoDeprecated alias for styleId.
textYesThe drafted text to check.
styleIdNoId of the trained or custom voice to compare against, from list_styles.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes beyond the readOnlyHint/idempotentHint annotations by disclosing what the tool returns (verdict, score, drifted dials, caveat), the low-confidence behavior on short input, and a crucial interpretive limitation (not an authorship/AI-detection check). This gives the agent a realistic expectation of outputs and edge cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is detailed but every sentence carries information: comparison semantics, timing, return values, caveat, confidence guidance, and prerequisite condition. It is front-loaded with the first sentence stating the core action, and the rest expands logically.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no output schema, the description compensates by explicitly stating what is returned (verdict, match score, drifted dials, caveat, confidence). It also covers the prerequisite about trained/custom voices and the provisional nature of low-confidence results, making the operation fully self-contained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage for parameters is 100%, so the schema already explains text, styleId, and id. The description adds contextual meaning by stating the styleId must refer to a trained or custom voice and that bare presets won't work, which is useful but not essential for parameter use.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb: 'Compare a piece of drafted text's measured sentence/paragraph rhythm and mechanics against a trained or custom voice's baseline', and enumerates the measured dials (sentence length, rhythm variance, etc.). This clearly distinguishes it from sibling tools like check_self_repetition, which checks repetition, or audit_text, which audits generally.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly prescribes when to use it: 'Use this after drafting in a voice to check whether the draft's rhythm actually landed close to it, instead of just eyeballing it.' It also defines an exclusion and a workaround: 'Only works against trained or custom voices... not bare presets... fork_style a preset first if you want to check a draft against one.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clear_style_instructionsClear custom instructions for a styleA
Idempotent
Inspect

Remove the saved instructions for a scope (global, or a specific style), leaving it empty.

ParametersJSON Schema
NameRequiredDescriptionDefault
styleIdNoStyle id to clear, from list_styles. Omit to clear the global instructions.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already state the operation is mutating and idempotent. The description adds that it clears the scope 'leaving it empty', which clarifies the end state. There is no contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single 15-word sentence, front-loaded with the action verb and precise scope. Every word contributes meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With one optional parameter, no output schema, and clear annotations, the description plus schema fully cover the operation. The scope of removal is explicitly stated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema describes styleId with reference to list_styles and the global-instruction behavior, achieving 100% coverage. The description does not add parameter-level details, so the baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'Remove' and identifies the resource as 'saved instructions for a scope', clearly distinguishing it from siblings like set_style_instructions and get_style_instructions. It also explicitly mentions global vs. specific style scopes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly indicates the tool is for removing saved instructions, and the schema adds that omitting styleId clears global instructions. However, it does not explicitly name alternatives or exclusion criteria, though the sibling context makes the intended use obvious.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_style_from_dialsCreate a style from dialsA
Idempotent
Inspect

Build a style profile from explicit dial values instead of writing samples: for when the user wants to hand-tune a voice (or doesn't have samples handy). 3 persona dials (formality, warmth, directness, 0-10) plus 8 mechanical dials (0-100, including entropy: how much AI-typical structural regularity to break) that map onto the same measurements train_style extracts from real text, so a dial-built style and a trained voice are the same shape. Call again with the same name to overwrite.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName for this voice.
dialsYesThe 11 dial values (3 persona + 8 mechanical) that define this style's voice.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate idempotent behavior, but the description adds specific context: 'Call again with the same name to overwrite' and the fact that dials map onto the same measurements as train_style, ensuring a dial-built style is equivalent to a trained voice. This enriches the behavioral model without contradicting annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded, with no fluff. Each sentence serves a purpose: purpose, use case, dial structure and equivalence, overwrite behavior. It is dense but logically organized and appropriate for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the core purpose, usage scenarios, parameter grouping, and overwrite semantics. It lacks details on return values or success behavior, but no output schema exists and the sibling set provides context. Minor gap is acceptable given the strong annotation coverage and clear description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. However, the description adds meaningful grouping ('3 persona dials... plus 8 mechanical dials') and clarifies the semantics of entropy ('how much AI-typical structural regularity to break'), providing context not fully captured in individual field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb+resource: 'Build a style profile from explicit dial values' and clearly distinguishes from train_style by contrasting with 'writing samples'. It also explains the two categories of dials and ties the output to the same measurements as train_style, making the tool's unique role unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states when to use the tool: 'for when the user wants to hand-tune a voice (or doesn't have samples handy)' and names the alternative tool (train_style) when samples are available. The overwrite note also guides behavior on repeated calls, making usage direction clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_styleDelete a trained voiceA
DestructiveIdempotent
Inspect

Permanently delete a trained voice profile by id. Does not affect premade presets.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoDeprecated alias for styleId.
styleIdNoId of the trained voice to delete, from list_styles.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate destructive and non-read-only behavior. The description adds that deletion is permanent and does not affect presets, which are useful behavioral nuances beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences long, front-loaded with the primary action, and includes a necessary scope clarification in the second sentence. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive delete tool with two well-documented parameters and no output schema, the description plus annotations cover the essential context: what it deletes, permanence, and scope. No major gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both parameters have clear descriptions. The tool description only says 'by id' without specifying which parameter, so it adds no additional meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: permanently deleting a trained voice profile by id. It distinguishes between trained voices and premade presets, which aligns with the sibling tools and title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clarifies that premade presets are not affected, implying this tool is for trained voices only. It doesn't explicitly name alternatives, but the context is sufficient for an agent to know when to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fork_styleFork a preset or published community style into a trained voiceAInspect

Copy a style into a new trained voice under the given name, 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 hosted gallery, addressed as "handle/slug" (e.g. "jpleblanc/blunt-memo", the same address shown on its public page at etincel.ai/v/handle/slug). A public-style fork makes one network call to etincel.ai to fetch it; a preset fork never leaves this install. The fork is then a normal trained voice: retrain it with train_style from real samples, or hand-tune it with update_style, without touching the original.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName for the new trained voice.
styleIdNoId of the preset to fork (from list_styles), or a published style's "handle/slug" address.
presetIdNoDeprecated alias for styleId.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate readOnlyHint=false and openWorldHint=true. The description adds significant behavioral detail: a public-style fork makes one network call to etincel.ai while a preset fork stays local, and the original style is untouched. This goes beyond the annotations by clarifying side-effect scope and non-destructive behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is about 100 words, organized in three sentences: action, source types with examples, and outcome. It is dense but every sentence conveys essential information. Slightly long for the tool's complexity, but the structure is logical and front-loaded with the core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the two source modes, network behavior, non-destructive nature, and the relationship to retraining/hand-tuning. Does not explain error handling or return values, but with no output schema and the tool's moderate complexity, this is acceptable. The description provides enough context for an agent to pick and invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers 100% of parameters, so baseline is 3. The description adds value by explaining the dual meaning of styleId, giving the 'handle/slug' format and concrete examples, and noting that presetId is a deprecated alias. This clarifies how to address both source types beyond the schema's generic descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states 'Copy a style into a new trained voice under the given name' with a specific verb and resource. It distinguishes two source types (preset vs published community style) and clarifies the result is a normal trained voice, differentiating it from sibling creation tools like create_style_from_dials. The title also reinforces the purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description specifies when each source type is appropriate (preset vs public gallery address) and notes the network call implication for public forks. It references post-fork alternatives (train_style, update_style) but does not explicitly state when to choose fork_style over create_style_from_dials, though the context implies it is the starting point for existing styles.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_style_guideGet a style guideA
Read-onlyIdempotent
Inspect

Fetch the full drafting guide for one style (a preset id like 'direct-warm', the id of a trained voice, or 'team' for the shared style a .etincelrc in the current repo defines, if any). Returns prose instructions to follow while drafting or revising: sentence rhythm, tone dials, and (for trained voices) the writer's own measured habits. If a .etincelrc in the current repo sets team-wide instructions, those are folded into every style's instructions, not just 'team''s. Read this before drafting; it is context for you, the drafting model, not a tool that writes prose itself.

ParametersJSON Schema
NameRequiredDescriptionDefault
styleIdYesPreset id, trained voice id, or 'team', from list_styles.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, non-destructive, so the safety profile is covered. The description adds valuable behavioral context beyond annotations, such as the fact that .etincelrc team-wide instructions are folded into every style's instructions, not just 'team''s, and that the tool is context, not an action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is moderately detailed but every sentence earns its place. It front-loads the core function, then explains return content, special folding behavior, and usage context without redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple single-parameter interface, the description is remarkably complete. It explains what the return value contains, how .etincelrc affects results, and when to use the tool. There is no output schema, so the description appropriately covers return semantics.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents styleId as a preset, trained voice, or 'team'. The description adds further meaning with a concrete example ('direct-warm') and clarifies the semantics of 'team' in relation to .etincelrc, going beyond the schema's description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool fetches the full drafting guide for one style, with specific examples of style IDs and the special 'team' case. It also distinguishes itself from prose-writing tools by explicitly saying it is context for the drafting model, not a tool that writes prose itself.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a clear usage instruction: 'Read this before drafting.' It also explains what the tool returns and the context in which it is used (drafting or revising). However, it does not explicitly name alternative tools or state when not to use it, though this is implied by the drafting context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_style_instructionsGet custom instructions for a styleA
Read-onlyIdempotent
Inspect

Show the saved instructions for a scope: 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
styleIdNoStyle id to look up, from list_styles. Omit for the global instructions.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the operation as read-only, idempotent, and non-destructive, so the bar is lower. The description adds useful behavioral detail: it returns saved instructions for a scope, and for a style it also returns the effective merged text. This goes beyond the structured annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core action and scope, and no wasted words. Every sentence contributes to understanding the tool's behavior and its relationship to get_style_guide.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tool with one optional parameter, the description is sufficiently complete. It covers the global/scope distinction, the style-specific behavior including merged text, and the relationship to get_style_guide. No output schema exists, but the description gives a clear idea of what the tool returns.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description reinforces the semantics of the optional styleId (global vs style) and mentions list_styles indirectly, but the schema already documents the omit-for-global behavior. The description adds little meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Show') and resource ('saved instructions for a scope'), clearly distinguishing global vs style-specific context. It also differentiates from the sibling get_style_guide by noting that get_style_guide already folds in the effective merged text.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explains the optional styleId scope and the default global behavior, and explicitly relates to get_style_guide by noting what get_style_guide already does. It does not provide explicit 'when not to use' guidance, but the context is clear enough for the agent to choose between this and get_style_guide.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_dictionaryList a dictionary's banned and custom wordsA
Read-onlyIdempotent
Inspect

Show the banned-words and custom (allowed) words lists for a scope: the global list (default), or a specific style's list. 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
styleIdNoStyle id to look up, from list_styles. Omit for the global list.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the tool safe (readOnlyHint=true, idempotentHint=true, destructiveHint=false). The description adds valuable behavioral context: the tool returns the effective merged list for a style (style words plus global words), which is exactly what audit_text applies. This goes beyond the annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise, front-loaded sentences. Each sentence contributes unique information: scope options and the merged-list behavior. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has one optional parameter, no output schema, and clear annotations, the description is sufficient. It explains what is returned for the global and style cases, including the merged-list concept. The absence of output schema detail is acceptable for a read-only list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the parameter description already explains styleId (look up style list, omit for global). The description adds further meaning by clarifying the default scope and the merged-list result when styleId is provided, so it enhances understanding of parameter impact.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb ('Show') and resource ('banned-words and custom words lists'), and distinguishes between the global list and a style-specific list. It also differentiates from sibling tools by explaining that this tool reads dictionary lists, not styles or audit results.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context: the global list is the default, and a styleId looks up a specific style's list. It also mentions the effective merged list and its relation to audit_text, which tells the user when the result matters. It does not explicitly name alternatives, but it's clear from scope and purpose.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_stylesList writing stylesA
Read-onlyIdempotent
Inspect

List every available style: premade emotional-tone presets, any voices the user has trained from their own samples, and (if a .etincelrc in the current repo defines one) the shared team style, id 'team'. Call this before drafting or revising non-fiction prose if the caller hasn't been told which style to use, or if the user asks what styles exist.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint, idempotentHint, and destructiveHint false, covering the safety profile. The description adds valuable behavior context: it lists styles from multiple sources and conditionally includes a team style only if .etincelrc defines one, which is not inferable from annotations alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, information-dense sentence that packs purpose, scope, and usage guidance without redundancy. It is front-loaded with the key action and reads naturally.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter list tool with no output schema, the description fully covers what the tool returns (all available styles) and when to invoke it. The conditional team style nuance is also disclosed. No missing context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters, so the baseline is 4 per rubric. The description reinforces that the tool lists every style with no filtering, which adds semantic clarity beyond the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description begins with a specific verb and resource: 'List every available style.' It enumerates the categories of styles (premade emotional-tone presets, user-trained voices, conditional team style), clearly distinguishing this listing tool from sibling tools that create, update, or delete styles.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use the tool: 'Call this before drafting or revising non-fiction prose if the caller hasn't been told which style to use, or if the user asks what styles exist.' This provides clear contextual guidance without needing to reference alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_banned_wordRemove a word from a banned-words listA
Idempotent
Inspect

Remove a term from this installer's banned-words list (global, or a specific style's list).

ParametersJSON Schema
NameRequiredDescriptionDefault
wordYesThe term to unban.
styleIdNoStyle id the ban was scoped to, from list_styles. Omit for the global list.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already convey that the operation is a mutation (readOnlyHint=false), idempotent, and non-destructive. The description adds scope detail (global vs. style-specific) but doesn't explain consequences like whether the word is immediately allowed or what happens if the word isn't banned. No contradiction with annotations, but little extra behavioral depth.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that conveys the action, resource, scope, and optionality. Every word earns its place; no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter mutation tool without an output schema, the description plus schema provide enough information to invoke correctly. It could mention that removing a ban is idempotent or what happens upon success, but given the low complexity, the current info is nearly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema descriptions cover both parameters fully (word and styleId, with styleId referencing list_styles and global omission). The tool description adds no new parameter meaning beyond echoing 'global, or a specific style's list.' With 100% schema coverage, this meets the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Remove') and resource ('term from this installer's banned-words list'), and clearly distinguishes the scope ('global, or a specific style's list'). This differentiates it from sibling tools like add_banned_word and remove_custom_word, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: it is for removing a banned word, with optional style scoping. It implies the agent should use this when unbanning a term, but it doesn't explicitly name alternatives or exclusions (e.g., 'for custom words, use remove_custom_word'). Still, the context is sufficient for correct selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_custom_wordRemove a word from a custom (allowed) words listA
Idempotent
Inspect

Remove a term from this installer's allowed-words list (global, or a specific style's list).

ParametersJSON Schema
NameRequiredDescriptionDefault
wordYesThe term to remove from the allowed list.
styleIdNoStyle id the allowance was scoped to, from list_styles. Omit for the global list.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate idempotentHint=true and destructiveHint=false, so the safe mutation nature is known. The description adds the global/style-scoping context but does not disclose potential error behavior (e.g., fails if word not found) or side effects beyond removal, which are not covered by annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one concise sentence, front-loaded with the action, and contains no redundant words. Every phrase adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple removal tool with two parameters, good annotations, and no output schema, the description covers the core operation and parameter semantics adequately. It could mention behavior on non-existent terms, but given the simplicity, it is sufficiently complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds meaning by clarifying that omitting styleId targets the global list, while providing it targets a specific style's list, directly enhancing the semantics of the styleId parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'remove' and the resource 'a term from this installer's allowed-words list', with explicit scope of 'global, or a specific style's list'. This distinguishes it from siblings like remove_banned_word and add_custom_word.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the use case (removing an allowed word) but does not explicitly state when to use this vs alternatives like remove_banned_word or add_custom_word. It provides context about global vs style-specific scope but lacks explicit when-to-use or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_default_styleSet the default styleA
Idempotent
Inspect

Set which style (preset or trained voice) should be used by default for this user going forward, so it doesn't need to be re-specified every time.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoDeprecated alias for styleId.
styleIdNoId of the style (preset or trained voice) to set as default, from list_styles.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate the operation is idempotent and non-destructive. The description adds meaningful behavioral context by stating the effect is persistent ('going forward') and the benefit (avoids re-specification), which goes beyond the structured hints without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence that front-loads the action and purpose. Every word contributes to understanding the tool's function, with no extraneous information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple 2-parameter setter with full schema coverage and no output schema, the description fully explains what the tool does and its effect. The context is complete enough for an agent to select and invoke it correctly without further elaboration.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with both parameters described in the schema (styleId and its deprecated alias id). The description adds no additional parameter-level details, so it relies on the schema's own descriptions, making the baseline of 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Set'), the resource ('default style'), and the scope ('for this user going forward'). It distinguishes itself from sibling tools like list_styles or delete_style by focusing on setting the default, not managing styles themselves.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use it ('so it doesn't need to be re-specified every time'), giving clear context on its purpose. It does not explicitly name alternatives or exclusions, but the context is sufficient for selecting this tool over related style-management tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_style_instructionsSet custom instructions for a styleA
Idempotent
Inspect

Save free-text drafting rules layered on top of a style's voice: 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'.

ParametersJSON Schema
NameRequiredDescriptionDefault
styleIdNoStyle id to scope this to, from list_styles. Omit to set the global instructions.
instructionsYesThe full instructions text for this scope, replacing whatever was there.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (write, idempotent, non-destructive), the description discloses the critical behavior of overwriting existing instructions for the scope. It also clarifies merge semantics with global instructions and how get_style_guide returns the merged result, providing context not in the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence is purposeful and informative. The description is front-loaded with the core purpose, followed by clear examples and scope behavior. No redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has no output schema, but the description fully covers when to use it, overwriting behavior, global/specific scope, merging, and return behavior via get_style_guide. It is a complete guidance for an agent invoking this setter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both parameters already have descriptions. The description adds extra nuance about merge behavior and global vs. specific scope, which exceeds the schema but is not entirely new since the schema's styleId mentions global instructions. Thus a strong 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: saving free-text drafting rules layered on top of a style's voice. It lists explicit examples of content types (required elements, audience notes, forbidden topics) and distinguishes scope (global vs. specific style), differentiating it from siblings like update_style and clear_style_instructions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage context with user quotes ('always end with a CTA') and explains when to use global vs. style-scoped instructions. It also references get_style_guide for reading merged results, effectively guiding the agent to the correct alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

train_styleTrain a voice from writing samplesAInspect

Analyze one or more of the user's own writing samples (emails, posts, essays, memos: real finished text they wrote or approved) and persist a trained voice profile under that name. Measures sentence length and variance, paragraph rhythm, contraction rate, em-dash and semicolon habits, fragment use, structural entropy (sentence-opener variety and punctuation-mark variety), and recurring phrasing. Call again with the same name and new samples to add more training data to that voice; the new samples blend into its existing measurements rather than replacing them. If the voice may have been renamed since it was created, pass its id (from list_styles) instead so the right voice is targeted regardless of its current name. This never fabricates a voice from a description; it only learns from real text the user supplies.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoDeprecated alias for styleId.
nameYesName for this voice, e.g. the user's name or a project name.
samplesYesOne or more raw text samples of the user's own writing, at least a few paragraphs each for a reliable read.
styleIdNoId of an existing trained voice to train further, from list_styles. Use this to precisely target a voice you want to add more samples to, especially if it's been renamed. Omitted: falls back to matching an existing voice by name (case/whitespace-insensitive), or creating a new one if none matches.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Since all annotations are false, the description carries the full behavioral burden. It discloses that the tool persists data, blends new samples into existing measurements rather than replacing them, and never fabricates from a description. It also details the metrics measured (sentence length, contraction rate, etc.) and explains the id fallback behavior, which goes well beyond the minimal annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is detailed but not bloated; each sentence contributes to understanding the tool's purpose, usage, and behavior. It is front-loaded with the core action and logically organized. While somewhat long, the length is justified by the tool's complexity and the need to cover metrics, id fallback, and limitations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is quite comprehensive: it explains the persistent effect, the incremental training behavior, the id fallback, and the limitation against fabrication. However, it does not describe the return value or potential error conditions, which would be useful given there is no output schema. Still, for the tool's complexity, the description is largely complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers 100% of parameter descriptions, giving a baseline of 3. The description adds meaningful usage semantics: the 'name' parameter can be reused to add training data, and the 'id' or 'styleId' can target a voice even after a rename. This enriches the static schema definitions with dynamic usage patterns.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: it analyzes the user's writing samples and persists a trained voice profile. It uses specific verbs like 'Analyze' and 'persist', and distinguishes itself from sibling tools by explicitly noting it never fabricates a voice from a description, only learning from real text. This makes the purpose unambiguous and differentiated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage context: call again with the same name and new samples to add training data, and pass the voice's id from list_styles if the voice may have been renamed. It also implies when not to use it (when a description is given, not real samples). It does not name a specific alternative tool, but the context of siblings like create_style_from_dials makes the distinction clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_styleEdit an existing custom styleA
Idempotent
Inspect

Rename a trained voice or adjust its dials in place, keeping its id (and default-style pointer) stable. Persona dials (formality, warmth, directness) always apply; the mechanical dials only take effect if the voice has no writing samples (was built from dials, not trained). A sample-trained voice keeps its measured mechanical stats regardless of what's passed here.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoDeprecated alias for styleId.
nameYesNew (or unchanged) name for this voice.
dialsYesThe 11 dial values (3 persona + 8 mechanical) that define this style's voice.
styleIdNoId of the trained voice to edit, from list_styles.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description provides important behavioral details beyond the annotations: it explains that mechanical dials are ignored for sample-trained voices, while persona dials always apply. It also notes that the id and default-style pointer remain stable. This is critical context for understanding what the tool does and what side effects occur, significantly surpassing the annotations' idempotent and non-destructive hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the core action, and carries no redundant information. Every sentence adds essential context: the action, the stable identifier, and the conditional behavior of mechanical dials. It is compact and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (nested dials object, conditional behavior, no output schema), the description covers the key nuances effectively. It explains which dials apply in which scenario, which is the most important ambiguity. Minor omissions like explicitly stating that 'name' can be unchanged or that the styleId must be specified are already covered by the schema descriptions, so the description itself is complete enough for effective use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already provides descriptions for all parameters (100% coverage), so the baseline is 3. The description adds value by grouping the dials into persona (always apply) and mechanical (conditional) categories, clarifying how the 'dials' parameter behaves in practice. This enriches the semantics beyond the individual parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Rename a trained voice or adjust its dials in place.' It specifies the exact resource (existing custom style) and the scope (keeping id and default-style pointer stable). This distinguishes it from sibling tools like create_style_from_dials or fork_style, which create new styles.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'in place, keeping its id stable' clearly indicates this tool is for modifying an existing style rather than creating or forking. It implies when to use it, though it does not explicitly name alternative tools for new styles. The context is clear enough for an agent to infer the appropriate use case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 10 tool updatesv0.1.1
    • Changedcheck_self_repetition3 fields changed
      • changedInput schema / properties / id / description
        Previous value: -"Id of the trained voice to compare against, from list_styles."New value: +"Deprecated alias for styleId."
      • addedInput schema / properties / styleId
        Added value: +{
        +  "description": "Id of the trained voice to compare against, from list_styles.",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "id",
        -  "text"
        -]New value: +[
        +  "text"
        +]
    • Changedcheck_voice_match3 fields changed
      • changedInput schema / properties / id / description
        Previous value: -"Id of the trained or custom voice to compare against, from list_styles."New value: +"Deprecated alias for styleId."
      • addedInput schema / properties / styleId
        Added value: +{
        +  "description": "Id of the trained or custom voice to compare against, from list_styles.",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "id",
        -  "text"
        -]New value: +[
        +  "text"
        +]
    • Removedcopy_dictionary
    • Changedcreate_style_from_dials1 field changed
      • addedInput schema / properties / dials / description
        Added value: +"The 11 dial values (3 persona + 8 mechanical) that define this style's voice."
    • Changeddelete_style3 fields changed
      • addedInput schema / properties / id / description
        Added value: +"Deprecated alias for styleId."
      • addedInput schema / properties / styleId
        Added value: +{
        +  "description": "Id of the trained voice to delete, from list_styles.",
        +  "type": "string"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "id"
        -]
    • Changedfork_style3 fields changed
      • changedInput schema / properties / presetId / description
        Previous value: -"Id of the preset to fork, from list_styles."New value: +"Deprecated alias for styleId."
      • addedInput schema / properties / styleId
        Added value: +{
        +  "description": "Id of the preset to fork (from list_styles), or a published style's \"handle/slug\" address.",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "presetId",
        -  "name"
        -]New value: +[
        +  "name"
        +]
    • Changedget_style_guide1 field changed
      • changedInput schema / properties / styleId / description
        Previous value: -"Preset id or trained voice id, from list_styles."New value: +"Preset id, trained voice id, or 'team', from list_styles."
    • Changedset_default_style3 fields changed
      • addedInput schema / properties / id / description
        Added value: +"Deprecated alias for styleId."
      • addedInput schema / properties / styleId
        Added value: +{
        +  "description": "Id of the style (preset or trained voice) to set as default, from list_styles.",
        +  "type": "string"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "id"
        -]
    • Changedtrain_style2 fields changed
      • changedInput schema / properties / id / description
        Previous value: -"Id of an existing trained voice to train further, from list_styles. Use this to precisely target a voice you want to add more samples to, especially if it's been renamed. Omitted: falls back to matching an existing voice by name (case/whitespace-insensitive), or creating a new one if none matches."New value: +"Deprecated alias for styleId."
      • addedInput schema / properties / styleId
        Added value: +{
        +  "description": "Id of an existing trained voice to train further, from list_styles. Use this to precisely target a voice you want to add more samples to, especially if it's been renamed. Omitted: falls back to matching an existing voice by name (case/whitespace-insensitive), or creating a new one if none matches.",
        +  "type": "string"
        +}
    • Changedupdate_style4 fields changed
      • addedInput schema / properties / dials / description
        Added value: +"The 11 dial values (3 persona + 8 mechanical) that define this style's voice."
      • changedInput schema / properties / id / description
        Previous value: -"Id of the trained voice to edit, from list_styles."New value: +"Deprecated alias for styleId."
      • addedInput schema / properties / styleId
        Added value: +{
        +  "description": "Id of the trained voice to edit, from list_styles.",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "id",
        -  "name",
        -  "dials"
        -]New value: +[
        +  "name",
        +  "dials"
        +]
  2. 20 tool updatesv0.1.0
    • First observedadd_banned_word
    • First observedadd_custom_word
    • First observedaudit_text
    • First observedcheck_self_repetition
    • First observedcheck_voice_match
    • First observedclear_style_instructions
    • First observedcopy_dictionary
    • First observedcreate_style_from_dials
    • First observeddelete_style
    • First observedfork_style
    • First observedget_style_guide
    • First observedget_style_instructions
    • First observedlist_dictionary
    • First observedlist_styles
    • First observedremove_banned_word
    • First observedremove_custom_word
    • First observedset_default_style
    • First observedset_style_instructions
    • First observedtrain_style
    • First observedupdate_style

TDQS

A4.4/5.0

Scored across 19 tools

Disambiguation5/5

Each tool targets a distinct resource and action: style lifecycle (list, get, create, update, delete, fork), voice checking (match, self-repetition), text auditing, dictionary management, and instructions. Even similar-sounding pairs like get_style_guide vs get_style_instructions are clearly differentiated by their descriptions.

Naming Consistency5/5

All 19 tools follow a consistent verb_noun snake_case pattern (list_styles, train_style, create_style_from_dials, check_voice_match, add_banned_word, etc.). There is no mixing of camelCase or inconsistent verb styles.

Tool Count4/5

With 19 tools, the set is on the heavier side but each tool serves a clear purpose within the server's broad scope of style management, auditing, and dictionary maintenance. The count is slightly over the ideal 3-15 range but still well-organized and justified.

Completeness5/5

The surface provides full lifecycle coverage for styles (create via samples or dials, read, update, delete, fork, list, set default), plus text quality checks (AI tells, voice match, self-repetition), word-list management, and instructions. There are no significant dead ends or missing core operations; the server intentionally does not generate prose directly.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server offering text analysis tools for writing improvement, including spellcheck, readability, keyword analysis, passive voice detection, and AI-generated content detection.
    10
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables Claude to write in your personal style by learning from your local documents. It provides statistical style context for natural language rewriting, all without any data leaving your machine.
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables detection and elimination of AI slop in text, providing tools to analyze writing for overused phrases, structural issues, and verbosity, and offers human writing rules tailored to context.
    3
    2
    MIT