Skip to main content
Glama
Pitwall F1

Pitwall F1

by darshjoshi

Pitwall F1

Turn Claude into your F1 race engineer. Real telemetry, real strategy data, 75 years of history.

Pitwall F1 is a Claude plugin that bundles an MCP server with 77 read-only tools and an f1 skill. The skill teaches Claude which tool to use and how to explain Formula 1 to someone watching their first race.

Verstappen vs Norris — Abu Dhabi 2024 qualifying speed trace

Unofficial project. Pitwall F1 is not affiliated with, endorsed by, or connected to Formula 1, the FIA, Formula One Management, or any F1 team. F1, FORMULA 1 and related marks are trademarks of Formula One Licensing B.V.

What you can ask

  • "Who won the 2025 Australian GP?"

  • "What was Verstappen's speed on lap 25 at Monaco?"

  • "Plot Hamilton vs Norris speed trace in qualifying"

  • "Compare Ferrari's tyre strategy at Silverstone"

  • "Who won the 1994 championship?"

  • "Who's leading right now, and what's the gap?" (during a live session)

Related MCP server: mcp-f1analisys

What's inside

  • Results and classification: race, sprint and qualifying results, grid vs finish, DNFs, penalties

  • Timing and telemetry: lap times, sector times, speed traps, and 4 Hz telemetry (speed, RPM, throttle, brake, gear)

  • Strategy: tyre stints, compounds, pit stops, long-run pace, undercut analysis

  • Plots: speed traces, gear shift maps and multi-lap comparisons, returned as PNG images drawn locally with matplotlib

  • History: race results and championships back to 1950

  • Live timing: 16 tools for positions, gaps, tyres, flags and weather while a session is running

Every tool is read-only and carries a readOnlyHint annotation. None of them need an account, a login or an API key.

Install

Requires uv.

/plugin marketplace add darshjoshi/pitwall-f1
/plugin install pitwall-f1@pitwall-f1

Or install it from the Claude directory once it's listed.

What the plugin runs

The plugin starts one local MCP server over stdio:

uv run --locked --project ${CLAUDE_PLUGIN_ROOT} ${CLAUDE_PLUGIN_ROOT}/pitwall.py

On first start, uv installs the exact dependency versions recorded in uv.lock (FastF1, pandas, numpy, matplotlib, the MCP SDK and a few HTTP libraries) from PyPI into a virtual environment inside the plugin folder. It takes about 35 seconds and roughly 250 MB, plus uv's download cache. Later starts take under a second.

All server code is in this repository as readable Python: pitwall.py (the tools), signalr_client.py, merger.py, decompressor.py and topics.py (the live-timing client).

Network access

Pitwall F1 only makes outbound requests to fetch public F1 data. It sends each service only the parameters of the request (season, event, session), never your conversation, files or any personal data.

Host

Why

livetiming.formula1.com (HTTPS and WSS)

Session timing archive (2018 onward) and the public live-timing feed

api.jolpi.ca

Historical results and standings from 1950 (the Ergast-compatible Jolpica API)

livetiming-mirror.fastf1.dev

FastF1's mirror of the timing archive, used as a fallback

api.formula1.com, raw.githubusercontent.com

Season schedule, as fetched by FastF1

api.multiviewer.app

Circuit corner and layout data, as fetched by FastF1

pypi.org, files.pythonhosted.org

Dependency install by uv on first start

github.com

Only if no Python 3.10+ is installed: uv downloads a standalone Python build on first start

The plugin doesn't use F1 TV or any login. Live car telemetry and GPS positions need an F1 TV subscription upstream, so this edition doesn't offer them.

Privacy Policy

Data collection. Pitwall F1 collects no personal data. It has no accounts, analytics, telemetry or crash reporting, and it doesn't read Claude's memory, chat history or your files.

Usage and storage. Tool inputs (such as a year, race name or driver code) are used only to build requests to the hosts listed under Network access. Downloaded F1 data is cached on your machine at ~/.cache/pitwall-f1 (override it with PITWALL_CACHE_DIR) so repeat questions are fast. Nothing is stored anywhere else.

