f1-mcp-server / app.py
arre99's picture
deleted unused files and folders. cleaned up front-end UI a bit. Tidied up the notebooks for both APIs. Added mcp.json config info in the README
d69ce5a
raw
history blame
5.45 kB
import gradio as gr
# Local modules
import fastf1_tools
from utils.constants import (
DRIVER_NAMES,
CONSTRUCTOR_NAMES,
CURRENT_YEAR,
AVAILABLE_SESSION_TYPES,
DROPDOWN_SESSION_TYPES,
DRIVER_DETAILS
)
iface_driver_championship_standings = gr.Interface(
fn=fastf1_tools.driver_championship_standings,
inputs=[
gr.Number(label="Calendar year", value=CURRENT_YEAR, minimum=1950, maximum=CURRENT_YEAR),
gr.Dropdown(label="Driver", choices=DRIVER_NAMES)
],
outputs="text",
title="Driver Championship Standings",
description="Get the driver championship standings"
)
iface_constructor_championship_standings = gr.Interface(
fn=fastf1_tools.constructor_championship_standings,
inputs=[
gr.Number(label="Calendar year", value=CURRENT_YEAR, minimum=1950, maximum=CURRENT_YEAR),
gr.Dropdown(label="Constructor", choices=CONSTRUCTOR_NAMES)
],
outputs="text",
title="Constructor Championship Standings",
description="Get the constructor championship standings"
)
iface_event_info = gr.Interface(
fn=fastf1_tools.get_event_info,
inputs=[
gr.Number(label="Calendar year", value=CURRENT_YEAR, minimum=1950, maximum=CURRENT_YEAR),
gr.Textbox(label="Grand Prix", placeholder="Ex: Monaco", info="The name of the GP/country/location (Fuzzy matching supported)"),
gr.Radio(["human", "LLM"], label="Display format", value="human")
],
outputs="text",
title="Event Info",
description="Get the Grand Prix event info for a specific race week"
)
iface_season_calendar = gr.Interface(
fn=fastf1_tools.get_season_calendar,
inputs=[
gr.Number(label="Calendar year", value=CURRENT_YEAR, minimum=1950, maximum=CURRENT_YEAR),
],
outputs="text",
title="Season Calendar",
description="Get the season calendar information for the given year"
)
iface_track_visualization = gr.Interface(
fn=fastf1_tools.track_visualization,
inputs=[
gr.Number(label="Calendar year", value=CURRENT_YEAR, minimum=1950, maximum=CURRENT_YEAR),
gr.Textbox(label="Grand Prix", placeholder="Ex: Monaco", info="The name of the GP/country/location (Fuzzy matching supported)"),
gr.Radio(["speed", "corners", "gear"], label="Visualization type", value="speed"),
gr.Dropdown(DRIVER_NAMES)
],
outputs="image",
title="Track Visualizations",
description="Get the track visualization for the given Grand Prix"
)
iface_session_results = gr.Interface(
fn=fastf1_tools.get_session_results,
inputs=[
gr.Number(label="Calendar year", value=CURRENT_YEAR, minimum=1950, maximum=CURRENT_YEAR),
gr.Textbox(label="Grand Prix", placeholder="Ex: Monaco", info="The name of the GP/country/location (Fuzzy matching supported)"),
gr.Dropdown([session_type for session_type in DROPDOWN_SESSION_TYPES if "practice" not in session_type], label="Session type", value="race")
],
outputs=gr.DataFrame(),
title="Session Results",
description="Get the session results for the given Grand Prix"
)
iface_driver_info = gr.Interface(
fn=fastf1_tools.get_driver_info,
inputs=[
gr.Dropdown(label="Driver", choices=DRIVER_NAMES)
],
outputs="text",
title="Driver Info",
description="Get personal information about a driver"
)
# Create your markdown-only tab using Blocks
with gr.Blocks() as markdown_tab:
gr.Markdown("""
# 🏁 Formula 1 MCP server 🏎️
Welcome to the Formula 1 MCP server, your one-stop destination for comprehensive Formula 1 data and visualizations.
<br>
This application leverages the FastF1 library to provide detailed insights into Formula 1 races, drivers, and teams.
## Available Tools
### Championship Standings
- **Driver Championship**: Track driver positions, points, and wins
- **Constructor Championship**: Monitor team performances and rankings
### Race Information
- **Event Info**: Get detailed information about specific Grand Prix events
- **Season Calendar**: View the complete race calendar for any season
- **Session Results**: Access race, qualifying, and sprint session results
### Driver & Team Data
- **Driver Info**: View detailed driver profiles and statistics
- **Track Visualizations**: Explore interactive track maps with speed, gear, and corner data
## Usage
Use the tabs above to navigate between different sections and explore the wealth of F1 data available at your fingertips.
""")
named_interfaces = {
"About": markdown_tab,
"Driver Championship Standings": iface_driver_championship_standings,
"Constructor Championship Standings": iface_constructor_championship_standings,
"Event Info": iface_event_info,
"Season Calendar": iface_season_calendar,
"Track Visualizations": iface_track_visualization,
"Session Results": iface_session_results,
"Driver Info": iface_driver_info,
"Test": iface_test
}
# Tab names and interfaces
tab_names = list(named_interfaces.keys())
interface_list = list(named_interfaces.values())
# Combine all the interfaces into a single TabbedInterface
gradio_server = gr.TabbedInterface(
interface_list,
tab_names=tab_names,
title="🏁 Formula 1 MCP server 🏎️"
)
# Launch the interface and MCP server
if __name__ == "__main__":
gradio_server.launch(mcp_server=True)