ttw-mcp
Сервер даёт доступ к рейтингу настольного тенниса: поиск игроков и турниров, профили, матчи и очные противостояния.
search_players— искать игроков по фамилии/части имени: id, город, текущий рейтинг, победы/поражения, рука.get_player— получать профиль игрока: сводку, стартовый рейтинг, недельные периоды, турниры и все матчи с рейтингом на момент матча.get_head_to_head— смотреть очное противостояние двух игроков: победы, проценты, текущие рейтинги и список встреч.search_tournaments— искать турниры по названию, дате или диапазону дат; приenrich=Trueобогащать строки данными.get_tournament— получать метаданные турнира, итоговую таблицу и турниры той же серии; приratings_at_event=True— рейтинг участников на дату события.get_tournament_matches— восстанавливать матчи турнира из профилей участников.get_series— получать турниры той же серии из двух источников.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ttw-mcpcompare head-to-head of Ivanov and Petrov"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ttw-mcp
MCP-сервер для доступа к рейтингу настольного тенниса r.ttw.ru: игроки, матчи, очные противостояния, турниры.
Тонкая прослойка получения данных. Сервер не считает аналитику, не хранит состояние и не кэширует — всю интерпретацию делает модель над JSON.
Инструменты
Инструмент | Что возвращает |
| игроки по фамилии: id, город, |
| профиль: сводка, стартовый рейтинг, периоды, турниры, матчи с рейтингом игрока на момент матча |
| очное противостояние и все встречи |
| турниры по названию, дате или диапазону дат |
| метаданные, итоговая таблица, турниры серии |
| матчи турнира, восстановленные из профилей участников |
| турниры той же серии из двух источников |
get_tournament_matches, get_series и get_tournament с
ratings_at_event=True сначала загружают саму страницу турнира, а потом
профиль каждого участника — запросов на один больше, чем участников, и на
крупном турнире это минуты последовательных обращений. search_tournaments
с enrich=True стоит по запросу на строку, до двадцати: это потолок на
число обогащаемых строк, а не на размер одного ответа, и при диапазоне дат
склейка за несколько дней может дать больше строк, чем потолок позволяет
обогатить, — тогда инструмент отказывается целиком, а не обогащает часть.
Для search_tournaments нужен хотя бы один из аргументов name, date
или диапазон date_from/date_to (порознь с date); для search_players
обязателен name. Дата — в формате DD.MM.YYYY.
Related MCP server: Fonbet MCP
Подключение
Что понадобится
uv и Python 3.11 или новее. Клонировать
репозиторий не нужно: uvx соберёт сервер прямо из git при первом запуске
и закэширует сборку.
Ключей, токенов и переменных окружения не требуется — источник публичный.
Команда запуска
Она одна и та же во всех клиентах:
uvx --from git+https://github.com/lappi/ttw-mcp ttw-mcpВ конфигурационных файлах она распадается на command и args:
"command": "uvx",
"args": ["--from", "git+https://github.com/lappi/ttw-mcp", "ttw-mcp"]Если клиент сообщает, что команда не найдена, подставьте полный путь —
его покажет which uvx (обычно ~/.local/bin/uvx). Клиенты запускают
процесс не из вашей оболочки и переменную PATH из .zshrc или
.bashrc не видят.
Claude Code
claude mcp add ttw -- uvx --from git+https://github.com/lappi/ttw-mcp ttw-mcpДвойное тире отделяет опции claude от команды сервера: всё, что после
него, передаётся серверу как есть.
Где сохранится настройка, задаёт --scope:
Область | Файл | Видна команде |
|
| нет |
|
| да, через систему контроля версий |
|
| нет |
Проверка: claude mcp list в оболочке или /mcp внутри сессии.
Claude Desktop
Настройки → вкладка «Developer» → «Edit Config». Кнопка откроет файл:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"ttw": {
"command": "uvx",
"args": ["--from", "git+https://github.com/lappi/ttw-mcp", "ttw-mcp"]
}
}
}После сохранения приложение нужно полностью завершить и запустить заново. Сервер появится в списке коннекторов рядом с полем ввода.
Если не появился — смотрите журнал: ~/Library/Logs/Claude/mcp*.log на
macOS, %APPDATA%\Claude\logs на Windows. Файл mcp-server-ttw.log
содержит всё, что сервер написал в stderr.
ChatGPT (десктоп), Codex CLI и расширение для IDE
У них общий конфигурационный файл: настроив один раз, вы получаете сервер во всех трёх.
codex mcp add ttw -- uvx --from git+https://github.com/lappi/ttw-mcp ttw-mcpЛибо вручную, в ~/.codex/config.toml (или .codex/config.toml в
доверенном проекте) — формат здесь TOML, а не JSON:
[mcp_servers.ttw]
command = "uvx"
args = ["--from", "git+https://github.com/lappi/ttw-mcp", "ttw-mcp"]Проверка: /mcp в Codex.
ChatGPT в браузере — не подключится, и вот почему
Веб-версия не читает локальные конфигурационные файлы: она работает только с удалёнными MCP-серверами по HTTP, подключаемыми через плагины. Этот сервер — локальный, он общается по stdio и никуда не выставлен.
Варианта два: пользоваться десктопным приложением (см. раздел выше) либо поднять HTTP-обёртку над stdio на своём хосте. Второе выходит за рамки этого репозитория: сервер ходит на сайт, который просит не обходить себя автоматически, и выставлять его в сеть — отдельное решение с отдельной ответственностью.
Gemini CLI
Файл ~/.gemini/settings.json (глобально) или .gemini/settings.json
(в проекте):
{
"mcpServers": {
"ttw": {
"command": "uvx",
"args": ["--from", "git+https://github.com/lappi/ttw-mcp", "ttw-mcp"]
}
}
}Проверка: gemini mcp list в оболочке или /mcp внутри сессии. Добавить
сервер можно и командой gemini mcp add.
Cursor
Файл ~/.cursor/mcp.json (глобально) или .cursor/mcp.json (в проекте),
формат тот же:
{
"mcpServers": {
"ttw": {
"command": "uvx",
"args": ["--from", "git+https://github.com/lappi/ttw-mcp", "ttw-mcp"]
}
}
}VS Code
Здесь формат свой: ключ верхнего уровня называется servers, а у сервера
появляется type.
Файл .vscode/mcp.json в проекте:
{
"servers": {
"ttw": {
"type": "stdio",
"command": "uvx",
"args": ["--from", "git+https://github.com/lappi/ttw-mcp", "ttw-mcp"]
}
}
}Через палитру команд: MCP: Add Server — мастер с выбором области, MCP: Open User Configuration — тот же файл на уровне профиля, для всех рабочих областей сразу.
Остальные клиенты
Большинство используют тот же объект mcpServers, что Claude Desktop,
Cursor и Gemini CLI, — меняется только путь к файлу:
Клиент | Как добраться до конфигурации |
Windsurf / Cascade | Меню |
Zed | Настройки, блок |
LM Studio | Настройки → MCP Servers → Add Server: имя, команда, аргументы |
Cline, Continue, JetBrains и прочие | Ищите в настройках «MCP» и вставляйте тот же объект |
Клиентов много и конфигурации у них меняются, поэтому если путь из этой таблицы не совпал — источник истины всегда документация самого клиента, а не эта. Команда запуска при этом остаётся прежней.
Проверка без клиента
Если клиент молчит и непонятно, на чьей стороне проблема, сервер можно опросить напрямую — он ответит на приветствие протокола:
printf '%s\n' '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"probe","version":"0"}}}' \
| uvx --from git+https://github.com/lappi/ttw-mcp ttw-mcpВ ответ придёт одна строка JSON с serverInfo, именем ttw и версией.
Пришла — сервер исправен, и разбираться надо с настройками клиента. Не
пришла — читайте, что команда написала в stderr.
Из клона — для разработки
Если вы правите код, запускать надо не из git, а из рабочей копии:
{
"mcpServers": {
"ttw": {
"command": "uv",
"args": ["--directory", "/путь/к/ttw-mcp", "run", "ttw-mcp"]
}
}
}Путь должен быть абсолютным: клиент запускает процесс из своего рабочего каталога, а не из вашего.
Ограничения источника
История не ограничена окном: замерено от 19 до 94 недельных периодов у разных игроков, самый ранний — октябрь 2023 года. Глубина зависит от того, как давно играет сам игрок.
rating_currentв таблице турнира и в поиске игроков — сегодняшнее значение, а не рейтинг на день события. Отдельных матчей страница турнира не содержит вовсе — их восстанавливаетget_tournament_matchesиз профилей участников. Восстановленный рейтинг на дату турнира даётget_tournament(..., ratings_at_event=True): добавляет каждой строкеrating_at_event, которое может бытьnull.Исход матча (
result) принимает шесть значений:win,loss,walkover_win,walkover_loss,not_played,unparsed.not_played(счёт 0:0, матч не сыгран) не считается ни победой, ни поражением.Пометка руки вынесена из имени в поле
hand. Сайт заводит под нерабочую руку отдельный профиль с отдельным идентификатором, поэтому один человек может иметь несколько профилей с разными id — сервер их не связывает.summary["rating_min"],["rating_max"]и["rating_avg"]в профиле — не значения за карьеру, а величины в пределах окна примерно в тридцать периодов: у игрока с 87 периодами сводка показывает минимум 150.04 при настоящем минимуме 70.31 поperiods.summary["rated_periods"]упирается в 30 и у активных игроков занижает число периодов. Считать надо по длинеperiods.Поиск игроков режется на 500 строках, турниров — на 20 в одном запросе, пагинации нет.
Блок
summaryв профиле отстаёт на один недельный период от списка матчей. Для подсчётов используйтеmatches.Сайт отвечает за 4–17 секунд. Запросы идут последовательно намеренно.
Разработка
Тесты парсеров работают на сохранённых страницах сайта. В репозитории их нет: они содержат ФИО реальных игроков, а r.ttw.ru просит не обходить себя автоматически. Поэтому перед первым прогоном их надо получить — это четырнадцать запросов с паузами, около полутора минут:
git clone https://github.com/lappi/ttw-mcp && cd ttw-mcp
uv run python scripts/fetch_fixtures.py # получить/обновить фикстуры
uv run pytest # 220 тестов, без сети
uv run pytest -m smoke # 4 теста против живого сайтаБез фикстур pytest сообщит, каким скриптом их восстановить.
Дизайн: docs/superpowers/specs/2026-09-22-ttw-mcp-design.md и
docs/superpowers/specs/2026-09-22-improvements-design.md.
Лицензия
MIT — см. LICENSE.
Available Tools
5 toolsget_head_to_headA
Возвращает очное противостояние двух игроков.
Даёт победы, проценты побед и партий, текущие рейтинги обоих и список всех их встреч. Рейтинги на этой странице округлены до целого; за точным значением с двумя знаками идите в get_player.
Пустой matches означает, что игроки не встречались.
Матч без разборчивого счёта — техническая победа или изменившаяся вёрстка — приходит с пустыми партиями и исходной записью в score_raw. В отличие от get_player, здесь нет поля result, поэтому различить эти два случая можно только по score_raw.
| Name | Required | Description | Default |
|---|---|---|---|
| player_id | Yes | ||
| opponent_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries full responsibility for behavioral disclosure. It goes well beyond the obvious by explaining that ratings are rounded, empty matches mean no prior meeting, unreadable scores appear as empty games with a raw score field, and there is no 'result' field as in get_player. This is rich, useful edge-case behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded first, followed by output summary, then edge-case behavior. Every sentence earns its place, and the formatting separates concerns clearly without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must explain return semantics; it does so thoroughly by listing wins, percentages, ratings, match list, and all important edge cases. For a two-parameter lookup tool, nothing essential is missing for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, but it only says 'two players' and does not define player_id/opponent_id formats, examples, or how the IDs map to the two sides of the match. The parameter names are self-explanatory, but the description adds no concrete input semantics beyond the schema's bare titles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Возвращает очное противостояние двух игроков' (returns the head-to-head match of two players), then enumerates what is returned. It also explicitly distinguishes itself from the sibling tool get_player by pointing out the missing 'result' field and rounded ratings, so an agent can tell them apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: use this tool for head-to-head statistics, and go to get_player for exact two-decimal ratings. It also explains the meaning of an empty 'matches' array, which helps decide whether players have actually met. It does not provide a broader when-to-use/when-not-to-use statement, but the guidance is sufficient for this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_playerA
Возвращает профиль игрока: сводку, периоды рейтинга, турниры и все матчи.
История не ограничена фиксированным окном: страница отдаёт все недельные периоды, в которых игрока обсчитывали. Замерено от 19 до 94 периодов у разных игроков, самый ранний — октябрь 2023 года. Глубина отражает активность самого игрока, а не срок хранения на сайте, поэтому многолетние вопросы к этим данным правомерны.
Осторожно с summary["rated_periods"]: оно упирается в 30. У игрока с 94 периодами сводка покажет 30, то есть занизит. Считать периоды следует по длине periods, а не по этому полю.
Важно: блок summary отстаёт на один недельный период и не включает самый свежий турнир, тогда как matches его включает. Расхождение между summary["games"] и длиной matches — нормальное поведение источника, а не ошибка. Для подсчётов используйте matches.
Пустой best_wins означает отсутствие заметных побед, а не сбой.
Техническая победа приходит с result "walkover", score_for и score_against равны null, а исходная запись сайта лежит в score_raw. Такой матч сыгран и учитывается наравне с остальными.
Неопознанный счёт приходит с result "unparsed" — это признак изменившейся вёрстки, а не результат матча.
| Name | Required | Description | Default |
|---|---|---|---|
| player_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure and does so thoroughly. It reveals that summary['rated_periods'] caps at 30, summary lags one week behind matches, empty best_wins means no notable wins, and explains walkover and unparsed result conventions. This is rich, actionable behavioral context far beyond a simple return-value list.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every paragraph earns its place by covering a distinct data quirk or edge case. It is front-loaded with a clear summary of the return payload and then layers caveats logically. Some redundancy could be trimmed, but overall it is appropriately sized for the complexity it documents.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema and no annotations, the description is remarkably complete: it enumerates the returned sections, explains historical depth, corrects a common misinterpretation of rated_periods, and defines special result values. An agent can invoke the tool and interpret almost any response correctly based on this text alone; only the source of player_id is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description was expected to compensate, but it never mentions player_id: its format, where it comes from, or how it relates to search_players. The parameter name is self-explanatory to a degree, but no additional meaning is added beyond the schema's 'Player Id'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Возвращает профиль игрока: сводку, периоды рейтинга, турниры и все матчи', which names a specific verb, resource, and the exact contents returned. It is clear and not tautological, but it does not explicitly differentiate from sibling tools like search_players or get_head_to_head, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives, and no prerequisites are stated, such as 'use search_players to find the ID first'. It focuses entirely on interpreting the response rather than selecting the tool, leaving usage context to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tournamentA
Возвращает турнир: метаданные, итоговую таблицу и другие турниры серии.
Страница содержит только итоговую таблицу. Отдельных матчей турнира на ней нет — чтобы узнать, кто с кем играл, нужны профили участников через get_player.
| Name | Required | Description | Default |
|---|---|---|---|
| tournament_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses that the tool returns metadata, final table, and other series tournaments, and explicitly states what it does NOT return (individual matches). This is useful behavioral context, though it doesn't cover response format or potential errors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the main purpose, then adds a clarifying note about what is not included. Every sentence earns its place, and the structure is easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with no output schema, the description covers the main return values and explicitly notes the limitation about matches. It could mention the format of tournament_id or error cases, but the core information an agent needs is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It doesn't explain the tournament_id parameter format or provide examples, but the parameter name is self-explanatory and the description clarifies what the tool returns for that ID. Baseline 3 is appropriate given the single obvious parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns a tournament with metadata, final standings, and other tournaments in the series. It also explicitly distinguishes it from match-level data, which helps an agent understand exactly what this tool provides.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains that the page only contains the final table and that individual matches are not included, directing users to get_player for match details. It doesn't explicitly mention when to use search_tournaments instead, but it gives clear context for when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_playersA
Ищет игроков по фамилии или части имени.
Имя обязательно: без него сайт отдаёт весь список на 6.7 МБ. Сайт возвращает максимум 500 строк без пагинации; при достижении потолка поле truncated равно true и запрос надо сузить. Однофамильцев много, различать их следует по городу и рейтингу.
Аргумент limit укорачивает только список players. Поле total_found всегда показывает, сколько строк реально нашлось на странице, поэтому эти два числа расходятся намеренно, а не по ошибке.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility for behavior, and it is exceptionally transparent. It discloses the 500-row maximum, absence of pagination, the truncated flag, the intentional mismatch between limit and total_found, and a concrete performance hazard. This goes well beyond what a typical description provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: a one-sentence purpose statement followed by compact, dense operational paragraphs. Every sentence earns its place by conveying a distinct fact; there is no repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 covers the essential context: required input, response size limits, truncation behavior, interpretation of result fields, and disambiguation guidance. An agent has enough information to invoke the tool correctly and interpret its response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has no descriptions, so the description must compensate. It does: name is explained as a required surname or partial-name matcher, and limit is specified as shortening only the players list while total_found remains the true page count. Both parameters receive meaningful, non-obvious semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it searches for players by surname or partial name. This clearly differentiates it from sibling tools like search_tournaments and get_head_to_head, and from get_player, which implies retrieving one specific player.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives strong operational guidance: name is required or the site returns a huge 6.7 MB list, queries must be narrowed when truncated is true, and namesakes should be disambiguated by city and rating. It does not explicitly name alternative tools, but the context is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_tournamentsA
Ищет турниры по названию и дате.
Нужен хотя бы один аргумент. Дата задаётся в формате сайта DD.MM.YYYY, а не в ISO — это единственное место в проекте, где наружу смотрит формат источника, потому что значение уходит в его же поисковую форму.
Сайт отдаёт максимум 20 результатов без пагинации; при достижении потолка truncated равно true.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ||
| name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral disclosure burden. It reveals the site-specific DD.MM.YYYY date format (and why it deviates from ISO), the maximum of 20 results with no pagination, and the truncated=true flag when the cap is hit. These are non-obvious behaviors an agent needs to call the tool correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized into three short purposeful segments: purpose, usage rule, and behavioral caveats. Every sentence adds valuable information with no filler, and the most important constraint (date format) is prominently placed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter search tool with no output schema and no annotations, the description covers input requirements, a critical format quirk, result limits, and truncation signaling. This is sufficient for an agent to invoke it correctly and interpret the key edge case of an empty result set.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate for missing parameter documentation. It explicitly explains the date format and the at-least-one-argument constraint. The 'name' parameter is only described as 'by name,' which is adequate for a simple string search but not deeper semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('searches'), a resource ('tournaments'), and the search criteria (name and date). This clearly differentiates it from sibling tools like get_tournament (single tournament retrieval) and search_players (players), even without naming them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear operational rule: at least one argument is required. It does not explicitly mention when to avoid this tool or name alternatives, but the search-by-name/date context makes the intended use obvious and there is no misleading guidance.
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.
5 tool updates
v0.1.0- First observed
get_head_to_head - First observed
get_player - First observed
get_tournament - First observed
search_players - First observed
search_tournaments
TDQS
Scored across 5 tools
Each tool has a clearly distinct role: search vs. detail for both tournaments and players, plus a dedicated head-to-head endpoint. There is no overlap or ambiguity between the two search tools and their corresponding getter tools.
All tool names follow the same snake_case verb_noun pattern: search_tournaments, get_tournament, search_players, get_player, get_head_to_head. The naming is uniform and predictable.
Five tools is well-scoped for a read-only tournament and player statistics server: two search endpoints, two detail endpoints, and one head-to-head endpoint. Each tool covers a distinct need without bloat.
The tool surface covers the core read-only domain: finding tournaments, inspecting tournament results, searching players, viewing detailed player histories, and comparing two players. Documented source limitations such as missing tournament match lists are explicitly handled via player profiles, so no critical workflow dead-ends.
Maintenance
Related MCP Connectors
Search MCP servers in the public mcp-catalog.ru directory.
Web and URL utilities over MCP: shorten URLs, screenshot pages, read page metadata, encode URLs.
MCP server for Russian books search, details, and recommendation candidates.
Codeforces MCP — public read API.
Related MCP Servers
- AlicenseBqualityCmaintenanceProvides access to Chess.com player data, game records, and public information through standardized MCP interfaces, allowing AI assistants to search and analyze chess information.1090MIT
- FlicenseNot gradedqualityDmaintenanceMCP server for reading Fonbet sports events and odds, enabling search for events, retrieval of odds, and value-bet checking via natural language.-
- MIT
- AlicenseNot gradedqualityDmaintenanceRead-only MCP server that queries Russian Railways (ticket.rzd.ru) for train schedules, car types, prices, and seat availability. It provides official RZD links for manual booking but does not log in, book, or pay.31 npm2MIT