Skip to main content

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pitstop_f1-0.5.0.tar.gz (197.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pitstop_f1-0.5.0-py3-none-any.whl (81.6 kB view details)

Uploaded Python 3

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

Hashes for pitstop_f1-0.5.0.tar.gz
Algorithm Hash digest
SHA256 0679b495d5b88258bb61d8d9e7e2915c3817b51b8fdc814d4393c89ab7a82a8e
MD5 6f6e04edfa48d1ab8142424c1432f637
BLAKE2b-256 27192274b66acac0194b02ff473cd7fbae77dfdd66a711c00d36f37405d390fd

See more details on using hashes here.

Provenance

The following attestation bundles were made for pitstop_f1-0.5.0.tar.gz:

Publisher: release.yml on praneethravuri/pitstop

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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

Hashes for pitstop_f1-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c0d4c1959e5126e92846743e44595cb94c2b7f460bcf0c6eeba719c960c0a13b
MD5 88e765c3330dfb21b87b74c370add920
BLAKE2b-256 1c5a4a00749deb9dcf0ff2bc6809d230c07e3fe83f448bcaf055bf34192d062a

See more details on using hashes here.

Provenance

The following attestation bundles were made for pitstop_f1-0.5.0-py3-none-any.whl:

Publisher: release.yml on praneethravuri/pitstop

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page