Third-party sharing. Nothing is shared with the author or any other party. The public data services listed above receive the request parameters needed to return F1 data, under their own privacy policies.

Data retention. The local cache stays until you delete it. Removing the folder is always safe. Nothing is retained off your machine.

Contact. Questions or concerns: contact@darshjoshi.com, or open an issue at https://github.com/darshjoshi/pitwall-f1/issues.

Known limits

  • Detailed timing and telemetry cover 2018 onward. Results before 2018 come from Jolpica and have no lap data.

  • Full data for a session is published about 30 minutes after it ends.

  • Live tools only return data while a session is running. Otherwise they say so.

  • The first start downloads about 250 MB of dependencies and takes about 35 seconds.

Support

Open an issue at https://github.com/darshjoshi/pitwall-f1/issues or email contact@darshjoshi.com.

License

MIT. See LICENSE.

Available Tools

77 tools
analyze_brake_pointsAnalyze Braking PointsC
Read-onlyIdempotent

Analyze braking patterns on fastest lap.

Inputs: gp (required), year (required), driver (required), session. Returns: result

analyze_drs_usageAnalyze DRS UsageB
Read-onlyIdempotent

Analyze DRS usage on a driver's fastest lap.

DRS-open is detected via the FastF1 car-data codes 10/12/14 (8 = eligible but not yet open; 0/1 = closed). From 2026, F1 replaced DRS with active aero, so no activations are reported.

Inputs: gp (required), year (required), driver (required), session. Returns: result

analyze_lap_consistencyAnalyze Lap ConsistencyC
Read-onlyIdempotent

Analyze lap time consistency (standard deviation, variation).

Inputs: gp (required), year (required), driver (required), session. Returns: result

analyze_long_run_paceAnalyze Long-Run PaceC
Read-onlyIdempotent

Analyze race simulation pace from practice sessions.

Inputs: gp (required), year (required), driver (required), session. Returns: result

analyze_rpm_dataAnalyze RPM DataC
Read-onlyIdempotent

Analyze engine RPM patterns on fastest lap.

Inputs: gp (required), year (required), driver (required), session. Returns: result

analyze_starting_tiresStarting TyresC
Read-onlyIdempotent

Analyze which tire compounds were used at race start.

Inputs: gp (required), year (required). Returns: result

compare_grid_to_finishGrid vs FinishC
Read-onlyIdempotent

Compare starting grid positions to finishing positions.

Inputs: gp (required), year (required). Returns: result

compare_sector_timesCompare Sector TimesC
Read-onlyIdempotent

Compare sector times between two drivers.

Inputs: gp (required), year (required), driver1 (required), driver2 (required), +1 more. Returns: result

compare_strategiesCompare StrategiesC
Read-onlyIdempotent

Compare tire strategies between two drivers.

Inputs: gp (required), year (required), driver1 (required), driver2 (required). Returns: result

compare_tire_age_performanceTyre Age vs PaceC
Read-onlyIdempotent

Compare lap times on fresh vs used tires.

Inputs: gp (required), year (required), driver (required). Returns: result

compare_tire_compoundsCompare Tyre CompoundsB
Read-onlyIdempotent

Compare average lap times across different tire compounds.

Inputs: gp (required), year (required), session. Returns: result

detect_overtakesDetect OvertakesB
Read-onlyIdempotent

Detect when a driver overtook others (position gained between laps).

Inputs: gp (required), year (required), driver (required). Returns: result

get_championship_standingsChampionship Standings (1950+)A
Read-onlyIdempotent

Get championship standings from 1950 to present.

Args: year: Season year (0 = current) standings_type: 'driver' or 'constructor'

Inputs: year, standings_type. Returns: result

get_circuit_infoCircuit InfoC
Read-onlyIdempotent

Get track layout info (Corners, DRS Zones).

Inputs: gp (required), year (required). Returns: result

get_constructor_standingsConstructor StandingsC
Read-onlyIdempotent

Get constructor/team championship standings.

Inputs: year (required), round_number. Returns: result

get_deleted_lapsDeleted LapsC
Read-onlyIdempotent

Get all laps deleted due to track limits or other violations.

