# pitstop [Health: Active]

**Category:** 🗄️ Databases  
**Repository:** https://github.com/praneethravuri/pitstop  
**GitHub Stars:** 1  
**npm Downloads (last month):** 19  
**Views:** 0  
**Installs:** 0  
**Upvotes:** 0  
**Directory Page:** https://allmcps.com/mcp/pitstop

## Description
F1 MCP server: live timing, telemetry, standings, news, and a queryable 1950-present database.

## Tools
Capabilities this server exposes over MCP:

- **get_session_data** — Race/qualifying results, lap times, weather, driver details (2018–present)
- **get_telemetry_data** — Lap-by-lap car telemetry (speed, throttle, brake, gears) (2018–present)
- **get_live_data** — Live intervals, pit stops, team radio, stints, race control, weather, position, laps, overtakes (2023–present)
- **get_standings** — Driver and constructor championship standings (1950–present)
- **get_schedule** — Race calendar and session schedule
- **get_reference_data** — Circuits, drivers, constructors encyclopedia (1950–present)
- **get_f1_news** — F1 headlines from 20 RSS sources
- **get_results** — Race/qualifying/sprint results, lap times, pit stops (1950–present)
- **get_race_analysis** — Pace, tire degradation, stint summaries, consistency (2018–present)
- **query_wikidata** — SPARQL queries to Wikidata for F1 biography, career records, history
- **query_f1_database** — Read-only SQL over pitstop's owned F1 database (1950–present): results, standings, driver family trees, team lineage

## Claude Desktop Quick Installation
Install path detected from listing signals. Uses `uvx` (confidence: high):

```json
"mcpServers": {
  "pitstop": {
    "command": "uvx",
    "args": ["pitstop-f1"]
  }
}
```

## Documentation & README

# Pitstop — F1 MCP Server

<!-- mcp-name: io.github.praneethravuri/pitstop -->

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](https://github.com/praneethravuri)

---

## Install

### Hosted endpoint (nothing to install)

A free public instance runs on [Hugging Face Spaces](https://huggingface.co/spaces/praneeth1025/pitstop):

```
https://praneeth1025-pitstop.hf.space/mcp
```

```bash
claude mcp add --transport http pitstop https://praneeth1025-pitstop.hf.space/mcp
```

Note: the Space sleeps after long inactivity — the first request after a quiet spell takes a cold start.

### Local install

stdio, via [uvx](https://docs.astral.sh/uv/guides/tools/) (no clone needed):

```bash
PITSTOP_TRANSPORT=stdio uvx pitstop-f1
```

[Claude Code](https://docs.claude.com/en/docs/claude-code):

```bash
claude mcp add pitstop -e PITSTOP_TRANSPORT=stdio -- uvx pitstop-f1
```

[Codex CLI](https://github.com/openai/codex):

```bash
codex mcp add pitstop --env PITSTOP_TRANSPORT=stdio -- uvx pitstop-f1
```

[Gemini CLI](https://github.com/google-gemini/gemini-cli):

```bash
gemini mcp add pitstop uvx pitstop-f1 --env PITSTOP_TRANSPORT=stdio
```

VS Code:

```bash
code --add-mcp '{"name":"pitstop","command":"uvx","args":["pitstop-f1"],"env":{"PITSTOP_TRANSPORT":"stdio"}}'
```

Claude Desktop (`claude_desktop_config.json`), Cursor (`~/.cursor/mcp.json`), and Windsurf (`~/.codeium/windsurf/mcp_config.json`) share the same JSON shape:

```json
{
  "mcpServers": {
    "pitstop": {
      "command": "uvx",
      "args": ["pitstop-f1"],
      "env": { "PITSTOP_TRANSPORT": "stdio" }
    }
  }
}
```

Docker (HTTP transport, runs the full server incl. the F1 database):

```bash
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](https://github.com/theOehrly/Fast-F1) | 2018–present | Historical / timing / telemetry |
| [Jolpica-F1](https://github.com/jolpica/jolpica-f1) | 1950–present | Historical (Ergast-compatible) |
| [OpenF1](https://openf1.org/) | 2023–present | Real-time |
| [Wikidata](https://www.wikidata.org/) | 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)

```bash
uv sync
uv run pitstop
# → http://localhost:8000
```

MCP client config:

```json
{
  "mcpServers": {
    "pitstop": {
      "type": "http",
      "url": "http://localhost:8000/mcp"
    }
  }
}
```

### stdio (opt-in)

```bash
PITSTOP_TRANSPORT=stdio uv run pitstop
```

MCP client config:

```json
{
  "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:

```json
{
  "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](https://query.wikidata.org/) 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:

```sparql
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:

```json
{
  "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](https://github.com/karpetrosyan/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

```bash
uv sync --dev
uv run pytest
uv run ruff check src/
```

---

## Contributing

See [CONTRIBUTING.md](https://github.com/praneethravuri/pitstop/blob/HEAD/CONTRIBUTING.md).

---

## Credits & attribution

| Source | Description | License |
|--------|-------------|---------|
| [F1DB](https://github.com/f1db/f1db) | Database seeded from F1DB and subsequently modified & extended by pitstop | CC BY 4.0 |
| [FastF1](https://github.com/theOehrly/Fast-F1) | Python library for F1 timing, telemetry, and session data | MIT |
| [Jolpica-F1](https://github.com/jolpica/jolpica-f1) | Ergast-compatible F1 data API, 1950–present; also used to self-update the F1DB-seeded database weekly | — |
| [OpenF1](https://openf1.org/) | Free open-source API for real-time F1 data | MIT |
| [Wikidata](https://www.wikidata.org/) | Open knowledge graph with SPARQL query service | CC0 |
| [Ergast Motor Racing API](https://ergast.com/mrd/) | 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.

