ttw-mcp
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, город, рейтинг, В-П |
| профиль: сводка, периоды рейтинга, турниры и все матчи |
| очное противостояние и все встречи |
| турниры по названию и дате |
| метаданные, итоговая таблица, турниры серии |
Хотя бы один аргумент обязателен; дата — в формате DD.MM.YYYY.
Related MCP server: mcp-ietf-datatracker
Установка
{
"mcpServers": {
"ttw": {
"type": "stdio",
"command": "uv",
"args": ["--directory", "/Users/lappi/Work/ai/ttw-mcp", "run", "ttw-mcp"]
}
}
}Конфигурации и секретов не требуется: источник публичный.
Ограничения источника
История не ограничена окном: замерено от 19 до 94 недельных периодов у разных игроков, самый ранний — октябрь 2023 года. Глубина зависит от того, как давно играет сам игрок.
summary["rated_periods"]упирается в 30 и у активных игроков занижает число периодов. Считать надо по длинеperiods.Поиск игроков режется на 500 строках, турниров — на 20, пагинации нет.
Блок
summaryв профиле отстаёт на один недельный период от списка матчей. Для подсчётов используйтеmatches.Страница турнира содержит только итоговую таблицу, без отдельных матчей.
Сайт отвечает за 4–17 секунд. Запросы идут последовательно намеренно.
Разработка
Тесты парсеров работают на сохранённых страницах сайта. В репозитории их нет: они содержат ФИО реальных игроков, а r.ttw.ru просит не обходить себя автоматически. Поэтому перед первым прогоном их надо получить — это одиннадцать запросов с паузами, около минуты:
uv run python scripts/fetch_fixtures.py # получить/обновить фикстуры
uv run pytest # 111 тестов, без сети
uv run pytest -m smoke # 3 теста против живого сайтаБез фикстур pytest сообщит, каким скриптом их восстановить.
Дизайн: docs/superpowers/specs/2026-09-22-ttw-mcp-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.
Twitter/X read-only MCP server — 12 tools: search, users, tweets, followers, timelines, trends.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceMCP server for the Travelpayouts (Aviasales) API. It provides 13 tools for flight search, price calendars, hotel search, and airport/airline/city lookup.56 npmMIT
- AlicenseNot gradedqualityCmaintenanceEnables querying IETF documents, RFCs, working groups, and persons from the IETF Datatracker via MCP tools.4 npmMIT
- AlicenseAqualityCmaintenanceEnables querying and comparing prices, availability, ratings, reviews, and seller details from major Russian and Chinese marketplaces (Wildberries, Ozon, Yandex Market, and others) without requiring API keys, via a unified MCP interface.424MIT
- 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