Skip to main content
Glama
lappi

rttf-mcp

by lappi

rttf-mcp

MCP-сервер для доступа к рейтингу настольного тенниса rttf.ru: игроки, турниры, залы.

Тонкая прослойка получения данных. Сервер не считает аналитику, не хранит состояние и не кэширует — всю интерпретацию делает модель над JSON.

Что сервер читает, а что нет

robots.txt rttf.ru поимённо закрывает матчи (/games, /results), очные встречи (/rivals), поиск по имени (?name=, /search) и фильтры по датам. Сервер никогда не запрашивает закрытые адреса: клиент сверяет каждый запрос, включая шаги перенаправления, со списком правил и отказывает до обращения к сети.

Часть закрытой категории — матчи последних турниров — лежит на разрешённой странице профиля. Извлекать её или нет, решает переменная окружения:

RTTF_MCP_ALLOW_RESTRICTED

Что видит модель

не задана, 0, false, no, off

только уровень турнира и выше; описание get_player прямо говорит, что матчей нет по настройке, а не на сайте

1, true, yes, on

ещё get_player_matches и get_head_to_head

что-то другое

сервер не запускается

Поиска по имени нет ни в каком режиме: разрешённого пути к нему у сайта нет.

Related MCP server: MCP Chess Server

Инструменты

Инструмент

Что возвращает

get_player(player_id)

категории рейтинга (одиночный, пары, ФНТР), история рейтинга, сводка, до 10 последних турниров с местом и балансом

get_tournament(tournament_id)

метаданные и итоговая таблица (рейтинг до, дельта, после)

list_players(city="", max_rating=None)

рейтинг окнами по 100 строк; курсор next_max_rating

search_tournaments(city="", hall_id="", tournament_type="")

ближайшие и недавние турниры, по 100 строк

get_hall(hall_id)

зал: адрес, часы, столы, удобства, оценка; без контактов

get_player_matches(player_id, category="s")

только с флагом: матчи последних турниров и лучшие победы

get_head_to_head(player_id, opponent_id)

только с флагом: встречи с соперником в последних турнирах

Каждый инструмент делает ровно один запрос к сайту. Идентификаторы — числа из адресной строки: rttf.ru/players/28415.

Подключение

Нужны uv и Python 3.11 или новее.

uvx --from git+https://github.com/lappi/rttf-mcp rttf-mcp

В конфигурации клиента:

"command": "uvx",
"args": ["--from", "git+https://github.com/lappi/rttf-mcp", "rttf-mcp"]

С флагом — добавьте "env": {"RTTF_MCP_ALLOW_RESTRICTED": "1"}.

Разработка

uv sync
uv run pytest                         # офлайн, на фикстурах
uv run python scripts/fetch_fixtures.py   # перекачать фикстуры (вне git)
uv run pytest -m smoke -v             # сверка с живым сайтом, 4 запроса

Фикстуры не хранятся в репозитории: в них ФИО реальных людей.

Available Tools

5 tools
get_hallA

Зал (клуб) rttf.ru. Один запрос.

hall_id — число из адреса зала (rttf.ru/halls/1073); оно же приходит в get_tournament (hall.hall_id) и в сводке игрока (stats.most_frequent_hall.hall_id).

Поля: hall_id, name, address, metro (список станций или null), opening_hours, tables — число столов, website, representative_player_id — профиль представителя зала на сайте; каждое из них null, если зал его не заполнил. amenities и paid_amenities — удобства, бесплатные и платные: списки, пустые, если значков нет. rating — оценка посетителей или null: overall и aspects (словарь «аспект как на сайте» -> оценка).

Контакты зала не отдаются намеренно: там личные телефоны сотрудников. Турниры зала — search_tournaments(hall_id=...).

