Skip to main content
Glama
lewis-mcgillion

ProCyclingStats MCP Server

ProCyclingStats MCP Server

An MCP (Model Context Protocol) server that provides professional cycling data from ProCyclingStats.

Tools

Tool

Description

discover_races

Find races from the PCS calendar for a given year and tier

get_race_overview

Get race metadata — name, dates, category, stages list

get_stage_results

Get full stage/one-day race results with metadata

get_rider_profile

Get rider bio, physical stats, specialty scores, palmares

get_race_startlist

Get the startlist for a race grouped by team

search_pcs

Free-text search for riders, races, and teams

Related MCP server: Chess.com MCP Server

Installation

pip install git+https://github.com/lewis-mcgillion/procyclingstats-mcp-server.git

Or clone and install locally:

git clone https://github.com/lewis-mcgillion/procyclingstats-mcp-server.git
cd procyclingstats-mcp-server
pip install -e .

Usage

Run the server directly

procyclingstats-mcp

Configure in your MCP client

Add to your MCP client config (e.g. Claude Desktop, VS Code GitHub Copilot).

Recommended — using uvx (no manual install needed):

{
  "mcpServers": {
    "procyclingstats": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/lewis-mcgillion/procyclingstats-mcp-server.git", "procyclingstats-mcp"]
    }
  }
}

Using a local clone with uv:

{
  "mcpServers": {
    "procyclingstats": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/procyclingstats-mcp-server", "procyclingstats-mcp"]
    }
  }
}

Using a global install:

{
  "mcpServers": {
    "procyclingstats": {
      "command": "procyclingstats-mcp",
      "args": []
    }
  }
}

Example Queries

  • "What WorldTour races are happening in 2025?"

  • "Show me the results of Tour de France 2025 Stage 1"

  • "What's Tadej Pogačar's rider profile?"

  • "Who's on the startlist for the Giro d'Italia 2025?"

  • "Search for Remco Evenepoel"

URL Format

All PCS URLs use the slug format:

  • Races: race/tour-de-france/2025

  • Stages: race/tour-de-france/2025/stage-1

  • One-day results: race/milano-sanremo/2025/result

  • Riders: rider/tadej-pogacar

Rate Limiting

The server enforces a 0.5s delay between requests to PCS and retries automatically on server errors (500/502/503/429).

Credits

Built on top of the procyclingstats Python library.

Available Tools

6 tools
discover_racesA

Discover professional cycling races from the PCS calendar for a given year.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearYesCalendar year (e.g. 2025).
tiersNoOptional list of race tier filters. Valid values: 'worldtour', 'proseries', 'class1', 'class2'. Defaults to ['worldtour', 'proseries'] (top two tiers).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It does not disclose whether the operation is read-only, any rate limits, authorization requirements, or pagination behavior. The existence of an output schema partially mitigates the lack of return value details, but the description adds minimal behavioral context beyond the purpose.

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?

A single sentence that is direct and front-loaded with the verb and resource. No extraneous information; every word earns its place.

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?

The tool is simple with 2 parameters and an output schema. The description covers the core purpose but omits mentioning that the 'tiers' parameter can filter results. While the schema provides this, a more complete description would note filtering capability.

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 100% for both parameters (year and tiers), so the schema already documents their meaning. The description does not elaborate on parameters beyond what is in the schema, meeting the baseline for high coverage.

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 fetches professional cycling races from the PCS calendar for a given year, with a specific verb ('discover') and resource. It distinguishes from sibling tools like 'get_race_overview' or 'get_stage_results' which target individual races or details.

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 implies usage for listing races by year, but lacks explicit when-to-use vs alternatives or exclusions. However, the context of sibling tools makes it clear this is for discovery, not detailed views.

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

get_race_overviewA

Get metadata and stage list for a race.

ParametersJSON Schema
NameRequiredDescriptionDefault
race_urlYesPCS race URL, e.g. 'race/tour-de-france/2025'. Can also be a base URL like 'race/tour-de-france' for the latest edition.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior2/5

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

No annotations provided, and the description lacks behavioral details such as authentication requirements, rate limits, or side effects. It only states what the tool returns, not how it behaves.

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 a single, concise sentence that effectively communicates the core function without unnecessary words.

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 simple input (one parameter) and the presence of an output schema, the description is largely sufficient. However, it could mention that it returns both metadata and stage list to confirm expectations.

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 coverage is 100% for the single parameter 'race_url', with a clear description in the schema. The tool description repeats the purpose but adds no additional detail about 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 tool retrieves 'metadata and stage list for a race', specifying verb and resource. It is distinct from sibling tools like discover_races (search) and get_stage_results (specific stage data).

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?

No explicit guidance on when to use this tool versus siblings. The description implies its purpose but does not exclude cases where other tools might be more appropriate, leaving ambiguity.

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

get_race_startlistB

Get the startlist for a race.

ParametersJSON Schema
NameRequiredDescriptionDefault
race_urlYesPCS race URL, e.g. 'race/tour-de-france/2025'. The '/startlist' suffix is added automatically.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior2/5

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

No annotations are provided, and the description is minimal. It does not disclose behavioral traits such as what the startlist includes, authentication requirements, or side effects. The description adds no value beyond the name.

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 a single sentence, which is concise and front-loaded. However, it could benefit from slightly more detail to improve its utility without becoming verbose.

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?

