Skip to main content
Glama
r-huijts

FirstCycling MCP Server

by r-huijts

FirstCycling MCP Server

This is a Model Context Protocol (MCP) server that provides professional cycling data from FirstCycling. It allows you to retrieve comprehensive information about professional cyclists, race results, race details, and historical cycling data.

Features

This MCP server offers rich access to professional cycling data, providing tools for:

  • Finding information about professional cyclists

  • Retrieving race results and details

  • Exploring historical race data

  • Analyzing rider performance and career progression

  • Accessing information about cycling teams and competitions

Related MCP server: F1 MCP Server

Real-World Use Cases

With this MCP server, you can use Claude to:

Rider Analysis

  • Performance Tracking: "How has Tadej Pogačar performed in the Tour de France over the years?"

  • Career Progression: "Show me the team history and career progression of Wout van Aert."

  • Specialization Analysis: "What are Mathieu van der Poel's results in Monument classics?"

  • Victory Analysis: "List all WorldTour victories for Jonas Vingegaard."

  • Historical Comparison: "Compare the Grand Tour results of Primož Roglič and Jonas Vingegaard."

Race Research

  • Recent Results: "Show me the results of the 2023 Paris-Roubaix."

  • Historical Context: "Who are the youngest and oldest winners of the Tour of Flanders?"

  • Team Analysis: "Get the startlist for the 2023 Tour de France with detailed team information."

  • Race Statistics: "Show me the victory table for Liège-Bastogne-Liège. Who has won it the most times?"

  • Stage Information: "Can you show me the stage profiles for the 2023 Giro d'Italia?"

Sports Journalism

  • "Create a detailed profile of Remco Evenepoel for a cycling magazine article."

  • "Write a preview for the upcoming Tour de France based on the recent results of top contenders like Tadej Pogačar and Jonas Vingegaard."

  • "Analyze the evolution of Tom Pidcock's career based on his race results and team history."

Cycling Education

  • "Explain what makes the Monument classics special using data about their history and winners."

  • "Create an educational summary about Grand Tours and their significance in professional cycling."

  • "Describe the typical career progression of a professional cyclist using examples from the data."

Requirements

  • Python 3.10 or higher

  • uv package manager (recommended)

  • Dependencies as listed in pyproject.toml, including:

    • mcp

    • beautifulsoup4

    • lxml

    • pandas

    • slumber

    • and other packages for web scraping and data processing

Setup

  1. Clone this repository

  2. Create and activate a virtual environment:

    uv venv
    source .venv/bin/activate  # On macOS/Linux
    # or
    .venv\Scripts\activate  # On Windows
  3. Install dependencies:

    uv pip install -e .

FirstCycling API

This server uses the FirstCycling API, which has been integrated directly into the project. The API provides methods to fetch data from the FirstCycling website through web scraping.

MCP Tools

The server exposes the following tools through the Model Context Protocol:

Rider Information

Tool

Description

get_rider_info

Get basic biographical information about a rider including nationality, birthdate, weight, height, and current team

get_rider_best_results

Retrieve a rider's best career results, sorted by importance

get_rider_grand_tour_results

Get a rider's results in Grand Tours (Tour de France, Giro d'Italia, Vuelta a España)

get_rider_monument_results

Retrieve a rider's results in cycling's Monument classics

get_rider_team_and_ranking

Get a rider's team history and UCI ranking evolution over time

get_rider_race_history

Retrieve a rider's complete race participation history, optionally filtered by year

get_rider_one_day_races

Get a rider's results in one-day races, optionally filtered by year

get_rider_stage_races

Get a rider's results in multi-day stage races, optionally filtered by year

get_rider_teams

Retrieve the complete team history of a rider throughout their career

get_rider_victories

Get a list of a rider's career victories, with optional filters for WorldTour or UCI races

Race Information

Tool

Description

get_race_results

Retrieve results for a specific race edition by race ID and year

get_race_overview

Get general information about a race including history, records, and past winners

get_race_stage_profiles

Retrieve stage profiles and details for multi-stage races

get_race_startlist

Get the startlist for a specific race edition with detailed or basic team information

get_race_victory_table

Retrieve the all-time victory table for a race showing riders with most wins

get_race_year_by_year

Get year-by-year results for a race with optional classification filter

get_race_youngest_oldest_winners

Retrieve information about the youngest and oldest winners of a race

get_race_stage_victories

Get information about stage victories in multi-stage races

Search Tools

Tool

Description

search_rider

Search for riders by name, returning their IDs and basic information

search_race

Search for races by name, returning their IDs and basic information

Usage

Development Mode

You can test the server with MCP Inspector by running:

uv run mcp dev firstcycling.py

This will start the server and open the MCP Inspector in your browser, allowing you to test the available tools.

Integration with Claude for Desktop

To integrate this server with Claude for Desktop:

  1. Edit the Claude for Desktop config file, located at:

    • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

    • Windows: %APPDATA%\Claude\claude_desktop_config.json

  2. Add the server to your configuration:

    {
      "mcpServers": {
        "firstcycling": {
          "command": "uv",
          "args": ["--directory", "/path/to/server/directory", "run", "firstcycling.py"]
        }
      }
    }
  3. Restart Claude for Desktop

License

MIT

Available Tools

18 tools
get_race_detailsA

Get comprehensive details about a cycling race. This tool provides detailed information about a specific race, including its history, key statistics, route details, and other relevant information. The data can be filtered by specific classification.

Note: If you don't know the race's ID, use the search_race tool first to find it by name.

Example usage:
- Get details for Tour de France (ID: 17)
- Get details for Paris-Roubaix (ID: 30)

Returns a formatted string with:
- Race name, country, and category
- Historical information and key statistics
- Course details and characteristics
- Optional classification details
ParametersJSON Schema
NameRequiredDescriptionDefault
classification_numNo
race_idYes

TDQS

A3.6/5.0
Behavior2/5

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

