Skip to main content
Glama
Machine-To-Machine

Formula One MCP Server (Python)

get_event_schedule

Retrieve the Formula One race calendar for a specified season to view event schedules and dates.

Instructions

Get Formula One race calendar for a specific season

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
yearYesSeason year (e.g., 2023)

Implementation Reference

  • Main handler function that executes the tool logic: validates year, fetches event schedule using fastf1.get_event_schedule, processes DataFrame to JSON-serializable list of events.
    def get_event_schedule(year: Any) -> dict[str, Any]:
        """
        Get the event schedule for a specified Formula One season.
    
        Args:
            year (int or str): The year of the F1 season
    
        Returns:
            dict: Status and schedule data or error information
        """
        try:
            # Validate year
            year_int = validate_year(year)
    
            logger.debug(f"Fetching event schedule for {year_int}")
            schedule = fastf1.get_event_schedule(year_int)
    
            # Convert DataFrame to JSON serializable format
            result = []
            for _, row in schedule.iterrows():
                event_dict = row.to_dict()
                # Clean and convert non-serializable values
                clean_dict = {k: json_serial(v) for k, v in event_dict.items()}
                result.append(clean_dict)
    
            logger.info(f"Successfully retrieved {len(result)} events for {year_int}")
            return {"status": "success", "data": result}
        except Exception as e:
            logger.error(f"Error retrieving event schedule: {str(e)}", exc_info=True)
            return {
                "status": "error",
                "message": f"Failed to retrieve event schedule: {str(e)}",
            }
  • MCP tool registration in list_tools(): defines name, description, and input schema (object with required 'year' number).
    name="get_event_schedule",
    description=("Get Formula One race calendar for a specific season"),
    inputSchema={
        "type": "object",
        "properties": {
            "year": {
                "type": "number",
                "description": "Season year (e.g., 2023)",
            },
        },
        "required": ["year"],
    },
  • Input schema definition for the tool: requires a 'year' property of type number.
        "type": "object",
        "properties": {
            "year": {
                "type": "number",
                "description": "Season year (e.g., 2023)",
            },
        },
        "required": ["year"],
    },
  • Helper function validate_year used by get_event_schedule to ensure valid F1 season year (1950 to current+1).
    def validate_year(year: Any) -> int:
        """
        Validate that the provided year is valid for F1 data.
    
        Args:
            year: Year value to validate
    
        Returns:
            Valid year as integer
    
        Raises:
            ValueError: If year is invalid
        """
        try:
            year_int = int(year)
            # F1 started in 1950 and we don't want future years far ahead
            current_year = datetime.now().year
            if year_int < 1950 or year_int > current_year + 1:
                raise ValueError(f"Year must be between 1950 and {current_year + 1}")
            return year_int
        except (ValueError, TypeError) as e:
            raise ValueError(f"Invalid year format: {year}") from e
  • Helper function json_serial to convert pandas/fastf1 objects to JSON-compatible types, used in data processing.
    def json_serial(obj: Any) -> str | int | float | None:
        """
        Convert non-JSON serializable objects to strings.
    
        Args:
            obj: Object to be serialized to JSON
    
        Returns:
            JSON serializable representation of the object
        """
        if isinstance(obj, datetime | pd.Timestamp):
            return obj.isoformat()
        if isinstance(obj, np.integer):
            return int(obj)
        if isinstance(obj, np.floating):
            return float(obj)
        if pd.isna(obj) or obj is None:
            return None
        return str(obj)

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Machine-To-Machine/f1-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server