ParametersJSON Schema
NameRequiredDescriptionDefault
hall_idYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does so well. It discloses that one request is made, that unset fields are null, that contacts are intentionally omitted for privacy, and it explains the rating object structure. This is substantial behavioral context beyond what the name or schema imply.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well structured. It front-loads the one-request behavior, then covers parameter provenance, output fields, intentional omissions, and the related sibling. Every sentence earns its place, with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Because there is no output schema, the description correctly enumerates all response fields and their null/empty semantics, which is the main missing context. Minor gaps remain around not-found behavior and authentication, but these are secondary for a simple single-request lookup.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema only gives hall_id as a string, while the description fully compensates: hall_id is the numeric ID from the hall URL, same as in get_tournament and the player summary. An agent can determine exactly what value to pass and where the value may already be available from sibling tools.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies the resource as a hall/club on rttf.ru and lists the returned fields, making the operation a hall-details lookup rather than a player or tournament tool. It does not use an explicit action verb beyond the tool name, and it only partially distinguishes itself from siblings through the final search_tournaments note.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives useful routing context: hall_id can come from get_tournament or a player summary, and tournaments for the hall are explicitly delegated to search_tournaments. It stops short of explicitly saying when to choose get_hall over get_player or get_tournament, but the intended context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_playerA

Профиль игрока rttf.ru: рейтинги по категориям, история рейтинга, сводка и последние турниры с местом и балансом. Один запрос к сайту.

player_id — число из адреса профиля на сайте (rttf.ru/players/28415). Поиска по имени нет ни в одном режиме: сайт закрыл его в robots.txt. Выйти на игрока можно через list_players или через итоговую таблицу турнира (get_tournament).

Анкета: player_id, name (ФИО как на сайте), city (город со страной в скобках, как на сайте), sports_rank (спортивный разряд, например "МС"), playing_hand ("левая" | "правая") — каждое null, если игрок его не указал. equipment — инвентарь: blade (основание), rubber_right и rubber_left (накладки), каждое {item_id, name} или null.

categories — словарь по коду категории; ключ есть, только если у игрока есть такая вкладка на сайте. Отсутствие ключа означает «категории у игрока нет», а не сбой. Замеренные коды:

  • "s" — одиночный разряд, основной рейтинг RTTF;

  • "d" — парный разряд. Своего рейтинга у пар на сайте нет: rating_current, rating_max и rating_max_date равны null, а rating_history пуст. В турнирах пары стоят одиночные рейтинги партнёров на момент турнира и их сумма (pair_rating_at_event);

  • "f" — рейтинг ФНТР (федерации), внешний к RTTF. Для него есть только текущее значение, максимум и история; stats, recent_tournaments и recent_tournaments_truncated равны null. Прочие коды (h, p, m, w, r) в замерах не встретились; такая категория придёт под своим кодом с подписью сайта в label. Отдельной категории для нерабочей руки на сайте не найдено; playing_hand — это игровая рука из анкеты.

Рейтинги — целые, и это округление внутреннего дробного значения, а не усечение (проверено на различающем случае). Рейтинг бывает отрицательным: у новичка после неудачного турнира -18, а перед следующим турниром сайт сбрасывает его до 1.

rating_history — полный график рейтинга по датам турниров (у ФНТР — по месяцам). Первая точка может иметь date null: это стартовый рейтинг.

stats — сводка категории; поля, которых на сайте нет (rank_position у пар), равны null.

recent_tournaments — НЕ ВСЕ турниры, а не больше десяти последних по категории: полный список сайт отдаёт только через закрытый /results. recent_tournaments_truncated равно true, когда stats.tournaments_played больше длины списка. Для каждого турнира: rating_before_event и rating_after_event — рейтинг игрока до и после этого турнира, rating_delta — изменение (пустая ячейка сайта — это 0.0), bonus — бонус за призовое место или null, place — место или null, если сайт его не указал (лиги), wins/losses — баланс встреч в турнире.