With no annotations provided, the description carries full burden. It describes what information is returned (history, statistics, route) and mentions filtering by classification, but lacks critical behavioral details: whether this is a read-only operation, potential rate limits, authentication requirements, error conditions, or pagination behavior. The description covers basic functionality but misses important operational context.

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 well-structured with purpose statement, usage note, examples, and return format. While slightly verbose, each section adds value. The front-loaded purpose statement is clear, and the examples are helpful. Minor trimming could improve conciseness without losing information.

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

Completeness3/5

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

Given 2 parameters with 0% schema coverage and no output schema, the description provides adequate context for basic usage but has gaps. It explains the return format (formatted string with specific sections) which compensates for missing output schema, but doesn't fully document parameter semantics or behavioral traits. For a read operation with filtering, this is minimally complete but could be more comprehensive.

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

Parameters3/5

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 explains that race_id identifies a specific race and mentions filtering by classification (mapping to classification_num), but doesn't specify valid ranges, formats, or examples for classification_num. The description adds some meaning but doesn't fully document both parameters, especially classification_num's purpose and constraints.

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 states the tool's purpose: 'Get comprehensive details about a cycling race' with specific information types (history, statistics, route). It distinguishes from siblings like search_race (which finds races) and get_race_edition_results (which focuses on results). However, it doesn't explicitly differentiate from all siblings like get_race_victory_table.

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 provides explicit guidance: 'If you don't know the race's ID, use the search_race tool first to find it by name.' This clearly states when to use an alternative tool (search_race) and establishes a prerequisite workflow.

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

get_race_edition_resultsA

Get detailed results for a specific edition of a cycling race. This tool provides comprehensive results for a particular edition of a race, including rankings, time gaps, and other relevant statistics. Results can be filtered by classification or stage.

Note: If you don't know the race's ID, use the search_race tool first to find it by name.

Example usage:
- Get 2023 Tour de France general classification results (Race ID: 17, Year: 2023)
- Get 2022 Paris-Roubaix results (Race ID: 30, Year: 2022)
- Get results for stage 5 of 2023 Tour de France (Race ID: 17, Year: 2023, Stage: 5)

Returns a formatted string with:
- Race name, year, and category
- Complete result list with rankings and time gaps
- Rider names and teams
- Classification or stage specific information
ParametersJSON Schema
NameRequiredDescriptionDefault
classification_numNo
race_idYes
stage_numNo
yearYes

TDQS

A4.4/5.0
Behavior3/5

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. It adequately describes what the tool returns (formatted string with race details, results, rider info) but doesn't mention important behavioral aspects like rate limits, error conditions, authentication requirements, or whether results are cached/live. The description doesn't contradict annotations (none exist), but leaves significant behavioral context unspecified.

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 well-structured and appropriately sized: it starts with the core purpose, adds filtering context, provides prerequisite guidance, gives concrete examples, and details the return format. Every sentence adds value with zero redundant information.

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?

For a tool with 4 parameters, 0% schema coverage, no annotations, and no output schema, the description does a good job explaining the tool's purpose, usage, and return format. However, it doesn't fully compensate for the lack of behavioral context (rate limits, errors, etc.) or detailed parameter semantics (what classification numbers mean, valid ranges).

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

Parameters4/5

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

With 0% schema description coverage (titles only provide parameter names), the description must compensate. It effectively explains the purpose of race_id and year through examples, clarifies that classification_num and stage_num are optional filters, and shows how they work together. However, it doesn't explain what classification_num values represent or provide format details for any parameters.

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 tool's purpose with specific verb ('Get detailed results') and resource ('for a specific edition of a cycling race'), distinguishing it from sibling tools like get_race_details (which likely provides metadata) or search_race (which finds races). It explicitly mentions what results include: rankings, time gaps, and statistics.

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 provides explicit guidance on when to use this tool vs. alternatives: it instructs to use search_race first if the race ID is unknown, and mentions filtering by classification or stage. It also gives three concrete example use cases that illustrate different parameter combinations.

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

get_race_victory_tableA

Get the all-time victory table for a cycling race. This tool provides a historical summary of the most successful riders in a specific race, showing the number of victories for each rider throughout the race's history.

Note: If you don't know the race's ID, use the search_race tool first to find it by name.

Example usage:
- Get victory table for Tour de France (ID: 17)
- Get victory table for Paris-Roubaix (ID: 30)

Returns a formatted string with:
- Race name
- List of riders with the most victories
- Number of victories for each rider
- Years of victories where available
ParametersJSON Schema
NameRequiredDescriptionDefault
race_idYes

TDQS

A4.6/5.0
Behavior4/5

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. It effectively describes what the tool returns ('a formatted string with: race name, list of riders with the most victories, number of victories for each rider, years of victories where available'), which is crucial since there's no output schema. However, it doesn't mention potential limitations like data availability for all races or pagination for large result sets, leaving some behavioral aspects unspecified.

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 appropriately sized and front-loaded: the first sentence states the core purpose, followed by elaboration, usage note, examples, and return format. Every sentence adds value—none are redundant or wasteful—making it efficient and well-structured for quick understanding.

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?

Given the tool's moderate complexity (historical data retrieval), no annotations, no output schema, and low schema coverage, the description does a good job of covering key aspects: purpose, usage guidelines, parameter context, and return format. However, it lacks details on error handling or data completeness (e.g., what happens if no victory data exists), which would enhance completeness for this context.

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

Parameters4/5

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

