All-in-one F1 MCP Server
Project description
Pitstop — F1 MCP Server
An HTTP-first Model Context Protocol (MCP) server for Formula 1 data. Aggregates real-time, historical, and news data from multiple authoritative sources into 11 tools ready for any MCP client.
v0.5.0 | Author: Praneeth Ravuri
Install
stdio, via uvx (no clone needed):
PITSTOP_TRANSPORT=stdio uvx pitstop-f1
Via the Claude Code CLI:
claude mcp add pitstop -e PITSTOP_TRANSPORT=stdio -- uvx pitstop-f1
Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"pitstop": {
"command": "uvx",
"args": ["pitstop-f1"],
"env": { "PITSTOP_TRANSPORT": "stdio" }
}
}
}
Docker (HTTP transport, runs the full server incl. the F1 database):
docker compose up
# → http://localhost:8000/mcp
Overview
Pitstop exposes F1 data as 11 MCP tools over HTTP (default) or stdio. It pulls from FastF1, Jolpica, OpenF1, Wikidata, RSS feeds, and its own seeded F1 database, handling pagination, retries, caching, and concurrency limits transparently.
Data Sources
| Source | Coverage | Type |
|---|---|---|
| FastF1 | 2018–present | Historical / timing / telemetry |
| Jolpica-F1 | 1950–present | Historical (Ergast-compatible) |
| OpenF1 | 2023–present | Real-time |
| Wikidata | All eras | SPARQL queries |
| RSS Feeds (20 sources) | Live | News |
| Pitstop F1 Database | 1950–present | Owned sqlite (seeded from F1DB, self-updated weekly from Jolpica) + per-lap times |
Database refresh: .github/workflows/db-update.yml runs weekly to pull new Jolpica results into the owned F1 database.
Tools
| Tool | Description | Key Parameters |
|---|---|---|
get_session_data |
Race/qualifying results, lap times, weather, driver details (2018–present) | year, gp, session, includes, page, page_size |
get_telemetry_data |
Lap-by-lap car telemetry (speed, throttle, brake, gears) (2018–present) | year, gp, session, drivers, lap_numbers, max_points, page, page_size |
get_live_data |
Live intervals, pit stops, team radio, stints, race control, weather, position, laps, overtakes (2023–present) | data_types, year, country, session_name, driver_number, compound, flag, category, page, page_size |
get_standings |
Driver and constructor championship standings (1950–present) | year, round, type, driver_name, team_name, page, page_size |
get_schedule |
Race calendar and session schedule | year, include_testing, round, event_name, only_remaining, page, page_size |
get_reference_data |
Circuits, drivers, constructors encyclopedia (1950–present) | reference_type, year, name, page, page_size |
get_f1_news |
F1 headlines from 20 RSS sources | source, limit, keywords, driver, team, circuit, year, date_from, date_to, page, page_size |
get_results |
Race/qualifying/sprint results, lap times, pit stops (1950–present) | year, round, result_type, driver, page |
get_race_analysis |
Pace, tire degradation, stint summaries, consistency (2018–present) | year, gp, session, drivers, analysis_type, page |
query_wikidata |
SPARQL queries to Wikidata for F1 biography, career records, history | sparql, page, page_size |
query_f1_database |
Read-only SQL over pitstop's owned F1 database (1950–present): results, standings, driver family trees, team lineage | sql, page, page_size |
Transport
HTTP (default)
uv sync
uv run pitstop
# → http://localhost:8000
MCP client config:
{
"mcpServers": {
"pitstop": {
"type": "http",
"url": "http://localhost:8000/mcp"
}
}
}
stdio (opt-in)
PITSTOP_TRANSPORT=stdio uv run pitstop
MCP client config:
{
"mcpServers": {
"pitstop": {
"command": "uv",
"args": ["run", "--directory", "/path/to/pitstop", "pitstop"],
"env": { "PITSTOP_TRANSPORT": "stdio" }
}
}
}
Health API
| Endpoint | Purpose |
|---|---|
GET /health |
Per-source status (FastF1, f1db, Jolpica, OpenF1, RSS) |
GET /live |
Liveness probe |
GET /ready |
Readiness probe |
Example /health response:
{
"version": "0.5.0",
"overall": "ok",
"sources": [
{ "name": "fastf1", "status": "ok", "latency_ms": 2, "detail": "cache writable" },
{ "name": "f1db", "status": "ok", "latency_ms": 1, "detail": "" },
{ "name": "jolpica", "status": "ok", "latency_ms": 134, "detail": "" },
{ "name": "openf1", "status": "ok", "latency_ms": 98, "detail": "" },
{ "name": "rss", "status": "ok", "latency_ms": 210, "detail": "" }
]
}
overall is "ok" / "degraded" / "down". HTTP 200 / 207 / 503.
Wikidata SPARQL
query_wikidata runs SPARQL queries against Wikidata for biographical and historical F1 facts not covered by race APIs.
Only SELECT and ASK queries are accepted (read-only). Always include LIMIT in your query.
Example — find F1 drivers with their birthdate:
SELECT ?driver ?driverLabel ?birthDate WHERE {
?driver wdt:P31 wd:Q5 ;
wdt:P641 wd:Q1968 ;
wdt:P569 ?birthDate .
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
} ORDER BY DESC(?birthDate) LIMIT 10
Pagination
All list-returning tools accept page (1-based, default 1) and page_size (defaults vary per tool: 10–50). Responses include a pagination block:
{
"data": [...],
"pagination": {
"page": 1,
"page_size": 20,
"total_items": 47,
"total_pages": 3,
"has_next": true,
"has_prev": false
}
}
Configuration
| Variable | Default | Description |
|---|---|---|
PITSTOP_TRANSPORT |
http |
http or stdio |
PITSTOP_HOST |
0.0.0.0 |
Bind address (HTTP only) |
PITSTOP_PORT |
8000 |
Listen port (HTTP only) |
PITSTOP_ENV |
development |
development or production |
PITSTOP_LOG_LEVEL |
Depends on PITSTOP_ENV |
DEBUG if development, else INFO |
PITSTOP_LOG_FORMAT |
Depends on PITSTOP_ENV |
text if development, else json |
PITSTOP_ENABLE_CACHING |
true |
Enable HTTP response and FastF1 disk caching |
PITSTOP_CACHE_TTL_SECONDS |
300 |
HTTP response cache time-to-live (seconds) |
PITSTOP_RATE_LIMIT_ENABLED |
false |
Enable concurrent-call limiting |
PITSTOP_RATE_LIMIT_PER_HOUR |
3600 |
Max concurrent calls (derived from per-hour quota) |
FASTF1_CACHE |
cache |
FastF1 cache directory path |
Caching
Pitstop uses in-memory HTTP response caching (via Hishel) for GET requests with 200 responses. This keeps tool calls inside upstream rate limits:
- Jolpica: 4 req/s, 500/hr
- OpenF1: 3 req/s, 30/min
- Wikidata: Query complexity limits
- RSS: Per-feed redirects cached
FastF1 maintains its own disk cache in FASTF1_CACHE directory. Control caching via:
PITSTOP_ENABLE_CACHING=true(default)PITSTOP_CACHE_TTL_SECONDS=300(default)
Development
uv sync --dev
uv run pytest
uv run ruff check src/
Contributing
See CONTRIBUTING.md.
Credits & attribution
| Source | Description | License |
|---|---|---|
| F1DB | Database seeded from F1DB and subsequently modified & extended by pitstop | CC BY 4.0 |
| FastF1 | Python library for F1 timing, telemetry, and session data | MIT |
| Jolpica-F1 | Ergast-compatible F1 data API, 1950–present; also used to self-update the F1DB-seeded database weekly | — |
| OpenF1 | Free open-source API for real-time F1 data | MIT |
| Wikidata | Open knowledge graph with SPARQL query service | CC0 |
| Ergast Motor Racing API | Historical F1 data 1950–2024 (now served via Jolpica) | — |
| RSS Feeds (20 sources) | News headlines, credited collectively; see each feed's link field in get_f1_news results |
Respective publishers |
Not affiliated with Formula 1 or the FIA. Data provided by third-party sources under their respective terms.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pitstop_f1-0.5.0.tar.gz.
File metadata
- Download URL: pitstop_f1-0.5.0.tar.gz
- Upload date:
- Size: 197.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0679b495d5b88258bb61d8d9e7e2915c3817b51b8fdc814d4393c89ab7a82a8e
|
|
| MD5 |
6f6e04edfa48d1ab8142424c1432f637
|
|
| BLAKE2b-256 |
27192274b66acac0194b02ff473cd7fbae77dfdd66a711c00d36f37405d390fd
|
Provenance
The following attestation bundles were made for pitstop_f1-0.5.0.tar.gz:
Publisher:
release.yml on praneethravuri/pitstop
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pitstop_f1-0.5.0.tar.gz -
Subject digest:
0679b495d5b88258bb61d8d9e7e2915c3817b51b8fdc814d4393c89ab7a82a8e - Sigstore transparency entry: 2075940917
- Sigstore integration time:
-
Permalink:
praneethravuri/pitstop@631571d6c6b0521a6d966f506f52e2241fba2fc2 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/praneethravuri
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@631571d6c6b0521a6d966f506f52e2241fba2fc2 -
Trigger Event:
push
-
Statement type:
File details
Details for the file pitstop_f1-0.5.0-py3-none-any.whl.
File metadata
- Download URL: pitstop_f1-0.5.0-py3-none-any.whl
- Upload date:
- Size: 81.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c0d4c1959e5126e92846743e44595cb94c2b7f460bcf0c6eeba719c960c0a13b
|
|
| MD5 |
88e765c3330dfb21b87b74c370add920
|
|
| BLAKE2b-256 |
1c5a4a00749deb9dcf0ff2bc6809d230c07e3fe83f448bcaf055bf34192d062a
|
Provenance
The following attestation bundles were made for pitstop_f1-0.5.0-py3-none-any.whl:
Publisher:
release.yml on praneethravuri/pitstop
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pitstop_f1-0.5.0-py3-none-any.whl -
Subject digest:
c0d4c1959e5126e92846743e44595cb94c2b7f460bcf0c6eeba719c960c0a13b - Sigstore transparency entry: 2075941226
- Sigstore integration time:
-
Permalink:
praneethravuri/pitstop@631571d6c6b0521a6d966f506f52e2241fba2fc2 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/praneethravuri
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@631571d6c6b0521a6d966f506f52e2241fba2fc2 -
Trigger Event:
push
-
Statement type: