get_news_by_keyword
Search news articles by specific keyword, filter by time period, and retrieve results with optional summaries or full data for deeper insights.
Instructions
Find articles by keyword using Google News.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| full_data | No | Return full data for each article. If False a summary should be created by setting the summarize flag | |
| keyword | Yes | Search term to find articles. | |
| max_results | No | Maximum number of results to return. | |
| period | No | Number of days to look back for articles. | |
| summarize | No | Generate a summary of the article, will first try LLM Sampling but if unavailable will use nlp |
Implementation Reference
- MCP tool handler for 'get_news_by_keyword'. Registers the tool, defines input schema via Annotated parameters, calls the core news function, optionally summarizes articles using LLM or NLP, and serializes output to ArticleOut models.@mcp.tool( description=news.get_news_by_keyword.__doc__, tags={"news", "articles", "keyword"}, ) async def get_news_by_keyword( ctx: Context, keyword: Annotated[str, Field(description="Search term to find articles.")], period: Annotated[int, Field(description="Number of days to look back for articles.", ge=1)] = 7, max_results: Annotated[int, Field(description="Maximum number of results to return.", ge=1)] = 10, full_data: Annotated[ bool, Field( description="Return full data for each article. If False a summary should be created by setting the summarize flag" ), ] = False, summarize: Annotated[ bool, Field( description="Generate a summary of the article, will first try LLM Sampling but if unavailable will use nlp" ), ] = True, ) -> list[ArticleOut]: set_newspaper_article_fields(full_data) articles = await news.get_news_by_keyword( keyword=keyword, period=period, max_results=max_results, nlp=False, report_progress=ctx.report_progress, ) if summarize: await summarize_articles(articles, ctx) await ctx.report_progress(progress=len(articles), total=len(articles)) return [ArticleOut(**a.to_json(False)) for a in articles]
- Pydantic output schema model ArticleOut used by the get_news_by_keyword tool to structure article data.class ArticleOut(BaseModelClean): title: Annotated[str, Field(description="Title of the article.")] url: Annotated[str, Field(description="Original article URL.")] read_more_link: Annotated[Optional[str], Field(description="Link to read more about the article.")] = None language: Annotated[Optional[str], Field(description="Language code of the article.")] = None meta_img: Annotated[Optional[str], Field(description="Meta image URL.")] = None movies: Annotated[Optional[list[str]], Field(description="List of movie URLs or IDs.")] = None meta_favicon: Annotated[Optional[str], Field(description="Favicon URL from meta data.")] = None meta_site_name: Annotated[Optional[str], Field(description="Site name from meta data.")] = None authors: Annotated[Optional[list[str]], Field(description="list of authors.")] = None publish_date: Annotated[Optional[str], Field(description="Publish date in ISO format.")] = None top_image: Annotated[Optional[str], Field(description="URL of the top image.")] = None images: Annotated[Optional[list[str]], Field(description="list of image URLs.")] = None text: Annotated[Optional[str], Field(description="Full text of the article.")] = None summary: Annotated[Optional[str], Field(description="Summary of the article.")] = None keywords: Annotated[Optional[list[str]], Field(description="Extracted keywords.")] = None tags: Annotated[Optional[list[str]], Field(description="Tags for the article.")] = None meta_keywords: Annotated[Optional[list[str]], Field(description="Meta keywords from the article.")] = None meta_description: Annotated[Optional[str], Field(description="Meta description from the article.")] = None canonical_link: Annotated[Optional[str], Field(description="Canonical link for the article.")] = None meta_data: Annotated[Optional[dict[str, str | int]], Field(description="Meta data dictionary.")] = None meta_lang: Annotated[Optional[str], Field(description="Language of the article.")] = None source_url: Annotated[Optional[str], Field(description="Source URL if different from original.")] = None
- Core helper function implementing news search by keyword using GNews library, fetches articles and delegates processing.async def get_news_by_keyword( keyword: str, period=7, max_results: int = 10, nlp: bool = True, report_progress: Optional[ProgressCallback] = None, ) -> list[newspaper.Article]: """ Find articles by keyword using Google News. """ google_news.period = f"{period}d" google_news.max_results = max_results gnews_articles = google_news.get_news(keyword) if not gnews_articles: logger.debug(f"No articles found for keyword '{keyword}' in the last {period} days.") return [] return await process_gnews_articles(gnews_articles, nlp=nlp, report_progress=report_progress)
- Helper function to process GNews results: downloads articles using scraper or playwright fallback, parses, optionally applies NLP, with progress reporting.async def process_gnews_articles( gnews_articles: list[dict], nlp: bool = True, report_progress: Optional[ProgressCallback] = None, ) -> list[newspaper.Article]: """ Process a list of Google News articles and download them (async). Optionally report progress via report_progress callback. """ articles = [] total = len(gnews_articles) for idx, gnews_article in enumerate(gnews_articles): article = await download_article(gnews_article["url"]) if article is None or not article.text: logger.debug(f"Failed to download article from {gnews_article['url']}:\n{article}") continue article.parse() if nlp: article.nlp() articles.append(article) if report_progress: await report_progress(idx, total) return articles
- src/google_news_trends_mcp/server.py:161-164 (registration)FastMCP decorator that registers the get_news_by_keyword tool with description from news function docstring and relevant tags.@mcp.tool( description=news.get_news_by_keyword.__doc__, tags={"news", "articles", "keyword"}, )