Inputs: gp (required), year (required), session. Returns: result

get_dnf_listDNF ListC
Read-onlyIdempotent

Get list of drivers who did not finish the race and reasons.

Inputs: gp (required), year (required). Returns: result

get_driver_comparisonCompare Two DriversA
Read-onlyIdempotent

Compare two drivers head-to-head — position, pace, strategy, pit stops.

Args: driver_a: First driver TLA (e.g. 'VER') driver_b: Second driver TLA (e.g. 'HAM') year: Season year race: Race name (partial match) session_type: Session type

Inputs: driver_a (required), driver_b (required), race, year, +1 more. Returns: result

get_driver_infoDriver InfoC
Read-onlyIdempotent

Get detailed driver information (number, team, headshot, etc.).

Inputs: gp (required), year (required), driver (required). Returns: result

get_driver_standingsDriver StandingsB
Read-onlyIdempotent

Get driver championship standings after a specific round or latest.

Inputs: year (required), round_number. Returns: result

get_driver_tyre_detailDriver Tyre DetailC
Read-onlyIdempotent

Get detailed tyre stint data for a specific driver via FastF1 — compound, laps, and degradation.

Inputs: gp (required), year (required), driver (required). Returns: result

get_fastest_lap_dataFastest Lap DataC
Read-onlyIdempotent

Get detailed stats for a driver's fastest lap (Sector times, Speed trap).

Inputs: gp (required), year (required), driver (required), session. Returns: result

get_fastest_pit_stopsFastest Pit StopsA
Read-onlyIdempotent

Get the fastest pit stops of the race, ranked by stationary time.

Stationary time = how long the car is stopped in the box (the ~2s 'pit stop' fans mean). Pit-lane time (in->out, ~20-30s) is shown alongside for context. Sourced from F1's PitStopSeries so it matches get_pit_stops / get_pit_stop_detail.

Inputs: gp (required), year (required), top_n. Returns: result

get_fastest_sectorsFastest SectorsC
Read-onlyIdempotent

Find who set the fastest time in each sector.

Inputs: gp (required), year (required), session. Returns: result

get_gap_to_leaderGap to LeaderC
Read-onlyIdempotent

Track gap to race leader throughout the race.

Inputs: gp (required), year (required), driver (required). Returns: result

get_historical_resultsHistorical Results (1950+)B
Read-onlyIdempotent

Get historical F1 race results from 1950 to present.

Args: year: Specific year (0 = current season) race: Circuit name (e.g. 'monza', 'monaco') driver: Driver ID (e.g. 'verstappen', 'hamilton')

Inputs: race, year, driver. Returns: result

get_lap_timesLap TimesB
Read-onlyIdempotent

Get lap-by-lap times for one or all drivers. Filterable by lap range.

Args: year: Season year race: Race name (partial match) driver: Driver TLA (e.g. 'VER') or empty for all session_type: Session type lap_start: First lap to include lap_end: Last lap to include

Inputs: race, year, driver, lap_end, +2 more. Returns: result

get_lap_times_fastf1Lap Times (FastF1)C
Read-onlyIdempotent

Get all lap times for a driver via FastF1 — includes compound and tyre life per lap.

Inputs: gp (required), year (required), driver (required), session. Returns: result

get_live_best_sectorsLive Best SectorsA
Read-onlyIdempotent

Live personal-best sector times and overall best lap per driver, ranked by lap position. No auth required.

Inputs: no named parameters. Returns: result

get_live_lap_timesLive Lap TimesA
Read-onlyIdempotent

Live last + best lap time per driver. No auth required.

Inputs: no named parameters. Returns: result

get_live_mini_sectorsLive Mini-SectorsA
Read-onlyIdempotent

Live mini-sector status per driver: g=green/personal-best, p=purple/overall-best, y=yellow, .=no data. No auth required.

Inputs: no named parameters. Returns: result

get_live_pit_activityLive Pit ActivityA
Read-onlyIdempotent

Live pit-stop count and real-time in-pit / out-lap flags per driver. No auth required.

Inputs: no named parameters. Returns: result

get_live_positionsLive PositionsA
Read-onlyIdempotent

Live running order with gap-to-leader and interval. No auth required.

Inputs: no named parameters. Returns: result

get_live_race_controlLive Race ControlA
Read-onlyIdempotent

Live race control: flags, penalties, track-limit deletions, SC/VSC. No auth required.

Inputs: no named parameters. Returns: result

get_live_sector_timesLive Sector TimesA
Read-onlyIdempotent

Live sector times + speed trap for one driver (TLA or car number). No auth required.

Inputs: driver (required). Returns: result

get_live_session_clockLive Session ClockA
Read-onlyIdempotent

Live time remaining in the current session. No auth required.

Inputs: no named parameters. Returns: result

get_live_session_statusLive Session StatusA
Read-onlyIdempotent

Live F1 session status: session name, flag/track status, lap count. No auth required. Honest 'no live session' message when nothing is running.

Inputs: no named parameters. Returns: result

get_live_speed_comparisonLive Speed ComparisonA
Read-onlyIdempotent

Live best speed at each measurement point (I1, I2, FL, ST) for every driver. No auth required.

Inputs: no named parameters. Returns: result

get_live_speed_trapLive Speed TrapA
Read-onlyIdempotent

Live speed-trap (ST) ranking across the whole field. No auth required.

Inputs: no named parameters. Returns: result

get_live_stint_historyLive Stint HistoryB
Read-onlyIdempotent

Live full compound sequence and stint lengths for every driver in track-position order. No auth required.

Inputs: no named parameters. Returns: result

get_live_time_gapsLive Time GapsA
Read-onlyIdempotent

Live gap to leader and interval to car ahead per driver, mode-aware (race gap vs quali/practice fastest). No auth required.

Inputs: no named parameters. Returns: result

get_live_track_status_historyLive Track Status HistoryA
Read-onlyIdempotent

Live chronological log of track-status and session-status changes. No auth required.

Inputs: no named parameters. Returns: result

get_live_tyresLive TyresB
Read-onlyIdempotent

Live tyre compound, age (laps), and stint number per driver. No auth required.

Inputs: no named parameters. Returns: result

get_live_weatherLive WeatherA
Read-onlyIdempotent

Live track weather (air/track temp, humidity, wind, rain). No auth required.

Inputs: no named parameters. Returns: result

get_penaltiesPenaltiesC
Read-onlyIdempotent

Get all penalties issued during the race.

Inputs: gp (required), year (required). Returns: result

get_personal_best_lapsPersonal Best LapsC
Read-onlyIdempotent

Get each driver's personal best lap time.

Inputs: gp (required), year (required), session. Returns: result

get_pit_stop_detailPit Stop DetailB
Read-onlyIdempotent

Get detailed pit stop data — stationary time, pit-lane time, and tyre compound swap per stop.

Stationary time (~2s) is the time the car is stopped in the box; pit-lane time (in->out, ~20-30s) is the full transit. Sourced from F1's PitStopSeries + TyreStintSeries so durations match get_pit_stops / get_fastest_pit_stops.

Inputs: gp (required), year (required), driver. Returns: result

get_pit_stopsPit StopsB
Read-onlyIdempotent

Get all pit stops sorted by fastest stop time.

Args: year: Season year race: Race name (partial match) session_type: Session type

Inputs: race, year, session_type. Returns: result

get_position_changesPosition ChangesC
Read-onlyIdempotent

Track position changes throughout the race for a driver.

Inputs: gp (required), year (required), driver (required). Returns: result

get_qualifying_progressionQualifying ProgressionB
Read-onlyIdempotent

Show who was eliminated in Q1, Q2 and who made it to Q3.

Inputs: gp (required), year (required). Returns: result

get_race_controlRace Control MessagesB
Read-onlyIdempotent

Get race control messages — flags, penalties, safety cars, investigations.

Args: year: Season year race: Race name (partial match) session_type: Session type category: Filter: 'Flag', 'SafetyCar', 'Drs', 'Other', or empty for all

Inputs: race, year, category, session_type. Returns: result

get_race_control_messagesRace Control Log (FastF1)B
Read-onlyIdempotent

Get all race control messages during a session.

Inputs: gp (required), year (required), session. Returns: result

get_race_infoRace InfoB
Read-onlyIdempotent

Get session details and list of available data feeds.

Args: year: Season year race: Race name (partial match — 'china', 'monaco', 'silverstone') session_type: 'Race', 'Qualifying', 'Sprint', 'Practice 1', etc.

Inputs: race, year, session_type. Returns: result

get_race_resultsRace Results (FastF1)C
Read-onlyIdempotent

Get the final classification (Position, Driver, Team, Points).

Inputs: gp (required), year (required). Returns: result

get_race_winners_historyRace Winners HistoryB
Read-onlyIdempotent

Get race winners for a specific GP over the last N years.

Inputs: gp (required), years. Returns: result

get_scheduleSeason ScheduleB
Read-onlyIdempotent

Get the full race calendar for a specific year (excluding testing).

Inputs: year (required). Returns: result

get_session_infoSession InfoB
Read-onlyIdempotent

Get start time and status of a specific session (R=Race, Q=Quali, FP1, etc).

Inputs: gp (required), year (required), session. Returns: result

get_session_summarySession SummaryC
Read-onlyIdempotent

Get a comprehensive quick summary of a session.

Inputs: gp (required), year (required), session. Returns: result

get_speed_trap_comparisonSpeed Trap ComparisonC
Read-onlyIdempotent

Compare speed trap data across all drivers.

Inputs: gp (required), year (required), session. Returns: result

get_speed_trapsSpeed TrapsB
Read-onlyIdempotent

Get speed trap readings at 4 measurement points (I1, I2, FL, ST) per driver.

Args: year: Season year race: Race name (partial match) session_type: Session type

Inputs: race, year, session_type. Returns: result

get_sprint_resultsSprint ResultsB
Read-onlyIdempotent

Get sprint race results (for sprint weekends).

Inputs: gp (required), year (required). Returns: result

get_standingsSession ResultsB
Read-onlyIdempotent

Get race classification — positions, gaps, best laps, pit stops, retirements.

Args: year: Season year (2018-2026) race: Race name (partial match — 'china', 'australia', 'monaco') session_type: 'Race', 'Qualifying', 'Sprint', etc.

Inputs: race, year, session_type. Returns: result

get_stint_analysisStint AnalysisC
Read-onlyIdempotent

Analyze each stint: compound, lap times, degradation.

Inputs: gp (required), year (required), driver (required). Returns: result

get_team_lapsTeam LapsB
Read-onlyIdempotent

Get all laps for a specific team (both drivers).

Inputs: gp (required), team (required), year (required), session. Returns: result

get_telemetryLap TelemetryA
Read-onlyIdempotent

Get car telemetry — speed, RPM, throttle, brake, gear, DRS for a specific lap.

Returns ~60-90 samples at ~4Hz. Set lap=0 to see available laps.

Args: driver: Driver TLA (e.g. 'VER', 'HAM') — required year: Season year (2018-2026) race: Race name (partial match) lap: Lap number (0 = show available laps) session_type: Session type

Inputs: driver (required), lap, race, year, +1 more. Returns: result

get_track_recordCircuit Lap RecordB
Read-onlyIdempotent

Get the all-time lap record for a specific circuit (via Ergast).

Inputs: gp (required). Returns: result

get_track_statusTrack StatusB
Read-onlyIdempotent

Get track status changes (yellow flags, safety car, red flag, etc.).

Inputs: gp (required), year (required), session. Returns: result

get_tyre_strategyTyre StrategyB
Read-onlyIdempotent

Get tyre strategy for every driver — compound, stint length, new/used tyres.

Args: year: Season year race: Race name (partial match) session_type: Session type

Inputs: race, year, session_type. Returns: result

get_weatherSession WeatherB
Read-onlyIdempotent

Get weather conditions during a session — temperature, rain, wind, humidity.

Args: year: Season year race: Race name (partial match) session_type: Session type

Inputs: race, year, session_type. Returns: result

get_weather_dataWeather TimelineB
Read-onlyIdempotent

Get detailed weather conditions (Rain, Track Temp, Wind).

