Skip to main content
Glama
lewis-mcgillion

ProCyclingStats MCP Server

README.md
# ProCyclingStats MCP Server

An MCP (Model Context Protocol) server that provides professional cycling data from [ProCyclingStats](https://www.procyclingstats.com).

## 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 |

## Installation

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

Or clone and install locally:

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

## Usage

### Run the server directly

```bash
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):

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

**Using a local clone with `uv`:**

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

**Using a global install:**

```json
{
  "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](https://pypi.org/project/procyclingstats/) Python library.

TDQS

A3.7/5.0

Scored across 6 tools

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