Carves your agent’s Turkish.Leaves the meaning alone.

An open source linter for anyone writing Turkish with AI agents. It flags translation patterns and checks spelling and punctuation against the Türk Dil Kurumu (TDK) rules.

Install, one command

pipx install yontu
  • On PyPI and the MCP Registry
  • Python 3.9 to 3.14
  • no dependencies
  • MIT license
A real run

Herşey hazır, Türkçe'de yazdığımız metni kontrol edelim ve bitirelim. Umarım yardımcı olur.

yontu lint not.md
not.md:1:1: hata BK-01 [tdk] Bu söz ayrı yazılır. “Herşey” → Her şey
not.md:1:15: hata KS-02 [tdk] Dil adlarına gelen ekler kesmeyle ayrılmaz. “Türkçe'de” → Türkçede
not.md:1:71: bilgi AI-E1 [ai-iz] Sohbet kapanışı. Metinde gereksiz. “Umarım yardımcı olur”
not.md: 2 hata, 0 uyarı, 1 bilgi · notr/- (içerik 0,00)

Rules written for English find little in Turkish

Most humanizers lean on English word lists such as “delve” and “tapestry”. Turkish AI text gives itself away elsewhere: sentence after sentence ending in “kullanılmaktadır”, calques, and chatbot leftovers like “Umarım yardımcı olur” (hope this helps).

One README, before and after yontu

  • abc dropped in the rewrite
  • AI-D15 rule the linter reported

Before: README.md

yontu: Türkçe Metinler İçin Modern VeBH-13 Güçlü Bir Linter

yontu, Türkçe metinlerinizi analiz ederek yazım hatalarını, noktalama sorunlarını ve yapay zekâ izlerini tespit eden, modern, güçlü ve kullanıcı dostuAI-D15 bir araçtır. Projenin temel amacı, yazım kalitenizi bir üst seviyeye taşımaktırAI-D13!

Kullanım: Analiz işlemini gerçekleştirmekYS-A25 için aşağıdaki komutu kolayca çalıştırabilirsiniz: yontu lint metin.md

yontu lint metin.md --tur readme
metin.md:1:36: uyarı BH-13 [tdk] Başlıkta büyük yazılan sözler arasında "ve", "ile", "ya", "veya", "ki", "de", "mi" küçük yazılır. “Ve” → ve
metin.md:3:49: bilgi AI-C8 [ai-iz] Aynı paragrafta birden çok üçlü sıralama var. (2 kez, eşik 2) “hatalarını, noktalama sorunlarını ve yapay”
metin.md:3:119: bilgi AI-D15 [ai-iz] Pazarlama sıfatı üçlüsü. Aracın ne yaptığını yazın. “modern, güçlü ve kullanıcı dostu”
metin.md:3:204: bilgi AI-D13 [ai-iz] Kalıp vaat: "bir üst seviyeye taşımak". Neyin nasıl değiştiğini yazın. “bir üst seviyeye taşımaktır”
metin.md:5:11: bilgi YS-A25 [yogunluk] Hafif fiil kalıbı: "-mA işlemini gerçekleştirmek". “Analiz işlemini gerçekleştirmek” → fiilin kendisi
metin.md: 0 hata, 1 uyarı, 4 bilgi · teknik/readme (flag)

After: README.md

yontu: Türkçe metinler için linter

yontu, Türkçe metindeki yazım hatalarını, noktalama sorunlarını ve yapay zekâ izlerini bulan bir linterdir.

Kullanım: yontu lint metin.md

yontu lint yontulmus.md --tur readme
yontulmus.md: 0 hata, 0 uyarı, 0 bilgi · teknik/readme (flag)
yontu compare metin.md yontulmus.md
uyarı SD-06 Çıkarılan öğe (ad): Modern
uyarı SD-06 Çıkarılan öğe (ad): Güçlü
uyarı SD-08 Kip belirteci değişti (olanak): 1 → 0.
sadakat: 0 hata, 3 uyarı

Kept: the name, the three things it finds, the command. Dropped: the adjective triad, the exclamation, “kolayca” (easily). The title moved to sentence case. Nothing was added.

The sample is from skills/yontu/references/ornekler.md in the repository, with output from yontu 0.1.0. It stays in Turkish because that is what the tool reads.

What it looks at

  • TDK spelling and punctuation

    BK-01 · KS-02

    Every rule names the Yazım Kılavuzu section or Güncel Türkçe Sözlük entry it comes from. Autofix runs only on deterministic rules.

  • AI tells that are Turkish

    AI-E1 · AI-C18

    Suffix chains, calques, wrappers like “konusunda” and “bir şekilde” that stand in for a case ending, and chatbot sign offs.

  • Measured by genre

    --tur readme

    What is normal in an academic abstract is a tell in a blog post. yontu knows 28 genres under 17 registers, each with its own thresholds.

  • Rewrites that cannot add facts

    yontu compare

    If a new number, date, name, URL or code span shows up, the comparison fails. The agent reverts that edit.