Inputs: gp (required), year (required), session. Returns: result

list_racesList Races & SessionsB
Read-onlyIdempotent

List all races and sessions for a season with dates and session paths.

Args: year: Season year (2018-2026)

Inputs: year (required). Returns: result

list_seasonsList SeasonsA
Read-onlyIdempotent

List all available F1 seasons (2018-present).

Inputs: no named parameters. Returns: result

plot_driver_telemetry_comparisonPlot Driver Telemetry ChannelsB
Read-onlyIdempotent

Plot comprehensive telemetry comparison (speed, throttle, brake, gear) between two drivers for the same lap.

Args: year: Season year gp: Grand Prix name driver1: First driver identifier (3-letter code) driver2: Second driver identifier (3-letter code) lap_number: Lap number to compare session: Session type (R=Race, Q=Qualifying, FP1/FP2/FP3=Practice, S=Sprint)

Returns: ImageContent with 4 subplots showing speed, throttle, brake, and gear data for both drivers

Inputs: gp (required), year (required), driver1 (required), driver2 (required), +2 more. Returns: Image content for a message.

plot_gear_shiftsPlot Gear Shift MapC
Read-onlyIdempotent

Generates a Gear Shift chart for a single driver.

Inputs: gp (required), year (required), driver (required), session. Returns: Image content for a message.

plot_multi_telemetry_comparisonPlot Multi-Lap TelemetryB
Read-onlyIdempotent

Compare full telemetry (speed, throttle, brake, gear) between two laps for same driver. Example: Compare first lap vs last lap for Piastri Brazil 2024

Inputs: gp (required), lap1 (required), lap2 (required), year (required), +2 more. Returns: Image content for a message.

plot_telemetry_comparisonPlot Speed Trace ComparisonC
Read-onlyIdempotent

Generates a Speed Trace comparison image between two drivers. Returns: An ImageContent object that can be displayed in the client.

Inputs: gp (required), year (required), driver1 (required), driver2 (required), +1 more. Returns: Image content for a message.

team_head_to_headTeammate Head-to-HeadC
Read-onlyIdempotent

Compare both drivers in a team head-to-head.

Inputs: gp (required), team (required), year (required), session. Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    C2.7/5.0

    Scored across 77 tools

    Disambiguation2/5

    Massive overlap across near-duplicate tools: get_standings/get_race_results/get_historical_results, get_weather/get_weather_data/get_live_weather, get_race_control/get_race_control_messages/get_track_status, and get_lap_times/get_lap_times_fastf1/get_live_lap_times are hard to tell apart. The live_ vs historical split helps somewhat, but dozens of pairs have blurred boundaries that will cause misselection.

    Naming Consistency4/5

    Nearly all tools follow a predictable snake_case verb_noun pattern (get_*, list_*, analyze_*, compare_*, plot_*). Minor deviations like team_head_to_head break the pattern, but the overall convention is strong and readable.

    Tool Count1/5

    77 tools is far beyond reasonable scope and is an extreme mismatch, especially given how many are redundant variants of the same operation. The surface should be consolidated to a fraction of this size.

    Completeness4/5

    The F1 domain is covered broadly: sessions, results, standings, telemetry, tyre strategy, pit stops, weather, live feeds, and historical data. Gaps are minor; the problem is duplication rather than missing capability.

    Maintenance

    ActivitySlowing
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      C
      maintenance
      MCP server for Formula 1 data via the FastF1 library. Ask Claude (or any MCP-compatible client) about race results, lap times, telemetry, standings, pit stops, and qualifying — with historical data back to 1950 via the Ergast API.
      21
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables Formula 1 data analysis through natural language, providing tools like track dominance, lap time analysis, and team performance comparisons.
      Apache 2.0
    • A
      license
      Not graded
      quality
      D
      maintenance
      Provides comprehensive Formula 1 data and analytics for Claude Desktop, including race results, telemetry, standings, and strategy insights through 36+ tools.
      1
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables AI assistants to query real-time and historical Formula 1 data through the OpenF1 API, providing tools for driver info, lap times, telemetry, race events, and more.
      MIT