The schema description coverage is 0%, so the description must compensate. It adds meaningful context for the single parameter (race_id) by explaining it's needed to identify the race and providing examples (Tour de France ID: 17, Paris-Roubaix ID: 30), which clarifies the parameter's purpose beyond the schema's basic type definition. However, it doesn't specify where to find these IDs or if they're standardized, leaving some ambiguity.

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 specific action ('Get the all-time victory table') and resource ('for a cycling race'), distinguishing it from sibling tools like get_race_details or get_race_edition_results by focusing on historical rider victories rather than race details or specific edition results. It explicitly mentions what the tool provides: 'a historical summary of the most successful riders in a specific race, showing the number of victories for each rider throughout the race's history.'

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 includes explicit guidance on when to use this tool versus alternatives: 'If you don't know the race's ID, use the search_race tool first to find it by name.' This directly addresses a common prerequisite and names the specific sibling tool to use as an alternative, providing clear context for proper tool selection.

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

get_rider_best_resultsA

Retrieve the best career results of a professional cyclist, including their top finishes in various races. This tool provides a comprehensive overview of a rider's most significant achievements throughout their career, including their highest positions in major races, stage wins, and overall classifications. Results are sorted by importance and include detailed information about each race.

Note: If you don't know the rider's ID, use the search_rider tool first to find it by name.

Example usage:
- Get top 10 best results for Tadej Pogačar (ID: 16973)
- Get top 5 best results for Jonas Vingegaard (ID: 16974)

Returns a formatted string with:
- Rider's name and career highlights
- Top results sorted by importance
- Race details including category and country
- Date and position for each result
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
rider_idYes

TDQS

A4.3/5.0
Behavior3/5

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

With no annotations provided, the description carries full burden. It discloses that results are 'sorted by importance' and include 'detailed information about each race,' which adds behavioral context beyond basic retrieval. However, it doesn't mention potential limitations like rate limits, authentication needs, or error conditions, leaving some behavioral aspects unclear.

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 well-structured with a clear purpose statement, usage note, examples, and return format details. Each sentence adds value, but it could be slightly more concise by integrating the return format into the initial overview without a separate bulleted list.

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?

Given no annotations and no output schema, the description does a good job covering purpose, usage, parameters, and return format. It provides enough context for an agent to use the tool effectively, though it could benefit from mentioning any prerequisites or error handling to be fully complete.

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

Parameters4/5

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 explains that 'rider_id' identifies the cyclist and provides example IDs, and implies 'limit' controls the number of results returned (e.g., 'top 10' or 'top 5'). This adds meaningful context beyond the bare schema, though it doesn't detail parameter constraints or formats explicitly.

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 specific action ('retrieve'), resource ('best career results of a professional cyclist'), and scope ('including top finishes, stage wins, overall classifications'). It distinguishes from siblings like 'get_rider_info' or 'get_rider_victories' by focusing on comprehensive best achievements rather than general info or just wins.

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 explicitly provides when-to-use guidance: 'If you don't know the rider's ID, use the search_rider tool first to find it by name.' It also implies usage context through example queries, helping differentiate from sibling tools that might return different data types or scopes.

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

get_rider_grand_tour_resultsA