ДАННЫЕ УРОВНЯ МАТЧА В ЭТОМ РЕЖИМЕ НЕ ВЫДАЮТСЯ: соперники, счёт,
длительность и дельта отдельных встреч, лучшие победы, очные встречи.
Это не поломка и не отсутствие данных на сайте, а сознательное
ограничение: rttf.ru закрыл эти разделы в robots.txt, и сервер
запущен без RTTF_MCP_ALLOW_RESTRICTED. Не делайте вывода, что у игрока нет матчей, —
турниры с местом и балансом побед в ответе есть.
ParametersJSON Schema
NameRequiredDescriptionDefault
player_idYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description takes full responsibility for behavioral disclosure. It reveals many non-obvious behaviors: ratings are rounded rather than truncated, can be negative and are reset to 1, history points may have null dates, recent tournaments are truncated at ten, restricted sections are omitted by design, and absent category keys indicate absence rather than failure. This is exceptionally transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long, but every paragraph earns its place by documenting real behavioral nuances and edge cases. It is structured with clear labels and paragraphs for each response component, and the most important usage caveats are placed prominently. No filler or tautological phrasing is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that there is no output schema stub beyond the input parameters, the description carries the entire burden of documenting the response shape. It comprehensively explains the top-level fields, category structures, rating semantics, stats, tournament fields, and all relevant null/absence behaviors. It is complete enough for an agent to invoke the tool and interpret its results correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema only defines player_id as a string with no explanation. The description compensates fully by specifying that player_id is a number taken from the profile URL, giving a concrete example (rttf.ru/players/28415). This adds critical meaning beyond the schema and leaves no ambiguity about how to obtain and format the parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the resource (player profile on rttf.ru) and the specific contents returned: category ratings, rating history, summary, and recent tournaments with place and balance. It also explicitly distinguishes itself from sibling tools by noting that name search is unavailable and that list_players or get_tournament should be used to reach a player.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete guidance on when to use this tool versus alternatives: it explains that there is no by-name search, that player_id must be taken from the profile URL, and that list_players or get_tournament are the routes to find a player. It also clarifies that match-level data is intentionally not returned, preventing incorrect use of the tool for that purpose.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_tournamentA

Турнир rttf.ru: метаданные и итоговая таблица. Один запрос.

tournament_id — число из адреса турнира (rttf.ru/tournaments/243702).

Матчей турнира в ответе нет ни в каком режиме: на странице турнира их нет вовсе (этапы выложены картинками), а список игр лежит в закрытом /games.

Метаданные: tournament_id, title, date, start_time, hall ({hall_id, name} или null), address. limit — ограничение по рейтингу как на сайте: число, "отк" (открытый) или "дети". doubles — парный ли турнир. has_results — сыгран ли турнир; у несыгранного standings пуст, а счётчики, average_rating и coefficient равны null.

Счётчики сыгранного турнира зависят от вида: у одиночного — participants (участников) и games (встреч), а pairs и players равны null; у парного — pairs (пар), players (игроков) и games, а participants равно null.

registered / registration_limit — сколько заявилось и лимит заявок (null, если лимита нет). У парного турнира сайт считает заявки парами.

Одиночная таблица: place, player_id, name (как на сайте, с логином в скобках), city, rating_before_event, rating_delta, rating_after_event — рейтинги до и после ЭТОГО турнира, а не сегодняшние; wins/losses — встречи, sets_won/sets_lost — партии.

Парная таблица: place, pair — два игрока с одиночными рейтингами на момент турнира, pair_rating_at_event — их сумма, wins/losses, sets_won/sets_lost. Дельты и рейтинга после у пар сайт не публикует.

average_rating — средний рейтинг участников с двумя знаками: сайт считает его по внутренним дробным рейтингам, поэтому среднее целых из таблицы с ним точно не совпадёт. coefficient — коэффициент турнира (у парных null).

