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.
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)