Get comprehensive results for a rider in Grand Tours (Tour de France, Giro d'Italia, and Vuelta a España). This tool provides detailed information about a rider's performance in cycling's most prestigious three-week races, including their overall classification positions, stage wins, and special classification results. The data is organized chronologically and includes all relevant race details.

Note: If you don't know the rider's ID, use the search_rider tool first to find it by name.

Example usage:
- Get Grand Tour results for Tadej Pogačar (ID: 16973)
- Get Grand Tour results for Jonas Vingegaard (ID: 16974)

Returns a formatted string with:
- Results for each Grand Tour (Tour de France, Giro, Vuelta)
- Overall classification positions
- Stage wins and special classification results
- Time gaps and race details
ParametersJSON Schema
NameRequiredDescriptionDefault
rider_idYes

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden. It discloses that the tool returns 'detailed information' and a 'formatted string' with specific content (overall classification, stage wins, etc.), and mentions data is 'organized chronologically.' However, it doesn't cover potential limitations like rate limits, error conditions, or authentication needs, leaving some behavioral aspects unspecified.

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 well-structured and front-loaded with the core purpose, followed by usage notes, examples, and return details. Every sentence adds value—no redundancy or fluff—making it efficient and easy to parse.

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?

Given the single parameter, lack of annotations, and no output schema, the description does a solid job by covering purpose, usage, parameter context, and return format. However, it could be more complete by mentioning any data recency limits or access constraints, which are relevant for a data-fetching tool.

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

Parameters4/5

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

The input schema has 0% description coverage, but the description compensates by explaining that the rider_id parameter should be obtained via search_rider if unknown, and provides example IDs (e.g., 16973 for Tadej Pogačar). This adds meaningful context beyond the bare schema, though it doesn't detail ID format or validation rules.

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 specific action ('Get comprehensive results'), resource ('rider in Grand Tours'), and scope ('Tour de France, Giro d'Italia, and Vuelta a España'), distinguishing it from sibling tools like get_rider_monument_results or get_rider_one_day_races by focusing exclusively on three-week races.

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?

Explicit guidance is provided: 'If you don't know the rider's ID, use the search_rider tool first to find it by name.' This directly addresses a common prerequisite and names the alternative tool, giving clear when-to-use instructions.

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

get_rider_infoA

Get comprehensive information about a professional cyclist including their current team, nationality, date of birth, and recent race results. This tool provides a detailed overview of a rider's current status and recent performance in professional cycling races. The information includes their current team affiliation, nationality, age, and their most recent race results with positions and times.

Note: If you don't know the rider's ID, use the search_rider tool first to find it by name.

Example usage:
- Get basic info for Tadej Pogačar (ID: 16973)
- Get basic info for Jonas Vingegaard (ID: 16974)

Returns a formatted string with:
- Full name and current team
- Nationality and date of birth
- UCI ID and social media handles
- Last 5 race results with positions and times
- Total number of UCI victories
ParametersJSON Schema
NameRequiredDescriptionDefault
rider_idYes

TDQS

A4.3/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden. It discloses that the tool returns 'comprehensive information' and lists specific data points (e.g., team, nationality, recent results), which helps set expectations. However, it lacks details on potential limitations (e.g., data freshness, error handling, or rate limits), leaving behavioral gaps for a tool with no annotation support.

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 well-structured and front-loaded, starting with the core purpose. It uses bullet points for returns and examples efficiently, but includes some redundancy (e.g., repeating 'basic info' in examples when the description already states 'comprehensive information'). Overall, most sentences add value without excessive verbosity.

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?

Given no annotations, no output schema, and low schema coverage, the description does a good job by detailing the return format (formatted string with specific data points) and providing usage examples. It covers key aspects like purpose, parameters, and outputs, though it could improve by addressing potential errors or data scope limitations for better completeness.

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

Parameters4/5

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

The input schema has 0% description coverage (only 'rider_id' with type integer), so the description must compensate. It adds meaning by explaining that rider_id is required and provides examples (e.g., Tadej Pogačar ID: 16973), clarifying the parameter's purpose. However, it doesn't specify format constraints or sourcing details beyond the examples.

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 tool's purpose: 'Get comprehensive information about a professional cyclist' with specific details like current team, nationality, date of birth, and recent race results. It distinguishes itself from siblings by focusing on a comprehensive overview rather than specialized queries (e.g., get_rider_victories or get_rider_race_history).

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 provides explicit guidance: 'If you don't know the rider's ID, use the search_rider tool first to find it by name.' This clearly indicates when to use this tool (with a known ID) versus an alternative (search_rider for unknown IDs), addressing a key usage scenario.

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

get_rider_monument_resultsA

Retrieve detailed results for a rider in cycling's five Monument races (Milan-San Remo, Tour of Flanders, Paris-Roubaix, Liège-Bastogne-Liège, and Il Lombardia). These are the most prestigious one-day races in professional cycling. The tool provides comprehensive information about a rider's performance in these historic races, including their positions, times, and any special achievements.

Note: If you don't know the rider's ID, use the search_rider tool first to find it by name.

Example usage:
- Get Monument results for Tadej Pogačar (ID: 16973)
- Get Monument results for Mathieu van der Poel (ID: 16975)

Returns a formatted string with:
- Results for each Monument race
- Position and time for each participation
- Race details and special achievements
- Chronological organization by year
ParametersJSON Schema
NameRequiredDescriptionDefault
rider_idYes

TDQS

A4.3/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden. It discloses what information will be returned (positions, times, achievements, chronological organization) and the output format (formatted string), but doesn't mention error handling, rate limits, or authentication requirements that would be helpful for a read operation.

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 well-structured with purpose, context, prerequisites, examples, and return format. While slightly longer than minimal, every sentence adds value. The front-loading of the core purpose followed by practical guidance is effective.

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?

For a single-parameter read tool with no annotations or output schema, the description provides substantial context: clear purpose, usage prerequisites, examples, and detailed return format. The main gap is lack of error case information, but otherwise it's quite complete for this complexity level.

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

Parameters4/5

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

With 0% schema description coverage for the single parameter (rider_id), the description compensates by explaining what the parameter represents (rider's ID) and providing guidance on how to obtain it (use search_rider tool). The examples also demonstrate proper usage with specific rider IDs.

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 tool's purpose: 'Retrieve detailed results for a rider in cycling's five Monument races' with specific resources (rider's performance data) and scope (five named races). It distinguishes from siblings like get_rider_grand_tour_results by focusing exclusively on Monument races.

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 provides explicit guidance on when to use this tool ('If you don't know the rider's ID, use the search_rider tool first') and includes two concrete usage examples. It clearly positions this tool for Monument-specific results versus other rider result tools.

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

get_rider_one_day_racesA

Get a rider's results in one-day races, optionally filtered by year. This tool retrieves detailed information about a rider's performance in one-day races (classics and one-day events). It provides comprehensive data about positions, times, and race categories. Results can be filtered by a specific year.

Note: If you don't know the rider's ID, use the search_rider tool first to find it by name.

Example usage:
- Get one-day race results for Mathieu van der Poel (ID: 16672)
- Get 2023 one-day race results for Wout van Aert (ID: 16948)

Returns a formatted string with:
- Results in one-day races organized by year
- Position and time for each race
- Race category and details
- Chronological organization
ParametersJSON Schema
NameRequiredDescriptionDefault
rider_idYes
yearNo

TDQS

A4.4/5.0
Behavior3/5

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. It adequately describes the tool's function and output format (a formatted string with organized results), but lacks details on potential limitations, error handling, or performance aspects like rate limits. It doesn't contradict annotations, but could be more comprehensive for a tool with no structured behavioral hints.

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 well-structured and front-loaded, starting with the core purpose, followed by details, usage notes, examples, and return format. Every sentence adds value without redundancy, and it's appropriately sized for the tool's complexity, making it easy to scan and understand quickly.

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?

Given the tool's moderate complexity (2 parameters, no output schema, no annotations), the description is largely complete. It covers purpose, usage, parameters, and output format adequately. However, it could improve by mentioning any constraints on the 'year' parameter or error cases, but overall it provides sufficient context for an agent to use the tool effectively.

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

Parameters4/5

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

The schema description coverage is 0%, so the description must compensate. It effectively explains the semantics of both parameters: 'rider_id' is required for identifying the rider, with a note to use 'search_rider' if unknown, and 'year' is optional for filtering results. This adds meaningful context beyond the bare schema, though it doesn't specify format constraints or examples for the parameters.

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 tool's purpose with specific verbs ('get', 'retrieves') and resources ('rider's results in one-day races'), distinguishing it from siblings like 'get_rider_grand_tour_results' or 'get_rider_stage_races' by focusing exclusively on one-day races. It explicitly mentions the type of races (classics and one-day events) and the data provided (positions, times, race categories).

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 provides explicit guidance on when to use this tool vs. alternatives, including a prerequisite note to use 'search_rider' if the rider ID is unknown, and it distinguishes usage from other tools by specifying it's for one-day races only. The example usage further clarifies typical scenarios, making it easy for an agent to determine applicability.

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

get_rider_race_historyA

Get the complete race history of a professional cyclist, optionally filtered by year. This tool retrieves a comprehensive list of all races the rider has participated in, including their positions, times, and race categories. It provides a detailed overview of their racing career.

Note: If you don't know the rider's ID, use the search_rider tool first to find it by name.

Example usage:
- Get complete race history for Tadej Pogačar (ID: 16973)
- Get 2023 race history for Jonas Vingegaard (ID: 16974)

Returns a formatted string with:
- All races organized by year
- Position and time for each race
- Race category and details
- Chronological organization
ParametersJSON Schema
NameRequiredDescriptionDefault
rider_idYes
yearNo

TDQS

A4.3/5.0
Behavior3/5

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. It adequately describes the retrieval operation and output format, but lacks details about error handling, rate limits, authentication requirements, or data freshness. It doesn't contradict any annotations since none exist.

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 well-structured with purpose, usage note, examples, and return format sections. While slightly verbose, each sentence adds value. It could be more concise by combining some details about the return format.

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?

Given the 2-parameter tool with no annotations and no output schema, the description provides good coverage: purpose, parameters, usage guidance, examples, and return format. It adequately compensates for the lack of structured metadata, though could benefit from more behavioral details.

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

Parameters4/5

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

The description adds meaningful context beyond the schema's 0% coverage. It explains that rider_id identifies the cyclist and year is an optional filter, and provides concrete examples with specific IDs (16973, 16974). This compensates well for the schema's lack of descriptions.

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 tool's purpose with specific verbs ('get', 'retrieves') and resource ('complete race history of a professional cyclist'). It distinguishes from siblings by focusing on comprehensive historical data rather than specific result types (e.g., best results, victories) or other rider information.

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 provides explicit guidance on when to use this tool versus alternatives: it specifies to use search_rider first if the rider ID is unknown, and mentions optional year filtering. This directly addresses a key usage scenario and references a sibling tool.

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

get_rider_stage_racesA

Get a rider's results in stage races, optionally filtered by year. This tool retrieves detailed information about a rider's performance in stage races (multi-day races like Tour de France, Giro d'Italia, etc.). It provides comprehensive data about positions, times, and race categories. Results can be filtered by a specific year.

Note: If you don't know the rider's ID, use the search_rider tool first to find it by name.

Example usage:
- Get stage race results for Tadej Pogačar (ID: 16973)
- Get 2023 stage race results for Jonas Vingegaard (ID: 16974)

Returns a formatted string with:
- Results in stage races organized by year
- Position and time for each race
- Race category and details
- Chronological organization
ParametersJSON Schema
NameRequiredDescriptionDefault
rider_idYes
yearNo

TDQS

A4.3/5.0
Behavior3/5

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. It adequately describes the tool's function (retrieving detailed performance data) and output format (formatted string with organized results), but lacks information on potential limitations like rate limits, error conditions, or data freshness. It doesn't contradict any annotations since none exist.

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 well-structured and front-loaded with the core purpose, followed by details and examples. While slightly verbose in listing return format details, every sentence adds value (e.g., distinguishing stage races, providing usage notes, and examples). It could be more concise by combining some return format details.

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?

Given no annotations and no output schema, the description does a good job explaining the tool's purpose, usage, parameters, and return format. It covers the essential context for a read-only query tool with two parameters. Minor gaps include lack of error handling or performance characteristics, but it's largely complete for its complexity.

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

Parameters4/5

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

The schema description coverage is 0%, so the description must compensate. It explains that rider_id identifies the rider and year provides optional filtering, adding meaningful context beyond the bare schema. However, it doesn't specify format constraints (e.g., valid year ranges) or provide examples of invalid inputs.

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 specific action ('Get a rider's results in stage races') and resource ('stage races'), distinguishing it from siblings like get_rider_one_day_races and get_rider_grand_tour_results by specifying multi-day races like Tour de France and Giro d'Italia. It explicitly mentions what data is retrieved (positions, times, race categories).

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 provides explicit guidance on when to use this tool vs alternatives: it specifies to use search_rider first if the rider ID is unknown, and it distinguishes from other tools by focusing on stage races. The examples reinforce proper usage with specific rider IDs and filtering by year.

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

get_rider_team_and_rankingA

Get information about a professional cyclist's team affiliations and UCI rankings throughout their career. This tool retrieves the rider's team history and their UCI ranking points over time. It provides a comprehensive overview of their professional career progression through different teams and their performance in the UCI rankings.

Note: If you don't know the rider's ID, use the search_rider tool first to find it by name.

Example usage:
- Get team and ranking history for Tadej Pogačar (ID: 16973)
- Get team and ranking history for Jonas Vingegaard (ID: 16974)

Returns a formatted string with:
- Complete team history with years
- UCI ranking positions and points
- Career progression timeline
- Current team and ranking status
ParametersJSON Schema
NameRequiredDescriptionDefault
rider_idYes

TDQS

A4.3/5.0
Behavior3/5

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. It describes what the tool returns (formatted string with team history, ranking positions, timeline, current status) but lacks details on error handling, rate limits, authentication needs, or data freshness. It adequately covers the output format but misses operational constraints.

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 well-structured with a clear purpose statement, usage note, examples, and return format. It's slightly verbose but each section adds value. The front-loaded purpose is effective, though the 'Returns' section could be more concise.

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?

Given no annotations, 1 parameter with 0% schema coverage, and no output schema, the description does a good job covering purpose, usage, parameter meaning, and output format. It lacks details on errors or constraints, but for a read-only lookup tool, it provides sufficient context for basic use.

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

Parameters4/5

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

The input schema has 0% description coverage, but the description compensates by explaining the parameter's meaning: 'rider's ID' is required, and examples show it's a numeric identifier (e.g., 16973 for Tadej Pogačar). This adds crucial context beyond the bare schema, though it doesn't detail ID format or sourcing beyond the search_rider reference.

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 tool's purpose with specific verbs ('get information', 'retrieves', 'provides') and resources ('professional cyclist's team affiliations and UCI rankings', 'team history', 'ranking points over time'). It distinguishes from siblings like get_rider_info or get_rider_teams by emphasizing the combined career progression focus.

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 explicitly provides when-to-use guidance: 'If you don't know the rider's ID, use the search_rider tool first to find it by name.' It names the alternative tool (search_rider) and specifies the prerequisite condition, offering clear operational context.

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

get_rider_teamsA

Get a detailed history of a professional cyclist's team affiliations throughout their career. This tool provides a chronological list of all teams the rider has been part of, including years and team details.

Note: If you don't know the rider's ID, use the search_rider tool first to find it by name.

Example usage:
- Get team history for Peter Sagan (ID: 12345)
- Get career team changes for Chris Froome (ID: 67890)

Returns a formatted string with:
- Complete team history
- Years with each team
- Team names and details
- Chronological organization
ParametersJSON Schema
NameRequiredDescriptionDefault
rider_idYes

TDQS

A4.5/5.0
Behavior3/5

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. It adequately describes the tool's function and output format, but doesn't mention potential limitations like rate limits, authentication requirements, error conditions, or data freshness. It provides basic behavioral context but lacks operational details.

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 efficiently structured with purpose statement, usage note, examples, and return format - each section earns its place. It's front-loaded with the core functionality and avoids unnecessary verbosity while covering all essential aspects.

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?

For a single-parameter read operation with no output schema, the description provides good completeness: it explains the tool's purpose, parameter semantics, usage workflow, and output format. The main gap is lack of operational constraints (rate limits, errors, etc.), but given the tool's relative simplicity and clear sibling relationships, it's mostly complete.

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 has 0% description coverage (just 'Rider Id' with type integer), so the description must fully compensate. It clearly explains that the rider_id parameter should be obtained from the search_rider tool and provides concrete examples with sample IDs (12345, 67890), adding substantial meaning beyond the bare 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 clearly states the tool's purpose with specific verbs ('Get a detailed history', 'provides a chronological list') and resources ('professional cyclist's team affiliations', 'all teams the rider has been part of'). It distinguishes from siblings by focusing specifically on team history rather than race results, victories, or general rider info.

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 provides explicit guidance on when to use this tool versus alternatives: it directs users to 'use the search_rider tool first to find [the rider's ID] by name' if they don't know the ID. This creates a clear workflow relationship with a specific sibling tool.

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

get_rider_victoriesA

Get a comprehensive list of a rider's UCI victories. This tool retrieves detailed information about all UCI-registered race victories achieved by the cyclist throughout their career. Victories can be filtered to show only WorldTour wins if desired.

Note: If you don't know the rider's ID, use the search_rider tool first to find it by name.

Example usage:
- Get all UCI victories for Tadej Pogačar (ID: 16973)
- Get WorldTour victories for Jonas Vingegaard (ID: 16974)

Returns a formatted string with:
- Complete list of victories
- Race details including category
- Date and year of each victory
- Option to filter by WorldTour races only
ParametersJSON Schema
NameRequiredDescriptionDefault
rider_idYes
world_tour_onlyNo

TDQS

A4.7/5.0
Behavior4/5

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. It effectively describes what the tool does (retrieves detailed victory information), mentions filtering options (WorldTour only), and outlines the return format (formatted string with specific details). However, it lacks information on potential limitations like rate limits, error handling, or data freshness.

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 well-structured and front-loaded: it starts with the core purpose, adds filtering details, provides usage notes, includes practical examples, and ends with return value information. Every sentence adds value without redundancy, making it efficient and easy to parse.

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?

Given the complexity (2 parameters, no output schema, no annotations), the description does an excellent job covering purpose, usage, parameters, and return format. It lacks only minor details like error cases or pagination, but for a read-only query tool, it is nearly complete. The absence of an output schema is mitigated by the detailed return description.

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 description coverage is 0%, so the description must compensate. It fully explains both parameters: rider_id is described in the context of retrieving victories for a specific cyclist, and world_tour_only is explicitly mentioned as a filter option. The example usage further clarifies how these parameters are applied.

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 specific action ('retrieves detailed information about all UCI-registered race victories') and distinguishes it from siblings by focusing on comprehensive victory data rather than specific race types (e.g., grand_tour_results, monument_results) or basic rider info. It explicitly mentions filtering by WorldTour wins, which adds specificity.

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 provides explicit guidance on when to use this tool vs. alternatives: it instructs to use search_rider first if the rider ID is unknown, and it distinguishes from siblings by specifying that this tool is for 'comprehensive list of UCI victories' rather than subsets like best_results or race_history. The example usage reinforces this context.

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

get_rider_year_resultsA

Retrieve detailed results for a professional cyclist for a specific year. This tool provides comprehensive information about a rider's performance in all races during a given calendar year. It includes positions achieved, race categories, dates, and additional details.

Note: If you don't know the rider's ID, use the search_rider tool first to find it by name.

Example usage:
- Get 2023 results for Tadej Pogačar (ID: 16973)
- Get 2022 results for Jonas Vingegaard (ID: 16974)

Returns a formatted string with:
- Complete results for the specified year
- Position and time for each race
- Race category and details
- Chronological organization by date
ParametersJSON Schema
NameRequiredDescriptionDefault
rider_idYes
yearYes

TDQS

A4.4/5.0
Behavior3/5

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. It describes what the tool returns (formatted string with results, positions, categories, chronological organization) and implies it's a read-only operation, but lacks details on error handling, rate limits, authentication needs, or data freshness. It adds some value but is incomplete for a tool with no annotation coverage.

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 well-structured and front-loaded with the core purpose, followed by usage notes, examples, and return details. Every sentence adds value without redundancy, and the length is appropriate for the tool's complexity.

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?

Given no annotations, 0% schema coverage, and no output schema, the description does a good job explaining purpose, parameters, and returns. However, it lacks details on error cases (e.g., invalid IDs/years), performance limits, or data sources, leaving some gaps for a tool with rich output.

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

Parameters4/5

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 explains that 'rider_id' corresponds to a professional cyclist's identifier (with examples like '16973' for Tadej Pogačar) and 'year' is a calendar year for results (e.g., 2023). This adds meaningful context beyond the bare schema, though it doesn't detail format constraints or validation rules.

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 specific action ('retrieve detailed results'), resource ('professional cyclist'), and scope ('for a specific year'). It distinguishes from sibling tools by focusing on comprehensive yearly performance data rather than specific race types (e.g., 'get_rider_grand_tour_results') or general rider information ('get_rider_info').

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 explicitly provides when-to-use guidance by stating 'If you don't know the rider's ID, use the search_rider tool first to find it by name,' naming an alternative tool. It also implies usage context through example scenarios (e.g., 'Get 2023 results for Tadej Pogačar'), though it doesn't explicitly exclude other use cases.

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

get_start_listA

Get the start list for a specific edition of a cycling race. The start list includes rider numbers, names, and teams.

Note: If you don't know the race's ID, use the search_race tool first to find it by name.
If no year is specified, the current year will be used.

Example usage:
- Get start list for current year's Tour de France (Race ID: 17)
- Get start list for 2023 Paris-Roubaix (Race ID: 30, Year: 2023)

Returns a formatted string with:
- Race name and year
- List of participating teams
- Riders for each team with their race numbers
ParametersJSON Schema
NameRequiredDescriptionDefault
race_idYes
yearNo

TDQS

A4.5/5.0
Behavior3/5

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. It adequately describes the tool's function and output format, but doesn't address potential behavioral aspects like error conditions (e.g., what happens with invalid race IDs), rate limits, authentication requirements, or whether the operation is read-only (though 'Get' implies it).

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 efficiently structured with purpose statement, important notes, usage examples, and return format - all in well-organized paragraphs. Every sentence adds value without redundancy, and critical information (like the search_race prerequisite) is front-loaded.

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?

For a 2-parameter tool with no annotations and no output schema, the description provides excellent coverage of purpose, usage, parameters, and return format. The only minor gap is lack of explicit mention about the tool being read-only or any error handling, but given the clear 'Get' verb and detailed examples, it's largely complete.

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?

With 0% schema description coverage, the description fully compensates by explaining both parameters: 'race_id' is required and identifies the specific race edition, while 'year' is optional with default behavior (current year if unspecified). The examples further clarify parameter usage with concrete values.

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 tool's purpose with specific verb ('Get') and resource ('start list for a specific edition of a cycling race'), and distinguishes it from siblings by focusing on rider/team participation data rather than race results, rider history, or rankings. It explicitly mentions what the start list includes (rider numbers, names, and teams).

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 provides explicit guidance on when to use this tool vs alternatives: it directs users to use 'search_race' first if they don't know the race ID, and clarifies that if no year is specified, the current year will be used. This addresses both prerequisites and parameter defaults.

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

get_uci_rankingsB

Get UCI rankings for riders, teams, or nations. This tool provides access to the UCI ranking data for professional cyclists, teams, or nations. Results can be filtered by ranking type, year, and category.

Example usage:
- Get World UCI rider rankings for 2023
- Get Europe Tour UCI team rankings for 2022
- Get UCI nation rankings for 2023 in the World category

Returns a formatted string with:
- Ranking list with positions and points
- Filtered by specified categories
- Organized in a readable format
- Option to filter by country
ParametersJSON Schema
NameRequiredDescriptionDefault
categoryNoworld
country_codeNo
page_numNo
rank_typeNoriders
yearNo

TDQS

B3/5.0
Behavior2/5

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

With no annotations provided, the description carries full burden. It mentions the tool 'returns a formatted string' with details like ranking list and filtering, which adds some behavioral context. However, it doesn't disclose critical traits such as whether this is a read-only operation, rate limits, authentication needs, or pagination behavior (implied by 'page_num' parameter but not explained).

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 appropriately sized and front-loaded, starting with a clear purpose statement. The example usage and return format sections are useful but could be more concise. Overall, most sentences earn their place, though the return format description is somewhat repetitive (e.g., 'Filtered by specified categories' could be integrated).

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

Completeness3/5

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

Given 5 parameters with 0% schema coverage and no output schema, the description provides basic purpose and examples but lacks completeness. It doesn't fully explain parameter semantics, behavioral traits (e.g., pagination, errors), or output details beyond a vague 'formatted string'. For a tool with this complexity, it should do more to compensate for missing structured data.

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

Parameters2/5

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 mentions filtering by 'ranking type, year, and category' and provides examples that hint at parameters (e.g., 'World UCI rider rankings for 2023'), but doesn't fully explain all 5 parameters (category, country_code, page_num, rank_type, year) or their semantics (e.g., what values rank_type accepts). The description adds some meaning but insufficiently covers the parameters.

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 states the tool 'gets UCI rankings for riders, teams, or nations' with specific resources (riders/teams/nations) and action (get rankings). It distinguishes from siblings by focusing on rankings rather than race details, rider histories, or search functions. However, it doesn't explicitly contrast with 'get_rider_team_and_ranking' which might overlap.

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 provides implied usage through examples (e.g., 'Get World UCI rider rankings for 2023'), suggesting when to use this tool for ranking data. However, it lacks explicit guidance on when to choose this over alternatives like 'get_rider_team_and_ranking' or other sibling tools, and doesn't mention prerequisites or exclusions.

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

search_raceA

Search for cycling races by name. This tool helps find races by their name, returning a list of matching races with their IDs and countries. This is useful when you know a race's name but need its ID for other operations.

Example usage:
- Search for "tour" to find Tour de France and other tours
- Search for "giro" to find Giro d'Italia

Returns a formatted string with:
- List of matching races
- Each race's ID, name, and country
- Number of matches found
ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes

TDQS

A4.2/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden. It discloses that the tool returns a list of matching races with IDs and countries, and mentions the output format. However, it doesn't cover important behavioral aspects like pagination, rate limits, error conditions, or whether the search is case-sensitive/fuzzy. The example usage adds some context but leaves gaps.

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 well-structured and front-loaded: purpose first, then utility, examples, and return format. Every sentence earns its place - no redundant information. The example usage is helpful without being verbose.

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?

Given the tool's moderate complexity (single parameter search), no annotations, and no output schema, the description does a good job covering purpose, usage, parameter meaning, and return format. However, it lacks details about search behavior (exact vs. partial matching, sorting) and error handling that would make it fully complete.

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

Parameters4/5

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

The schema has 0% description coverage (no parameter descriptions in schema), but the description compensates well. It explains that the 'query' parameter is for searching by race name, provides two concrete examples ('tour' and 'giro'), and clarifies this is for name-based search. This adds significant meaning beyond the bare 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 clearly states the tool's purpose: 'Search for cycling races by name' (specific verb+resource). It distinguishes from siblings by focusing on name-based search rather than retrieving details, results, or rider information like get_race_details or search_rider. The description explicitly mentions what it returns and why it's useful.

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 provides clear context: 'useful when you know a race's name but need its ID for other operations,' which implicitly suggests using this tool for ID lookup rather than get_race_details for comprehensive race information. However, it doesn't explicitly state when NOT to use this tool or name specific alternatives among the siblings.

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

search_riderA

Search for professional cyclists by name. This tool helps find riders by their name, returning a list of matching riders with their IDs and basic information. This is useful when you need a rider's ID for other operations but only know their name.

Example usage:
- Search for "Tadej Pogacar" to find Tadej Pogačar's ID
- Search for "Van Aert" to find Wout van Aert's ID

Returns a formatted string with:
- List of matching riders
- Each rider's ID, name, nationality, and current team
- Number of matches found
ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes

TDQS

A4.6/5.0
Behavior4/5

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. It effectively describes the tool's behavior: it performs a search operation (implying read-only, non-destructive), returns a list of matches with specific fields (IDs, names, nationality, team), and indicates the output format. However, it lacks details on error handling, rate limits, or authentication needs.

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 well-structured and front-loaded with the core purpose, followed by usage guidance, examples, and output details. Each sentence adds value without redundancy, making it efficient and easy to parse for an AI agent.

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?

Given the tool's low complexity (1 parameter, no output schema, no annotations), the description is largely complete. It covers purpose, usage, parameters, and output format adequately. However, it could improve by mentioning limitations (e.g., partial name matching) or error cases, which would enhance completeness for a search tool.

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

Parameters4/5

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

The schema has 0% description coverage for its single parameter (query), but the description compensates by explaining that the query is used to 'search for professional cyclists by name' and provides examples (e.g., 'Tadej Pogacar', 'Van Aert'). This adds meaningful context beyond the bare schema, though it does not specify format constraints like case sensitivity.

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 tool's purpose with a specific verb ('search') and resource ('professional cyclists by name'), distinguishing it from sibling tools that focus on retrieving specific rider data (e.g., get_rider_info) or race-related information. It explicitly mentions returning IDs and basic information, which sets it apart as a lookup tool.

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 provides explicit guidance on when to use this tool ('when you need a rider's ID for other operations but only know their name'), including example use cases. It implicitly distinguishes it from sibling tools by focusing on name-based searching rather than retrieving pre-defined rider data, though it does not explicitly name alternatives.

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

TDQS

A3.8/5.0
Disambiguation3/5

The tools have clear distinctions between race-focused and rider-focused operations, but there is significant overlap within rider tools. For example, get_rider_best_results, get_rider_grand_tour_results, get_rider_monument_results, get_rider_one_day_races, get_rider_race_history, get_rider_stage_races, and get_rider_year_results all retrieve subsets of race results, which could confuse an agent about which to use for specific queries. The descriptions help differentiate, but the boundaries are fuzzy.

Naming Consistency5/5

All tool names follow a consistent snake_case pattern with a verb_noun structure (e.g., get_race_details, search_rider). The naming is predictable and readable throughout, with no deviations in style or convention, making it easy for an agent to parse and understand the tool purposes.

Tool Count3/5

With 18 tools, the count is on the higher side for a cycling data server, bordering on heavy. While the domain of professional cycling is broad, the tool set includes many overlapping rider result tools that could potentially be consolidated, making it feel slightly bloated but still within a reasonable scope.

Completeness4/5

The tool surface covers the cycling domain well with race details, results, rider information, and search functionalities. However, there are minor gaps, such as no tools for team details beyond rider affiliations, race calendars, or live race data, which agents might need for comprehensive coverage. The core operations are well-represented, allowing agents to work around these omissions.

Maintenance

ActivityInactive
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    An AI-powered companion that provides access to the RideWithGPS API, allowing you to interact with cycling routes, trips, events, and user data through natural language.
    6
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    Provides comprehensive Formula 1 data access including race schedules, session results, lap times, telemetry data, driver/constructor standings, and circuit information. Enables users to retrieve and analyze F1 racing data through natural language queries using the FastF1 Python package.
    5
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Provides access to Formula 1 data including driver and constructor championship standings with support for current and historical seasons. Enables users to query F1 championship information through natural language with plans for expanded race data and telemetry.
    22
    1
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Provides professional cycling data from ProCyclingStats, enabling race discovery, stage results, rider profiles, startlists, and free-text search through MCP tools.
    6
    3
    The Unlicense

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/r-huijts/firstcycling-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server