How it works

  1. Install

    The CLI and the MCP server come from PyPI. The Claude Code plugin adds hooks on top.

    pipx install yontu
  2. Lint

    Each finding comes with line, column, rule id, level and a suggestion. Pass the genre and the thresholds follow it.

    yontu lint metin.md --tur readme
  3. Gate the rewrite

    The rewritten version is compared with the original. If it carries new facts, the command exits with 1.

    yontu compare eski.md yeni.md

The proof is in the repository

It is all in the repository. Run the tests yourself and reproduce every output below on your own machine.

dependencies
0, Python standard library only
MCP
hand written JSON-RPC, no SDK
tests
251 unit tests, run in CI on every change
Python
3.9, 3.10, 3.11, 3.12, 3.13, 3.14 and macOS
version
0.1.0, on PyPI and the MCP Registry
release
GitHub Releases with SHA256 checksums

The gate catches an added date

Fixing a meeting note, the agent changed the date and added a time. The comparison reports two errors and exits with 1.

eski.md (old)

Toplantı 12 Kasım günü yapılacak.

yeni.md (new)

Toplantı 14 Kasım günü saat 10.00'da yapılacak.

yontu compare eski.md yeni.md
hata SD-02 Yeni tarih: 14 Kasım
uyarı SD-06 Çıkarılan öğe (tarih): 12 Kasım
hata SD-01 Yeni sayı: 10.00
sadakat: 2 hata, 1 uyarı
exit code 1

Every rule names its source

yontu explain shows a rule’s layer, level, source, and what it catches and what it leaves alone.

yontu explain KS-02
kimlik     KS-02
katman     tdk
düzey      error
kanıt      kaynak
ileti      Dil adlarına gelen ekler kesmeyle ayrılmaz.
kaynak     TDK Yazım Kılavuzu, Kesme İşareti
yakalar    Türkçe'de bu böyle.
yakalamaz  Türkçede bu böyle.

Safe fixes only where the rule is certain

“Herşey” and “Türkçe’de” get fixed. The closer “Umarım yardımcı olur” is flagged, not deleted. That call belongs to the writer.

yontu lint not.md --fix
Her şey hazır, Türkçede yazdığımız metni kontrol edelim ve bitirelim. Umarım yardımcı olur.

Questions

Is yontu an AI detector?

No. yontu reports patterns. A finding does not mean a text was machine written, and a clean report does not mean it was not. Passing a detector is not a goal.

Does my text go to a server?

No. The linter makes no network calls and every rule runs on your machine. The MCP server is a local process too.

Which agents does it work with?

Claude Code, Codex CLI, Cursor, Gemini CLI and any MCP client. On claude.ai the skill is uploaded as a zip. Config files for other tools are in the integrations folder of the repository.

Does it fix the text itself?

Only for deterministic rules in the tdk layer, and only when you pass --fix. AI patterns are never fixed automatically. The agent rewrites, yontu checks.

Will it report false positives?

Yes. The ai-iz, stil and yogunluk rules are regular expressions and counts over surface forms, with no morphological analysis. That is why most of them stay at info.

Which kinds of text does it know?

28 genres under 17 registers, from academic abstracts to commit messages and from petitions to ad copy. Without a genre, it guesses the register from the content.

What does it need?

Python 3.9 or newer. Nothing else gets installed.

Does it cost anything?

No. yontu is open source under the MIT license.

Does it have a dictionary?

No. It catches known misspellings, not every misspelling. The thresholds are not yet calibrated on a corpus of human writing either.

Trying it costs you nothing

FreeOpen sourceNo dependenciesOffline

No license fee, account or API key. The code is MIT licensed and the source of every rule is in the repository. It uses only the Python standard library, and your text never leaves your machine.

Carves your agent’s Turkish.Leaves the meaning alone.

An open source linter for anyone writing Turkish with AI agents. It flags translation patterns and checks spelling and punctuation against the Türk Dil Kurumu (TDK) rules.

Install, one command

pipx install yontu
  • On PyPI and the MCP Registry
  • Python 3.9 to 3.14
  • no dependencies
  • MIT license

Other ways to install

  • Claude Code plugin

    Skill, MCP server and hooks together. Commands: /yontu:turkcelestir, /yontu:yontu-lint.

    /plugin marketplace add senrecep/yontu
    /plugin install yontu@yontu
  • Any agent that reads skill folders

    Copies the skill only. No MCP server, no hooks.

    npx skills add senrecep/yontu
  • MCP server

    One line for Claude Code. Other clients put the same command in their config file.

    claude mcp add yontu -- uvx yontu mcp
  • claude.ai

    Download the skill as a zip and upload it under Customize, then Skills. Code execution has to be on.

    Download yontu-skill.zip