ParametersJSON Schema
NameRequiredDescriptionDefault
tournament_idYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully carries behavioral disclosure. It explains edge cases: unplayed tournaments have empty standings and null counters, singles vs. doubles counters differ, rating fields refer to the event rather than today, average_rating uses fractional ratings and won't match integer averages, and pairs lack rating deltas.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every paragraph earns its place by documenting a distinct aspect: parameter, limitations, metadata, counters, registration, singles, doubles, and rating semantics. It is clearly structured and front-loaded with the core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description thoroughly documents all return fields, their formats, and many conditional behaviors. It covers singles vs. doubles differences, unplayed tournament behavior, rating semantics, and calculation quirks, leaving no essential information missing for an agent to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema only indicates tournament_id is a string, but the description adds critical meaning: it is the numeric part of the tournament URL (e.g., rttf.ru/tournaments/243702). This fully compensates for the 0% schema description coverage and tells the agent exactly how to obtain the parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Турнир rttf.ru: метаданные и итоговая таблица. Один запрос.', which clearly states the tool returns tournament metadata and final standings. It is specific to the tournament resource and implicitly distinct from sibling tools focused on players, halls, and search.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives useful context for when to use the tool: it requires a tournament_id from the tournament URL and returns metadata plus standings. It also provides an exclusion by stating that matches are never included and that game lists live in a separate closed /games endpoint, though it does not explicitly name alternative tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_playersA

Листает рейтинг игроков rttf.ru окнами по сто строк. Один запрос.

Это единственный разрешённый способ выйти на игрока без поиска по имени (поиск сайт закрыл в robots.txt). Строки идут по убыванию рейтинга.

city — код региона ("r77" — Москва и МО, "r78" — Санкт-Петербург и ЛО) или числовой код города ("1" — Москва, "2" — Санкт-Петербург); коды видны в ссылках городов на сайте и в поле city.city_id ответа. Пусто — вся страна.

max_rating — верхняя граница окна (от 1 до 4000). Первый вызов — без неё; следующий — с max_rating из next_max_rating ответа. Соседние окна ПЕРЕКРЫВАЮТСЯ: сайт сравнивает границу с внутренним дробным рейтингом, а показывает округлённый, и без перекрытия часть игроков выпадала бы. Повторы между окнами отбрасывайте по player_id.

Ответ повторяет city и max_rating запроса. next_max_rating равно null в трёх случаях: список кончился (строк меньше ста); stalled_on_tie равно true — следующее окно не уже текущего, потому что сто строк уместились в один-два соседних показанных рейтинга, и дальше окнами не пройти, остальные игроки с этими рейтингами через разрешённые адреса недоступны; или окно дошло до рейтинга ниже 1 — такое окно сайт молча игнорирует, и эти игроки тоже недоступны.

players — строки окна: rank, player_id, name, is_team, city ({city_id, name} или null), rating, updated. rank — место в ОБЩЕМ рейтинге, даже при фильтре по городу. is_team — корпоративная команда, а не человек: сайт ставит их в общий рейтинг наравне с игроками. city равно null, если город не указан. updated — дата последнего изменения рейтинга.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNo
max_ratingNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full behavioral burden and does so thoroughly. It discloses one-request window semantics, descending order, window overlap with fractional ties, the need to deduplicate by player_id, and the three distinct cases where next_max_rating becomes null. It also explains field meanings such as rank being overall even with city filters and is_team denoting corporate teams.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence earns its place: purpose and uniqueness first, then parameter semantics, then pagination edge cases, then response field details. It is densely informative without filler or redundant restatements.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations, no output schema, and a non-trivial pagination flow, the description is remarkably complete. It covers all needed parameter formats, windowing behavior, termination conditions, deduplication, and response field semantics, leaving little for an agent to guess.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must fully explain both parameters, and it does. It defines city as either a region code or numeric city code with examples and tells where to find codes. It explains max_rating as the upper window bound, the initial-call omission, and the next_max_rating handoff, adding crucial semantics absent from the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: it pages through the rttf.ru player rating in 100-row windows. It also distinguishes itself by stating it is the only permitted way to reach a player without name search, which separates it clearly from sibling tools like search_tournaments and get_player.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear operational context: use this tool when you need players without using name search, and it explains the pagination flow. It does not explicitly name sibling alternatives or say when not to use them, but the 'only permitted way' statement makes the intended usage unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_tournamentsA

Ближайшие и недавние турниры rttf.ru по фильтрам. Один запрос.