The tool has an output schema, so the description does not need to explain return values. However, given the simplicity of the tool, the description is adequate but minimal, lacking details about the structure of the startlist.

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?

The input schema has 100% coverage with a clear description of the race_url parameter. The description does not add additional meaning beyond the schema, so a baseline score of 3 is appropriate.

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 'Get the startlist for a race' clearly states the action (get) and the resource (startlist for a race). It is specific and distinguishes from sibling tools like get_race_overview and get_stage_results.

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?

No explicit usage guidelines are provided. The context signals include sibling tool names, which helps infer when to use this tool, but the description lacks guidance on when to use it versus alternatives.

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

get_rider_profileC

Get a professional cyclist's profile from PCS.

ParametersJSON Schema
NameRequiredDescriptionDefault
rider_urlYesPCS rider URL, e.g. 'rider/tadej-pogacar'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, and the description only indicates a read operation ('Get'). It does not disclose any behavioral traits such as rate limits, authentication needs, or what happens if the rider URL is invalid.

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 a single, front-loaded sentence that effectively conveys the tool's core purpose. It is concise without being under-specified.

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 the tool's simplicity (one parameter, output schema present), the description provides minimal but adequate context. However, it lacks usage guidelines and fails to mention that the rider URL is required.

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?

The schema covers the single parameter fully with an example. The description does not add extra meaning beyond the schema, but the high coverage (100%) justifies a baseline score of 3.

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 verb 'Get', the resource 'professional cyclist's profile', and the source 'PCS'. It is specific enough to distinguish from sibling tools that focus on races and searches.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives like search_pcs. The description lacks context for usage scenarios or prerequisites.

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

get_stage_resultsA

Get results and metadata for a specific stage or one-day race.

ParametersJSON Schema
NameRequiredDescriptionDefault
stage_urlYesPCS stage URL, e.g. 'race/tour-de-france/2025/stage-1'. For one-day races use 'race/milano-sanremo/2025/result'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior2/5

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

No annotations are present, so the description must fully disclose behavioral traits. It only states the operation type (get), but omits details like authentication requirements, rate limits, error behavior, or what happens with invalid URLs.

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 a single, front-loaded sentence that efficiently conveys the tool's functionality without any redundant language. Every word serves a purpose.

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 simplicity (one parameter, output schema present), the description is nearly complete. It explains the input format but could briefly mention what 'metadata' includes. However, the output schema likely covers that, so this is a minor gap.

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 covers the single parameter with description, and the tool description adds value by providing concrete examples ('race/tour-de-france/2025/stage-1' and 'race/milano-sanremo/2025/result'), clarifying differences between stage and one-day races beyond 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 clearly states the tool retrieves results and metadata for a stage or one-day race. It uses a specific verb ('get') and resource ('results and metadata'), and the context of sibling tools like 'discover_races' and 'get_race_overview' differentiates its purpose.

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 implies when to use the tool (when needing results for a stage or one-day race) but lacks explicit guidance on when not to use it or alternatives. No direct mention of alternatives among siblings is provided.

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

search_pcsB

Search ProCyclingStats for riders, races, or teams.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesSearch text (e.g. 'Pogacar', 'Tour de France', 'UAE').
max_resultsNoMaximum number of results (default 20).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior2/5

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

No annotations are provided, and the description only states the search scope. It lacks details on read-only nature, side effects, or response behavior (e.g., pagination, result limits), leaving the agent with insufficient behavioral 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?

One sentence, no wasted words. It is front-loaded. Could improve by adding minimal usage context without being verbose.

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 that an output schema exists, description does not need to detail return values. However, it omits search behavior (e.g., ordering, default limits), which would help the agent despite the output schema.

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 covers all parameters with descriptions, so the description adds no extra meaning beyond the input schema. Baseline 3 applies.

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 searches for three entity types (riders, races, teams) using a specific verb. This distinguishes it from sibling tools like discover_races and get_rider_profile, which are narrow.

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?

No explicit guidance on when to use this tool versus alternatives. The description implies general search, but does not state when to prefer specific tools or when not to use this tool.

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

TDQS

A3.7/5.0
Disambiguation5/5

Each tool has a distinct purpose: discovering races, getting race overview, startlist, rider profile, stage results, and general search. No overlap or ambiguity.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern with snake_case, e.g., discover_races, get_race_overview, get_rider_profile. No deviations.

Tool Count5/5

6 tools is well-scoped for a cycling statistics server. Each tool covers a necessary operation without being excessive or insufficient.

Completeness4/5

The set covers core operations: race discovery, details, participants, rider profiles, stage results, and search. Missing team profiles and detailed rider season results, but the essential domain is covered.

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
    A
    quality
    D
    maintenance
    Provides professional cycling data from FirstCycling, allowing users to retrieve comprehensive information about cyclists, race results, historical cycling data, and team information through natural language queries.
    18
    19
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    Provides access to Chess.com player data, game records, and public information through standardized MCP interfaces, allowing AI assistants to search and analyze chess information.
    10
    87
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    MCP server exposing ProCyclingStats teams, riders, and races data by scraping site pages, enabling custom rankings and historical result analysis.
  • F
    license
    Not graded
    quality
    B
    maintenance
    Exposes Zwift training history stored in a local SQLite database to MCP clients and a REST API, enabling queries for activities, power curves, race results, and training load.

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/lewis-mcgillion/procyclingstats-mcp-server'

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