# ruTS-mcp (pypi · ruts-mcp)

MCP server for ruTS: statistics of Russian texts as tools for LLM agents

- Trust score: 69/100 (medium)
- Change this week: +15
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- pypi · `ruts-mcp`: 69/100 (this document), [markdown](https://verifymcp.io/servers/sergeyshk-ruts-mcp/ruts-mcp.md), [page](https://verifymcp.io/servers/sergeyshk-ruts-mcp/ruts-mcp)

## Channel facts

- Registry: `pypi`
- Package: `ruts-mcp`
- Version: `0.1.4`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Supply Chain Security**: 99/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - Runs hatchling.build at install time, a recognised build step with no custom scripting around it.
  - 10 of 76 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 6 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 70/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 5041 tokens (~560/item across 9 items; 6 tools + 3 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 6 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 8 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### How do I install the ruTS-mcp server?

ruTS-mcp runs locally as a PyPI package, launched with uvx ruts-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add sergeyshk-ruts-mcp -- uvx ruts-mcp
```

### Cursor

```json
{
  "mcpServers": {
    "sergeyshk-ruts-mcp": {
      "command": "uvx",
      "args": [
        "ruts-mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "sergeyshk-ruts-mcp": {
      "command": "uvx",
      "args": [
        "ruts-mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add sergeyshk-ruts-mcp -- uvx ruts-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "sergeyshk-ruts-mcp": {
      "type": "local",
      "command": [
        "uvx",
        "ruts-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add sergeyshk-ruts-mcp --command uvx --arg ruts-mcp
```

### Hermes

```yaml
mcp_servers:
  sergeyshk-ruts-mcp:
    command: "uvx"
    args: ["ruts-mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "sergeyshk-ruts-mcp": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "ruts-mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add sergeyshk-ruts-mcp -t stdio -c uvx -a ruts-mcp
```

### Other

```json
{
  "mcpServers": {
    "sergeyshk-ruts-mcp": {
      "command": "uvx",
      "args": [
        "ruts-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-05 (score 69, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-11-03 (score 54, −15)

- [security regression] Malware scan: pass → unverified

### 2026-11-02 (score 69, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-10-29 (score 54)

First indexed and scored.

## MCP tools (6)

### `analyze_text` (~1667 tokens)

Анализ русского текста

Измерить русский текст статистиками библиотеки ruTS.

Используйте, чтобы получить точные числа о тексте, а не оценивать его на глаз. Считаются только запрошенные группы. Текст из файла передавайте через path, а не пересылайте целиком: так быстрее, и статистики считаются по исходному тексту.

Группы статистик:
\- basic: предложения, слова, слоги, символы, буквы, пробелы и знаки препинания; уникальные, длинные (от 6 букв), сложные (от 4 слогов), простые, односложные и многосложные слова с долей от всех слов; энтропия длин слов в буквах и слогах.
\- readability: удобочитаемость - сводный класс и формулы Флеша-Кинкайда, Флеша, Колман-Лиау, SMOG, ARI, LIX, RIX, Соловьёва-Иванова-Солнышкиной, Мацковского, Тулдавы, Дейла-Чейла и Ганнинга, время чтения; формулы класса и сводный класс читаются классом школы и возрастом читателя, индекс Флеша, LIX и RIX - полосой своей шкалы, у формул Мацковского и Тулдавы и времени чтения шкалы нет.
\- diversity: лексическое разнообразие - TTR и поправки к нему, MATTR, MSTTR, MTLD, HD-D, индексы Симпсона, Юла и Оноре, мера Орлова, энтропия, законы Ципфа и Хипса, взрывность частых слов.
\- morph: морфология по pymorphy3 без снятия омонимии - части речи и 15 грамматических признаков (число и доля слов с каждым значением) и доли форм глагола: наклонения, инфинитив, причастия, деепричастия, совершенный вид, страдательные и возвратные формы.
\- phon: фоностатистики по буквам, без ударения, оглушения и редукции - доли гласных, сонорных, звонких и глухих согласных, тяжелые сочетания согласных, зияния, жесткость, открытые слоги, индексы аллитерации и ассонанса.
\- cohesion: связность по образцу Coh-Metrix и TAACO - повторы существительных, аргументов и знаменательных слов между предложениями (соседними, всеми парами, двумя следующими) и между соседними абзацами (абзац - строка текста), местоимения, данность, повтор времени и вида, коннекторы на 1000 слов - межпредложенческие и внутрипредложенческие, по классам.
\- lexical: лексическая сложность по частота…

Input parameters:

- `descriptions` (boolean): Добавить к статистикам описания; false - короче ответ, когда описания уже известны по прошлому вызову
- `distributions` (boolean): Добавить распределения слов по числу букв и слогов и знаков препинания по типам (группа basic)
- `groups` (array): Группы статистик; каждая - ключ результата
- `path`: Абсолютный путь к текстовому файлу в UTF-8 на машине, где запущен сервер, вместо text: длинный текст не нужно пересылать в аргументе
- `readability_preset` (string): Коэффициенты теста Флеша-Кинкайда (у academic - и индекса Флеша), группа readability: plainrussian откалиброван по школьным классам и подходит для любых текстов, в том числе художественных; fiction -…
- `text` (string): Текст на русском языке; вместо него можно задать path

### `kwic` (~334 tokens)

Конкорданс

Найти все вхождения слова или словосочетания в тексте с контекстом (конкорданс KWIC).

Используйте, чтобы увидеть, как слово употребляется в тексте, и цитировать точно. Слова сравниваются без учета регистра и буквы ё, с by_lemma - по леммам pymorphy3; словосочетание не переходит через конец предложения.

В результате "n_matches" - число вхождений, "matches" - строки по порядку в тексте: контекст слева "left", вхождение "keyword", как оно записано в тексте, и контекст справа "right". Строки ограничены параметром limit и общим объемом ответа около 40 тысяч символов. Ключ "warnings" - предупреждения: текст не на русском языке, показаны не все вхождения.

Input parameters:

- `by_lemma` (boolean): Искать все формы слова по лемме: «кот» находит «кота», «коты»
- `keyword` (string, required): Слово или словосочетание
- `limit` (integer): Наибольшее число строк ответа
- `path`: Абсолютный путь к текстовому файлу в UTF-8 на машине, где запущен сервер, вместо text: длинный текст не нужно пересылать в аргументе
- `text` (string): Текст на русском языке; вместо него можно задать path
- `window` (integer): Число слов контекста слева и справа

### `collocations` (~466 tokens)

Коллокации

Найти коллокации текста - пары слов, которые встречаются вместе чаще, чем случайно.

Используйте для устойчивых сочетаний, терминологии и сочетаемости слова (параметр node). Пара упорядочена: правое слово стоит не дальше window слов после левого. Леммы pymorphy3 берутся без снятия омонимии.

В результате "n_words" - число слов текста, "measure" - мера и как ее читать, "collocations" - пары по убыванию меры: левое слово "left", правое "right", их частоты "freq_left" и "freq_right", частота пары "freq_pair" и значение меры "score". freq_pair - число пар позиций, где правое слово стоит в окне после левого: слово, повторенное в окне, дает несколько пар, поэтому freq_pair бывает больше частоты слова, и такая пара - повтор, а не устойчивое сочетание. Ключ "warnings" - предупреждения: текст не на русском языке, слова node нет в тексте, пар с такой частотой нет.

Input parameters:

- `lemmatize` (boolean): Сравнивать леммы: «точка зрения» и «точки зрения» - одна пара
- `measure` (string): Мера ассоциации: logdice - устойчивость пары, не зависит от размера текста; mi завышает редкие пары; mi3 и t_score отдают предпочтение частым
- `min_freq` (integer): Наименьшее значение freq_pair - числа пар позиций в окне
- `node`: Слово, сочетаемость которого нужна; не задано - все пары
- `path`: Абсолютный путь к текстовому файлу в UTF-8 на машине, где запущен сервер, вместо text: длинный текст не нужно пересылать в аргументе
- `text` (string): Текст на русском языке; вместо него можно задать path
- `top_n` (integer): Число коллокаций в ответе
- `window` (integer): Наибольшее расстояние между словами пары; 1 - биграммы

### `dispersion` (~553 tokens)

Дисперсия слов

Измерить, насколько равномерно слова распределены по тексту (дисперсия Гриса).

Используйте, чтобы отличить слово, которое проходит через весь текст, от слова, сосредоточенного в одном месте: частота их не различает. Текст делится на parts частей примерно равного размера.

В результате "n_words" - число слов текста, "words" - слова в порядке запроса или по убыванию частоты, с частотой "freq" и мерами дисперсии:
\- dp: отклонение пропорций DP Гриса, основная мера; 0 - слово распределено пропорционально размерам частей, наибольшее значение около 1 - 1/parts - все вхождения в одной части.
\- dp_norm: DP, деленное на наибольшее возможное значение; 1 - все вхождения в самой малой части.
\- juilland_d: D Жюйана; 1 - равномерно, 0 - в одной части.
\- carroll_d2: D2 Кэрролла по энтропии распределения; 1 - равномерно, 0 - в одной части.
\- rosengren_s: S Розенгрена; 1 - пропорционально, около 1/parts - в одной части.
\- kl_divergence: дивергенция Кульбака-Лейблера в битах; 0 - пропорционально, растет при сосредоточении.
У слова, которого нет в тексте, частота 0 и меры null. Слово с частотой меньше parts не может попасть во все части, и его меры показывают сосредоточенность даже при самом ровном распределении. Ключ "warnings" - предупреждения: текст не на русском языке, слов нет в тексте, частота слов меньше числа частей.

Input parameters:

- `lemmatize` (boolean): Сравнивать леммы: формы слова считаются одним словом
- `parts` (integer): Число частей текста примерно равного размера
- `path`: Абсолютный путь к текстовому файлу в UTF-8 на машине, где запущен сервер, вместо text: длинный текст не нужно пересылать в аргументе
- `text` (string): Текст на русском языке; вместо него можно задать path
- `top_n` (integer): Число самых частых слов, если words не задано
- `words`: Слова, дисперсия которых нужна; не задано - самые частые слова

### `keyness` (~692 tokens)

Ключевые слова

Найти ключевые слова текста - слова, которые в нем значимо чаще (или реже), чем в эталоне.

Используйте, чтобы понять, чем лексика текста отличается от обычного языка (эталон по умолчанию - частотный словарь, его нужно скачать командой ruts-mcp download) или от другого текста (reference или reference_path). Слова сравниваются в нижнем регистре и с е вместо ё. Со словарем числа и слова с латиницей отбрасываются, а слово вне словаря получает его наименьшую частоту (freq_reference около 37): имена, термины и опечатки попадают в ключевые слова. Статьи словаря, которые лемматизатор не дает (его, ее, их, во, со), в слова, которые чаще в эталоне, не попадают: в тексте эти формы относятся к другим леммам (он, она, они, в, с).

В результате "n_words" - число слов текста, которые сравниваются с эталоном, "reference" - эталон, "measure" - мера сортировки и как ее читать, "keywords" - слова по убыванию меры: частота в тексте "freq_target" и в эталоне "freq_reference", они же на миллион слов "ipm_target" и "ipm_reference", логарифм правдоподобия "g2" (значимость, со знаком минус - слово чаще в эталоне) с p-значением "p_value", Log Ratio "log_ratio" (размер эффекта; при нулевой частоте в эталоне - оценка с поправкой 0,5, бывает меньше 0) и значение меры "score". p_value не поправлено на число проверенных слов: надежнее p < 0,0001 (g2 от 15,13). Ключ "warnings" - предупреждения: текст не на русском языке, ключевых слов нет.

Input parameters:

- `lemmatize` (boolean): Сравнивать леммы; с частотным словарем леммы сравниваются всегда
- `measure` (string): Мера для сортировки: log_likelihood - значимость различия, log_ratio - во сколько раз слово чаще
- `min_freq` (integer): Наименьшая частота слова там, где оно чаще
- `path`: Абсолютный путь к текстовому файлу в UTF-8 на машине, где запущен сервер, вместо text: длинный текст не нужно пересылать в аргументе
- `positive` (boolean): Слова, которые чаще в тексте; false - которые чаще в эталоне
- `reference`: Текст-эталон; не задано (и не задан reference_path) - частотный словарь Ляшевской и Шарова (современный русский язык, 92 млн словоупотреблений)
- `reference_path`: Абсолютный путь к файлу с текстом-эталоном вместо reference
- `text` (string): Текст на русском языке; вместо него можно задать path
- `top_n` (integer): Число ключевых слов в ответе

### `compare_texts` (~893 tokens)

Сравнение корпусов

Сравнить два корпуса текстов по признакам стиля и найти, чем они различаются сильнее всего.

Используйте для атрибуции авторства, сравнения жанров, переводов, текстов человека и модели. Тексты режутся подряд на окна ровно по window слов (whole_texts - тексты целиком), у каждого окна считаются около 150 признаков ruTS, и распределения признака в корпусах A и B сравниваются. Остаток текста короче окна и текст короче окна отбрасываются: ответ предупреждает о таких текстах и о потере больше 10 % слов корпуса на остатках. Для сравнения нужно хотя бы по два окна в каждом корпусе. Тексты из файлов передавайте через a_paths и b_paths.

Признаки по префиксам: basic_ - доли длинных, сложных, одно- и многосложных слов, букв, пробелов и знаков, буквы и слоги на слово; readability_ - формулы удобочитаемости; diversity_ - меры лексического разнообразия; morph_ - доли частей речи, отрицаний и кратких форм от слов (morph_pos_NOUN, morph_polarity_Neg, morph_style_variant_Short) и значений остальных признаков внутри признака (morph_case_Gen, morph_tense_Past); sents_ - средняя длина предложения в словах, ее стандартное отклонение, коэффициент вариации и автокорреляция соседних длин; punct_ - знаки по типам на 1000 слов и доля буквы ё; cohesion_ - статистики связности: повторы между предложениями, местоимения, данность, повтор времени и вида, коннекторы на 1000 слов.

В результате "window" - размер окна (null - тексты целиком), "n_windows" и "n_texts" - число окон и текстов в A и B, "features" - признаки по убыванию модуля дельты Клиффа, при равной дельте - по относительной разности медиан: средние по окнам "mean_a" и "mean_b", разность медиан A - B "median_diff" с 95% бутстрэп-интервалом "ci_low" - "ci_high", дельта Клиффа "cliff_delta" (от -1 до 1: доля пар окон, где в A больше, минус доля, где меньше; по модулю от 0,147 - малый, от 0,33 - средний, от 0,474 - большой эффект, Romano и др. 2006) и p-значение U-критерия Манна-Уитни с поправкой Холма на число признаков "p_holm". Окна о…

Input parameters:

- `a` (array): Тексты первого корпуса (A)
- `a_paths` (array): Абсолютные пути к файлам с текстами корпуса A, вместе с a или вместо
- `b` (array): Тексты второго корпуса (B)
- `b_paths` (array): Абсолютные пути к файлам с текстами корпуса B, вместе с b или вместо
- `top_n` (integer): Число признаков с наибольшим различием
- `whole_texts` (boolean): Сравнивать тексты целиком, без окон; нужно хотя бы по два текста
- `window`: Размер окна в словах; не задано - не больше 1000 и такой, чтобы самый короткий текст делился хотя бы на два окна, но не меньше 100

## Diagnostics

Captured diagnostic sections: Provenance, Install scripts, Dependencies. The full working is on the page: https://verifymcp.io/servers/sergeyshk-ruts-mcp/ruts-mcp#diagnostics

## Score history

- 2026-11-05: 69
- 2026-11-04: 54
- 2026-11-03: 54
- 2026-11-02: 69
- 2026-11-01: 54
- 2026-10-31: 54
- 2026-10-30: 54
- 2026-10-29: 54

## Common questions

### What is the ruTS-mcp server?

ruTS-mcp is listed in the public MCP registry as io.github.SergeyShk/ruts-mcp. MCP server for ruTS: statistics of Russian texts as tools for LLM agents. This page covers its PyPI package (ruts-mcp).

### Is the ruTS-mcp server safe to use?

ruTS-mcp scores 69 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the ruTS-mcp server expose?

ruTS-mcp exposes 6 tools: analyze_text, kwic, collocations, dispersion, keyness, compare_texts. Their descriptions and schemas cost roughly 4,605 tokens of context every time the server is loaded.

### Is the ruTS-mcp server still maintained?

ruTS-mcp is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the ruTS-mcp server under?

ruTS-mcp declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- PyPI project: https://pypi.org/project/ruts-mcp/
- Socket report: https://socket.dev/pypi/package/ruts-mcp
- Repository: https://github.com/SergeyShk/ruTS-mcp
- Website: https://sergeyshk.github.io/ruTS-mcp/
- Changelog RSS feed: https://verifymcp.io/servers/sergeyshk-ruts-mcp/ruts-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/sergeyshk-ruts-mcp/ruts-mcp.json
- HTML version of this page: https://verifymcp.io/servers/sergeyshk-ruts-mcp/ruts-mcp