Фильтра по датам и по названию нет: сайт закрыл оба в robots.txt. Доступны: city (как в list_players), hall_id (число из адреса зала, rttf.ru/halls/1073) и tournament_type — один из кодов сайта: s одиночные, d парные, t командные, p пинг-понг, r ракетлон, w шах-понг, v ветеранские, c детские, l лесенки, h форовые, m мини-теннис, t2/t3/t4 триатлон, d12 дуатлон.

upcoming — ближайшие турниры, past — прошедшие, от свежих к старым; в каждом списке не больше ста строк, листания нет (подгрузка на сайте идёт через закрытый адрес). Без фильтров сто прошедших покрывают примерно полтора дня; с фильтром по залу — несколько недель. upcoming_total и past_total — счётчик «итого» сайта, если он показан (в коротких отфильтрованных списках), иначе null. upcoming_truncated и past_truncated равны true, когда строк на сайте больше, чем в ответе. filters повторяет применённые фильтры (city, hall_id, tournament_type); пустые не включаются.

Строка: tournament_id, date, start_time, limit, hall_name (краткое имя зала), doubles, ladder (лесенка), live (идёт сейчас), registration_open, average_rating (null, если сайт не посчитал), registered / registration_limit, games (сыграно встреч или null).

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNo
hall_idNo
tournament_typeNo

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden and does so thoroughly: it discloses the 100-row limit, no pagination, truncation flags, null counters, filter echo behavior, and per-field semantics like live, registration_open, and average_rating. This goes well beyond basic mutation/read labels.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense and front-loaded with the core purpose, followed by structured filter and output details. It is longer than average, but every sentence carries operational value, so the length is justified.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations and no output schema, the description is unusually complete: it explains the response row fields, null semantics, truncation behavior, list ordering, coverage depths, and filter echo. An agent has nearly everything needed to invoke and interpret the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 0% schema coverage, the description provides rich semantics for all three parameters: city references list_players, hall_id gives a concrete URL example, and tournament_type enumerates all site codes with meanings. This fully compensates for the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as searching rttf.ru tournaments by filters and emphasizes 'one request' returning both upcoming and past tournaments. It does not explicitly differentiate itself from sibling get_tournament, but the 'by filters' and 'one request' phrasing makes the batch-search intent clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains what filters are available and notes that date/name filters are unavailable due to robots.txt, giving useful constraints. However, it does not explicitly state when to prefer this tool over get_tournament or list_players, nor does it describe exclusion criteria for alternatives.

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.

  1. 5 tool updatesv0.1.0
    • First observedget_hall
    • First observedget_player
    • First observedget_tournament
    • First observedlist_players
    • First observedsearch_tournaments

TDQS

A4.6/5.0

Scored across 5 tools

Disambiguation5/5

Each tool targets a distinct resource and action: single player, single hall, single tournament, player listing, tournament search. There is no meaningful overlap; get_player/list_players and get_tournament/search_tournaments are clearly separated by entity vs collection.

Naming Consistency5/5

All tools follow a consistent lower_snake_case verb_noun pattern: get_ for individual resources and list_/search_ for collection queries. The naming convention is uniform and predictable.

Tool Count5/5

Five tools is well-scoped for a read-only sports data domain covering players, halls, and tournaments. Each tool earns its place and there is no bloat or obvious missing core resource.

Completeness4/5

The core domain is well covered: player profiles, halls, tournament standings, player ratings listing, and tournament search. Minor gaps exist due to intentional site restrictions, such as no match-level data, no player name search, and no paginated tournament search, but these are clearly documented workarounds rather than accidental omissions.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    B
    quality
    D
    maintenance
    Enables querying volleyball match, team, and tournament data from VolleyballWorld API through SQL queries on a SQLite database.
    1
    -
  • F
    license
    B
    quality
    D
    maintenance
    Enables interaction with Chess.com's public API to retrieve player profiles and statistics including rating history and performance metrics for any Chess.com username.
    2
    -
  • F
    license
    A
    quality
    D
    maintenance
    Provides programmatic access to CTFtime.org data for retrieving information about CTF competitions, team rankings, and event results. It enables users to search for upcoming events, analyze team performance, and access historical competition data through a standardized interface.
    9
    4
    -