Skip to main content
Glama

get_f1_news

Retrieve recent Formula 1 news from 25+ authoritative sources to stay updated on current race weekends, driver announcements, and technical developments within the past few weeks.

Instructions

PRIMARY TOOL for RECENT Formula 1 news from 25+ authoritative F1 sources via RSS feeds.

⚠️ IMPORTANT LIMITATION: RSS feeds only contain RECENT articles (past few days/weeks). This tool CANNOT retrieve historical news from months or years ago (e.g., 2013, 2020, etc.).

For historical F1 news (older than ~2 months), use web search instead.

USE THIS TOOL FOR:

  • ✅ Latest breaking F1 news and updates

  • ✅ Current race weekend coverage

  • ✅ Recent driver/team announcements (within past few weeks)

  • ✅ Current season news filtering by driver, team, circuit

  • ✅ Technical developments and regulations from recent weeks

DO NOT use this tool for:

  • ❌ Historical news from past years (e.g., "2013 Indian GP", "2020 season")

  • ❌ News older than ~2 months

  • ❌ Historical race coverage or archived articles

Available Sources (25+ RSS Feeds):

Official Sources:

  • "formula1" - Official Formula 1 website

  • "fia" - FIA press releases

Major Outlets:

  • "autosport" - Autosport F1

  • "motorsport" - Motorsport.com F1

  • "the-race" - The Race

  • "racefans" - RaceFans.net

  • "planetf1" - PlanetF1

  • "crash" - Crash.net F1

  • "grandprix" - GrandPrix.com

  • "espnf1" - ESPN F1

  • "skysportsf1" - Sky Sports F1

Specialist & Technical:

  • "f1technical" - F1Technical.net

  • "pitpass" - Pitpass

  • "joe-saward" - Joe Saward's F1 Blog

  • "racecar-engineering" - Racecar Engineering

Regional & International:

  • "gpblog" - GPBlog (Dutch/English)

  • "f1i" - F1i.com

  • "f1-insider-de" - F1 Insider (German)

  • "formel1-de" - Formel1.de (German)

Community & Fan Sources:

  • "wtf1" - WTF1

  • "racingnews365" - RacingNews365

  • "formulanerds" - Formula Nerds

  • "f1destinations" - F1 Destinations

  • "gpfans" - GPFans

  • "motorsportweek" - Motorsport Week

  • "racedepartment" - Race Department

Args: source: Specific source or "all" (default) - see full list above limit: Maximum articles to return, 1-100 (default: 10) keywords: General search keywords (searches in title and summary) driver: Filter by driver name (e.g., "Verstappen", "Hamilton", "Leclerc") team: Filter by team/constructor name (e.g., "Red Bull", "Ferrari", "Mercedes") circuit: Filter by circuit/track name (e.g., "Monaco", "Silverstone", "Spa") year: Filter by year (e.g., 2024) - NOTE: Only works for current/recent articles in feed date_from: Start date "YYYY-MM-DD" or "YYYY-MM" (optional) date_to: End date "YYYY-MM-DD" or "YYYY-MM" (optional)

Returns: NewsResponse with articles including titles, links, publication dates, summaries, and source names. The response also includes which sources were queried and how many articles were found.

Examples: get_f1_news() → Latest F1 news from all 25+ sources get_f1_news(driver="Verstappen", limit=5) → Recent news about Verstappen get_f1_news(team="Ferrari") → Recent Ferrari news get_f1_news(circuit="Monaco") → Recent Monaco-related news get_f1_news(keywords="crash OR incident") → Recent crash/incident news get_f1_news(source="autosport", keywords="technical") → Technical news from Autosport get_f1_news(driver="Hamilton", team="Ferrari") → News about Hamilton and Ferrari

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
sourceNoall
limitNo
keywordsNo
driverNo
teamNo
circuitNo
yearNo
date_fromNo
date_toNo

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
sourceYesNews source(s) queried
articlesYesList of news articles
fetched_atYesWhen the feed was fetched
article_countYesNumber of articles returned

