Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add silly-geese/estonian-mcp --skill estonian-writing-assistantgit clone --depth 1 https://github.com/silly-geese/estonian-mcpWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/silly-geese/estonian-mcp/estonian-writing-assistant)<a href="https://agentmods.dev/skills/silly-geese/estonian-mcp/estonian-writing-assistant"><img src="https://agentmods.dev/badge/skills/silly-geese/estonian-mcp/estonian-writing-assistant/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/silly-geese/estonian-mcp/estonian-writing-assistant"><img src="https://agentmods.dev/badge/skills/silly-geese/estonian-mcp/estonian-writing-assistant.svg" alt="Reviewed on agentmods" width="80" height="20"></a>- NVIDIA SkillSpector pass
What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00320 | $0.10478 |
| Opus 5.5 | $0.00128 | $0.04191 |
| Sonnet 5.5 | $0.00064 | $0.02096 |
| Haiku 4.5 | $0.00032 | $0.01048 |
Grade A, and why
estonian-writing-assistant scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 8d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 562 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Estonian writing assistant
Estonian has 14 cases, vowel harmony in compounds, productive subword morphology, and a quantity-grade system that's easy to get wrong. Models that haven't been heavily fine-tuned on Estonian will confidently hallucinate plausible-looking but incorrect inflections. This skill exists to prevent that: use the estonian-mcp tools as ground truth for any factual claim about an Estonian word.
The hard rule, applied throughout this skill:
Never assert an Estonian lemma, case form, conjugation, spelling, or compound split without verifying it with the MCP. If you're tempted to write "the partitive is X" or "this verb's stem is Y" from memory, stop and call the tool first.
Tools at a glance
| Tool | When to reach for it |
|---|---|
spell_check |
First pass on any Estonian text the user wrote. Cheapest validation. |
lemmatize |
Get dictionary forms: for vocabulary study, deduping word stems, citation. |
analyze_morphology |
Full analysis with case form, root and ending, plus, where they apply, compound parts, an ambiguity count, an indeclinable flag and a usage flag (archaic / foreign / interjection / abbreviation / proper-noun). The authoritative tool when discussing grammar. |
paradigm |
Generates the full inflection paradigm for a word: all 14 cases for nouns plus the short illative where a word has one (majja beside majasse), ~39 forms for verbs. Proper nouns inflect too (Tallinn → Tallinnasse); a name Vabamorf lacks gets an empty table, never invented forms. Use when the user asks "what's the X-case of Y" or wants to see every form. Don't try to recall paradigms from memory. |
pos_tag |
When you only need POS, e.g., filtering a list to nouns. |
tokenize |
Sentence + word boundaries. Useful before per-sentence operations. |
synonyms |
Same-meaning alternatives via Estonian WordNet. Returns synsets grouped by sense. |
find_related_words |
Semantically nearby words via fastText. Broader than synonyms: includes near-synonyms, related concepts, and (sometimes) antonyms. |
classify_register |
Heuristic formal/colloquial score with markers + consistency.is_mixed flag for register-mixed text (formal + colloquial markers in the same draft = jarring). |
check_style |
Four style metrics in one call: lemma-aware repetition (catches 'kasutab' / 'kasutas' both under lemma 'kasutama'), Estonian passive-voice ratio (-takse/-ti/-tud family), sentence-length mean+stddev, hedging-word density. Use for newsletter / ad / email polish. |
check_redundancy |
Pleonasm / semantic-doubling check: flags samuti ka (also+also), kõige optimaalsem (most+optimal), and fixed redundant phrases. Run it before claiming a redundancy "the MCP can't catch": it catches the common ones. |
check_object_case |
Käändeõpetus heuristic. Catches the most common confidently-wrong Estonian: direct-object case after negation (must be partitive) and after partitive-only verbs (armastama, vihkama, vajama, …). Lexicon-based, no syntactic parser; only flags nouns AFTER the trigger so subject-noun false positives are minimal. An issue gives the noun's lemma and form, not a correction: take the partitive in the number form shows from paradigm. A negated sentence containing olema (pole näinud) is not checked for negation. It also checks verb government: teavitama / informeerima take the person in the partitive (teavitas politseid), teatama takes the recipient in the allative (teatas politseile), so teavitas politseile and Teatame Teid are flagged with both fixes in suggestion. Recall is about half by design: an allative that belongs to a participle (teavitada isikut talle seatud piirangust) is correct and stays quiet. |
check_abbreviation_hyphenation |
Lühendiortograafia: flags an ending that starts with l written straight onto an all-capital abbreviation (OÜle → OÜ-le, ÜROlt → ÜRO-lt, THIl → THI-l), where EKI finds the hyphen clearer. EKI accepts every other hyphenless form (ELi, ELis, APIga, MCPst, ASidel are as correct as EL-i, EL-is, API-ga, MCP-st, AS-idel), so do not "fix" them: keep the text's own choice. A letter whose name ends in a consonant takes the stem vowel, so ASle is misinflected and the suggestion is AS-ile. Any all-capital stem is checked, known or not; a mixed-case one (SaaSi, PhDga) and a chloride formula (HCl, NH4Cl) are not. |
check_compound_familiarity |
Attestation check for each compound noun: is the lemma in the fastText corpus vocabulary (in_vocab), in Estonian WordNet (in_wordnet), or a legal term of art? Read attested first, and read attested: false for what it is: outside a 100K-word vocabulary, which is the normal state for correct specialist vocabulary. lisakäive, klikkimismäär, koolitoit, rehvivahetus are all unattested here and all ordinary Estonian, so unattested is NEVER on its own a reason to rewrite. is_suspect is narrow: unattested AND the nearest neighbour is a real word AND that similarity is still under 0.55 (mõtteliin, 0.536). Recall is low on purpose: a coinage scoring inside the band real vocabulary occupies is missed rather than bought at the price of flagging good Estonian, so toortõlkeoht (0.571) passes. neighbour_quality.signal: none means the nearest neighbour is a scrape-artifact token, the score means nothing, and no verdict is offered. Note the other limit too: a compound that is merely stilted rather than invented (teadusandmestik) passes, because similarity can't judge register, so use check_officialese for that. Run on any Estonian compound you yourself produced (rather than verbatim user input). |
check_domain_terms |
For Estonian written about an organisation's own systems. Reports the compounds that are unattested AND not on the organisation's glossary or identifier list. That says only that the word is not the organisation's: it may be a name you coined, or ordinary Estonian the lexicons lack (vagunisõit is common). Where it names something the organisation has a word for, or something with an identifier, use theirs. When there are glossary terms, each comes with up to three of them spelled alike (suggestions): look-alikes, not synonyms, so replace the compound only when a suggestion names the same thing. contains_glossary_term marks a compound built on a glossary term (vagunireisitabel on vagunireis), which is ordinary Estonian and must not be shortened to the term. The hosted server has no glossary of its own, so pass the organisation's terms in glossary (up to 1,000). With no glossary at all it is only the unattested list, which is never on its own a reason to rewrite. |
check_officialese |
Kantseliit check for non-legal prose: reports, academic writing, business copy, grant/R&D paperwork. Use this, not check_legalese, for anything that isn't a statute or contract: check_legalese's lexicon and 34-word gate are tuned for legislation and return nothing on report officialese. Gives nominalisation density with the verb to swap in (hindamine → hindama), correctly-counted umbisikuline tegumood, clause stacking, Estonian-calibrated sentence length, and admin filler. Also läbi viima in every form with a verb in the same form (viidi läbi → korraldati / tehti, pidama for a meeting), translated letter phrases (calque-phrase: Palun leidke manuses, ärge kõhelge ... võtmast, kiri leiab teid hästi, tänan teid teie ... eest, vaatan edasi koostööle, sealhulgas, kuid mitte ainult, antud juhul) and the request Küsin täpsemalt, kas … (kusin-tapsemalt → Palun täpsustage, … / Sooviksin täpsemalt teada, …). All of these are style hints: say so when you pass them on. |
check_translationese |
English sentence structure and English habits of form that make Estonian read as translated: teie andmed where the subject's own thing is oma andmed, lähtume me, a third of the sentences opening with Ma, Kui ..., me saadame (the verb comes first after a fronted clause), saab olema, ettepanek võtmaks, Tagamaks, Mitte leides, tänu with a bad cause, minu arvamusel, a letter's Hea Mari, / Tere Mari / Lugupidamisega,, the serial comma (teed, ja), title case in headings. Run it on every Estonian text you write or translate. maks-purpose and subject-pronoun are style hints. |
check_term_consistency |
One referent, one term. Run on any document longer than a couple of paragraphs: catches andmestik in §1, teadusandmestik in §2, pildiandmestik in §3. Reports per-variant counts so you can standardise on the dominant one. Pass the organisation's terms in glossary when you have them (up to 1,000; the hosted server has none of its own): when exactly one variant in a group is listed, the group names it preferred, so standardise on preferred when present and otherwise on dominant. Read each group before rewriting: some are genuinely distinct concepts. |
check_capitalization |
Algustäheortograafia (initial-letter orthography) check per EKI Reeglid. Flags weekdays, months, nationalities, and language/culture adjectives wrongly capitalized mid-sentence. A hit at the start of a line, list item or quotation, or inside a proper name (Eesti Keele Instituut), is usually false. Run on every Estonian text you produce. |
check_compounds |
Liitsõnaõigekiri: flags common compound splits the model produces (kooli maja → koolimaja). Lexicon-based, phase 1. |
check_punctuation |
Kirjavahemärgid: flags missing commas before subordinating conjunctions (et, sest, kuna, kuid, vaid, nagu, …). The comma-before-clause rule only. A comma before a two-part connective (nii et, selleks et) passes. With none, ilma et and olgugi et get it before the pair; the others get it before et, which suits manner (Tegin nii, et kõik said aru) but not result (Sadas vihma, nii et jäime koju). nagu is flagged only before a verb, so tugev nagu karu passes, but Kassid nagu kõik koduloomad vajavad hoolitsust and punane nagu tuli still flag, and nagu meaning näiteks (Riigid, nagu Soome ja Rootsi, ...) is never flagged: give those a second look. comma-after-subordinate-clause flags the comma that closes an embedded clause before the main verb (Mees, kes seal seisis oli minu isa → , oli); the comma belongs there at the latest and may belong earlier. comma-before-ja-after-subordinate-clause flags ja after a kes/mis clause when the verb after ja changes person back to the main clause's (Juhtisin projekti, mis kestis kaks aastat ja koolitasin … → , ja). EKI keeps that comma (reegel 44, märkus 2), so never delete a comma before ja that closes a clause. |
check_hyphenation |
Poolitamine: returns line-break positions for a word; compound seams are among them but not singled out, so pick the seam yourself. Use only when typesetting/line-breaking matters; skip in normal writing. |
check_numbers |
Numbrite õigekirjutus: flags decimal-separator (period vs comma) and thousands-separator (comma vs space) violations. It skips times after kell, time ranges, dates (14.05), clause, section and version numbers (4.13. Tellija, punkt 3.2, Python 3.12). It flags 1,250 as a thousands separator with the suggestion 1250 (EKI writes four digits together and groups from five: 12 500); if you meant the decimal 1,25, keep it. A time without kell mid-sentence (väljub 8.47 ja) is still flagged, and a date-shaped decimal with no unit (1.05 ja) is skipped, so judge a hit or a miss next to a time or a date yourself. approximate-tilde: a tilde used as "about" before a number (~50 inimest) gets u 50, or Umbes 50 at a sentence start; EKI writes rounded numbers with u (no period), umbes or ligikaudu and keeps the tilde for variants (mina ~ ma). ca 50 and u. 50 are fine; leave them. A spaced A ~ 5 after a word, ≈, code, paths and 5~10 are not flagged. month-year-digits: a month and year in digits (09.2016) is a date, and EKI finds the month in words clearer: sept 2016 (the abbreviation needs no case ending: alates sept 2016; a full name does: alates märtsist 2019). range-spacing: no spaces around the dash of a range whose ends contain none (2020 - 2024 → 2020-2024, 5 - 10 päeva → 5-10); typeset EKI text uses the mõttekriips there, and a hyphen strictly means "ja" between consecutive numbers (14-15 eurot). Keep the spaces when an end contains one (9000 - 10 000, aprill 2008 - august 2009); write ordinal ranges as 2015.-2019. aastal and seasons as 2019/2020. percent-sign-suffix: 20%-line → 20% or 20-protsendiline; case endings (10%-st) are fine. |
named_entities |
PER/LOC/ORG extraction. Useful for summarisation and content audit. |
syllabify |
Per-syllable breakdown with quantity + accent. Useful for slogan rhythm, song lyrics, or pronunciation guides. |
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 8d ago Changed · +52 lines · +26 tokens per session 222174ccdcda
- 10d ago Changed · +115 lines bb7957cd5b21
- 15d ago Changed · +5 lines 14b348fb7dae
- 1mo ago Changed · +1 lines a59dca29353f
- 1mo ago Changed · +5 lines 5275e71b849a
- 1mo ago Changed · +3 lines f893029483e4
- 2mo ago Changed e067a76c3b4f
- 2mo ago First seen · 381 lines · 294 tokens per session scan A daafa804c763
estonian-writing-assistant is a skill published in the GitHub repository silly-geese/estonian-mcp (25 stars, last pushed yesterday), licensed Apache-2.0. It adds 320 tokens to every session and 10,478 once invoked, about $0.0013 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
estonian-writing-assistant compared with skills from other repositories
| Mod | Type | Stars | Last push | Licence | Scan | Tokens | Works with |
|---|---|---|---|---|---|---|---|
| estonian-writing-assistantsilly-geese/estonian-mcp | Skill | 25 | yesterday | Apache-2.0 | A | 320 | Claude Code, Codex |
| opik-diagnosecomet-ml/opik-mcp | Skill | 225 | 9d ago | Apache-2.0 | A | 187 | Claude Code |
| dcc-blender-assembly-pitfallsdcc-mcp/dcc-mcp-blender | Skill | 60 | yesterday | MIT | A | 153 | Claude Code |
| virality-analysismtarcure/claude-vibe-squad | Skill | 228 | 9d ago | MIT | A | 56 | Claude Code, Codex |
| color-theorymtarcure/claude-vibe-squad | Skill | 228 | 9d ago | MIT | A | 62 | Claude Code, Codex |
| client-scriptsserac-labs/serac | Skill | 77 | 17d ago | Apache-2.0 | A | 45 | Claude Code |
| quantum-algorithmsxi-zhao/OpenQuantum | Skill | 71 | yesterday | MIT | A | 34 | Claude Code, Codex |