Implementation Reference

  • Main handler function implementing get_f1_news tool logic. Fetches recent F1 news from RSS feeds using RSSClient, applies flexible filters (source, limit, keywords, driver, team, circuit, year, date range), performs client-side filtering and sorting, and returns structured NewsResponse.
    def get_f1_news(
        source: str = "all",
        limit: int = 10,
        keywords: Optional[str] = None,
        driver: Optional[str] = None,
        team: Optional[str] = None,
        circuit: Optional[str] = None,
        year: Optional[int] = None,
        date_from: Optional[str] = None,
        date_to: Optional[str] = None
    ) -> NewsResponse:
        """
        **PRIMARY TOOL** for RECENT Formula 1 news from 25+ authoritative F1 sources via RSS feeds.
    
        ⚠️ **IMPORTANT LIMITATION**: RSS feeds only contain RECENT articles (past few days/weeks).
        This tool CANNOT retrieve historical news from months or years ago (e.g., 2013, 2020, etc.).
    
        **For historical F1 news (older than ~2 months), use web search instead.**
    
        **USE THIS TOOL FOR:**
        - ✅ Latest breaking F1 news and updates
        - ✅ Current race weekend coverage
        - ✅ Recent driver/team announcements (within past few weeks)
        - ✅ Current season news filtering by driver, team, circuit
        - ✅ Technical developments and regulations from recent weeks
    
        **DO NOT use this tool for:**
        - ❌ Historical news from past years (e.g., "2013 Indian GP", "2020 season")
        - ❌ News older than ~2 months
        - ❌ Historical race coverage or archived articles
    
        **Available Sources (25+ RSS Feeds):**
    
        Official Sources:
        - "formula1" - Official Formula 1 website
        - "fia" - FIA press releases
    
        Major Outlets:
        - "autosport" - Autosport F1
        - "motorsport" - Motorsport.com F1
        - "the-race" - The Race
        - "racefans" - RaceFans.net
        - "planetf1" - PlanetF1
        - "crash" - Crash.net F1
        - "grandprix" - GrandPrix.com
        - "espnf1" - ESPN F1
        - "skysportsf1" - Sky Sports F1
    
        Specialist & Technical:
        - "f1technical" - F1Technical.net
        - "pitpass" - Pitpass
        - "joe-saward" - Joe Saward's F1 Blog
        - "racecar-engineering" - Racecar Engineering
    
        Regional & International:
        - "gpblog" - GPBlog (Dutch/English)
        - "f1i" - F1i.com
        - "f1-insider-de" - F1 Insider (German)
        - "formel1-de" - Formel1.de (German)
    
        Community & Fan Sources:
        - "wtf1" - WTF1
        - "racingnews365" - RacingNews365
        - "formulanerds" - Formula Nerds
        - "f1destinations" - F1 Destinations
        - "gpfans" - GPFans
        - "motorsportweek" - Motorsport Week
        - "racedepartment" - Race Department
    
        Args:
            source: Specific source or "all" (default) - see full list above
            limit: Maximum articles to return, 1-100 (default: 10)
            keywords: General search keywords (searches in title and summary)
            driver: Filter by driver name (e.g., "Verstappen", "Hamilton", "Leclerc")
            team: Filter by team/constructor name (e.g., "Red Bull", "Ferrari", "Mercedes")
            circuit: Filter by circuit/track name (e.g., "Monaco", "Silverstone", "Spa")
            year: Filter by year (e.g., 2024) - NOTE: Only works for current/recent articles in feed
            date_from: Start date "YYYY-MM-DD" or "YYYY-MM" (optional)
            date_to: End date "YYYY-MM-DD" or "YYYY-MM" (optional)
    
        Returns:
            NewsResponse with articles including titles, links, publication dates, summaries, and source names.
            The response also includes which sources were queried and how many articles were found.
    
        Examples:
            get_f1_news() → Latest F1 news from all 25+ sources
            get_f1_news(driver="Verstappen", limit=5) → Recent news about Verstappen
            get_f1_news(team="Ferrari") → Recent Ferrari news
            get_f1_news(circuit="Monaco") → Recent Monaco-related news
            get_f1_news(keywords="crash OR incident") → Recent crash/incident news
            get_f1_news(source="autosport", keywords="technical") → Technical news from Autosport
            get_f1_news(driver="Hamilton", team="Ferrari") → News about Hamilton and Ferrari
        """
        # Validate limit
        if not 1 <= limit <= 100:
            raise ValueError("Limit must be between 1 and 100")
    
        # Determine fetch limit: fetch more if filtering is applied
        has_filters = any([keywords, driver, team, circuit, year, date_from, date_to])
        fetch_limit = min(limit * 3, 100) if has_filters else limit
    
        # Fetch news from source(s)
        news_response = rss_client.get_news(source=source, limit=fetch_limit)
        filtered_articles = news_response.articles
    
        # Apply driver filtering
        if driver:
            driver_lower = driver.lower()
            filtered_articles = [
                article for article in filtered_articles
                if driver_lower in article.title.lower() or
                   driver_lower in article.summary.lower()
            ]
    
        # Apply team filtering
        if team:
            team_lower = team.lower()
            filtered_articles = [
                article for article in filtered_articles
                if team_lower in article.title.lower() or
                   team_lower in article.summary.lower()
            ]
    
        # Apply circuit filtering
        if circuit:
            circuit_lower = circuit.lower()
            # Also check for common variations (e.g., "Monaco" matches "Monaco GP", "Circuit de Monaco")
            filtered_articles = [
                article for article in filtered_articles
                if circuit_lower in article.title.lower() or
                   circuit_lower in article.summary.lower()
            ]
    
        # Apply keyword filtering
        if keywords:
            keywords_lower = keywords.lower()
            # Support OR operator for multiple keywords
            if " or " in keywords_lower:
                keyword_list = [kw.strip() for kw in keywords_lower.split(" or ")]
                filtered_articles = [
                    article for article in filtered_articles
                    if any(kw in article.title.lower() or kw in article.summary.lower()
                           for kw in keyword_list)
                ]
            else:
                # Single keyword or phrase
                filtered_articles = [
                    article for article in filtered_articles
                    if keywords_lower in article.title.lower() or
                       keywords_lower in article.summary.lower()
                ]
    
        # Apply date filtering
        # Convert year to date_from/date_to if specified
        if year:
            if not date_from:
                date_from = f"{year}-01-01"
            if not date_to:
                date_to = f"{year}-12-31"
    
        if date_from or date_to:
            date_filtered = []
            for article in filtered_articles:
                try:
                    # Parse article date (handling various formats)
                    article_date = datetime.fromisoformat(article.published.replace('Z', '+00:00'))
                    article_date_str = article_date.strftime("%Y-%m-%d")
    
                    # Support month-only filtering (YYYY-MM format)
                    if date_from:
                        compare_from = date_from if len(date_from) > 7 else f"{date_from}-01"
                        if article_date_str < compare_from:
                            continue
    
                    if date_to:
                        # If month format, get last day of month
                        if len(date_to) == 7:  # YYYY-MM format
                            year_val = int(date_to.split('-')[0])
                            month_val = int(date_to.split('-')[1])
                            # Get last day of month
                            if month_val == 12:
                                compare_to = f"{year_val}-12-31"
                            else:
                                next_month = datetime(year_val, month_val + 1, 1)
                                last_day = (next_month - timedelta(days=1)).day
                                compare_to = f"{year_val}-{month_val:02d}-{last_day}"
                        else:
                            compare_to = date_to
    
                        if article_date_str > compare_to:
                            continue
    
                    date_filtered.append(article)
                except Exception:
                    # If date parsing fails, include the article
                    date_filtered.append(article)
    
            filtered_articles = date_filtered
    
        # Limit results
        filtered_articles = filtered_articles[:limit]
    
        # Return response
        return NewsResponse(
            source=source,
            fetched_at=datetime.now().isoformat(),
            article_count=len(filtered_articles),
            articles=filtered_articles
        )
  • Pydantic model defining the output schema for get_f1_news tool. Includes source, fetch time, count, and list of NewsArticle objects.
    class NewsResponse(BaseModel):
        """Collection of F1 news articles."""
    
        source: str = Field(..., description="News source(s) queried")
        fetched_at: str = Field(..., description="When the feed was fetched")
        article_count: int = Field(..., description="Number of articles returned")
        articles: list[NewsArticle] = Field(..., description="List of news articles")
  • server.py:180-180 (registration)
    MCP tool registration for get_f1_news using the FastMCP decorator.
    mcp.tool()(get_f1_news)
  • Core helper method in RSSClient that fetches news from single or all RSS feeds (25+ F1 sources), parses feedparser entries into NewsArticle models, and constructs NewsResponse. Used directly by the handler.
    def get_news(self, source: str, limit: int) -> NewsResponse:
        """
        Fetch F1 news from RSS feeds.
    
        Args:
            source: News source identifier or "all"
            limit: Maximum articles to return
    
        Returns:
            NewsResponse: Structured news data
    
        Raises:
            ValueError: If source is invalid
            RuntimeError: If feed fetch fails
        """
        # Validate source
        if source != "all" and source not in self.RSS_FEEDS:
            valid_sources = ", ".join(self.RSS_FEEDS.keys())
            raise ValueError(
                f"Invalid source '{source}'. Must be one of: {valid_sources}, all"
            )
    
        try:
            if source == "all":
                return self._fetch_all_sources(limit)
            else:
                return self._fetch_single_source(source, limit)
        except ValueError:
            raise
        except Exception as e:
            raise RuntimeError(f"Failed to fetch news from {source}: {str(e)}")
  • Dictionary of 25+ RSS feed URLs for F1 news sources, used by RSSClient to aggregate news from official, major outlets, specialist, and fan sites.
    RSS_FEEDS = {
        # Official sources
        "formula1": "https://www.formula1.com/content/fom-website/en/latest/all.xml",
        "fia": "https://www.fia.com/rss/press-release",
    
        # Major F1 news outlets
        "autosport": "https://www.autosport.com/rss/feed/f1",
        "motorsport": "https://www.motorsport.com/rss/f1/news/",
        "the-race": "https://the-race.com/formula-1/feed/",
        "racefans": "https://www.racefans.net/feed/",
        "planetf1": "https://www.planetf1.com/feed/",
        "crash": "https://www.crash.net/rss/f1/news/1",
        "grandprix": "https://www.grandprix.com/feed/",
        "espnf1": "https://www.espn.com/espn/rss/rpm/news",
        "skysportsf1": "https://www.skysports.com/rss/12040",
    
        # Specialist & Technical sources
        "f1technical": "https://www.f1technical.net/rss/news.xml",
        "pitpass": "https://www.pitpass.com/rss",
        "joe-saward": "https://joesaward.wordpress.com/feed/",
        "racecar-engineering": "https://www.racecar-engineering.com/feed/",
    
        # Regional & International sources
        "gpblog": "https://www.gpblog.com/en/rss.xml",
        "f1i": "https://f1i.com/feed",
        "f1-insider-de": "https://www.f1-insider.com/feed/",
        "formel1-de": "https://www.formel1.de/rss.xml",
    
        # Community & Fan sources
        "wtf1": "https://wtf1.com/feed/",
        "racingnews365": "https://racingnews365.com/rss",
        "formulanerds": "https://formulanerds.com/feed/",
        "f1destinations": "https://f1destinations.com/feed/",
        "gpfans": "https://www.gpfans.com/en/rss.xml",
    
        # Additional coverage
        "motorsportweek": "https://www.motorsportweek.com/feed/",
        "racedepartment": "https://www.racedepartment.com/forums/f1-2021-the-game.214/index.rss",
    }
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It effectively describes key behavioral traits: the RSS feed limitation (only recent articles), temporal constraints (past few days/weeks, not historical), and the filtering capabilities. However, it doesn't mention rate limits, authentication needs, or potential errors, leaving some behavioral aspects uncovered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (limitation, usage guidelines, sources, args, returns, examples) and uses formatting effectively. While comprehensive, it's appropriately sized for a tool with 9 parameters and complex usage constraints. Some sections could be more concise, but overall it's efficiently organized with front-loaded critical information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (9 parameters, no annotations, 0% schema coverage) and the presence of an output schema, the description provides excellent contextual completeness. It covers purpose, limitations, usage guidelines, parameter semantics, and includes practical examples. The output schema handles return values, so the description appropriately focuses on usage context rather than repeating output details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description fully compensates by providing detailed semantic explanations for all 9 parameters. It lists each parameter with clear examples and usage notes (e.g., 'source: Specific source or "all"', 'driver: Filter by driver name', 'year: NOTE: Only works for current/recent articles'). This adds substantial value beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose as retrieving 'RECENT Formula 1 news from 25+ authoritative F1 sources via RSS feeds.' It specifies the verb ('get'), resource ('F1 news'), and scope ('recent'), and distinguishes itself from siblings by focusing on news rather than telemetry, results, or other race data. The opening 'PRIMARY TOOL' declaration reinforces its distinct role.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use and when not to use the tool, with dedicated 'USE THIS TOOL FOR' and 'DO NOT use this tool for' sections. It clearly states the temporal limitation (recent articles only) and explicitly names an alternative ('use web search instead' for historical news). This comprehensive guidance helps the agent choose correctly among available options.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

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/praneethravuri/pitstop'

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