Query Google News RSS feeds and search interest over time via Google Trends.
The io.github.AKzar1el/mcp-trendpulse server is a Python Model Context Protocol (MCP) server for researching current news and search-interest trends. It queries Google News RSS feeds and also supports search interest over time via Google Trends.
🛠️ Key Features
Tooling count: 16
Queries Google News RSS feeds
Retrieves search interest over time via Google Trends
🚀 Use Cases
Research current news topics using Google News RSS feeds
Analyze how search interest changes over time using Google Trends
⚡ Developer Benefits
Built as an MCP server
Python (3.10+)
MIT-licensed
⚠️ Limitations
Description indicates functionality is focused on Google News and Google Trends
Declared in the repository manifest (server.json). Not verified against a live endpoint.
get_news_by_keyword
Find articles by keyword using Google News.
Parameters5
keyword
string
required
Search term to find articles.
period
integer
optional
Number of days to look back for articles.
max_results
integer
optional
Maximum number of results to return.
full_data
boolean
optional
Return full data for each article. If False a summary should be created by setting the summarize flag
summarize
boolean
optional
Generate a summary of the article, will first try LLM Sampling but if unavailable will use nlp
Raw schema
{
"additionalProperties": false,
"properties": {
"keyword": {
"description": "Search term to find articles.",
"type": "string"
},
"period": {
"default": 7,
"description": "Number of days to look back for articles.",
"minimum": 1,
"type": "integer"
},
"max_results": {
"default": 10,
"description": "Maximum number of results to return.",
"minimum": 1,
"type": "integer"
},
"full_data": {
"default": false,
"description": "Return full data for each article. If False a summary should be created by setting the summarize flag",
"type": "boolean"
},
"summarize": {
"default": true,
"description": "Generate a summary of the article, will first try LLM Sampling but if unavailable will use nlp",
"type": "boolean"
}
},
"required": [
"keyword"
],
"type": "object"
}
get_news_by_location
Find articles by location using Google News.
Parameters5
location
string
required
Name of city/state/country.
period
integer
optional
Number of days to look back for articles.
max_results
integer
optional
Maximum number of results to return.
full_data
boolean
optional
Return full data for each article. If False a summary should be created by setting the summarize flag
summarize
boolean
optional
Generate a summary of the article, will first try LLM Sampling but if unavailable will use nlp
Raw schema
{
"additionalProperties": false,
"properties": {
"location": {
"description": "Name of city/state/country.",
"type": "string"
},
"period": {
"default": 7,
"description": "Number of days to look back for articles.",
"minimum": 1,
"type": "integer"
},
"max_results": {
"default": 10,
"description": "Maximum number of results to return.",
"minimum": 1,
"type": "integer"
},
"full_data": {
"default": false,
"description": "Return full data for each article. If False a summary should be created by setting the summarize flag",
"type": "boolean"
},
"summarize": {
"default": true,
"description": "Generate a summary of the article, will first try LLM Sampling but if unavailable will use nlp",
"type": "boolean"
}
},
"required": [
"location"
],
"type": "object"
}
get_news_by_topic
Find articles by topic using Google News.
topic is one of
WORLD, NATION, BUSINESS, TECHNOLOGY, ENTERTAINMENT, SPORTS, SCIENCE, HEALTH,
POLITICS, CELEBRITIES, TV, MUSIC, MOVIES, THEATER, SOCCER, CYCLING, MOTOR SPORTS,
TENNIS, COMBAT SPORTS, BASKETBALL, BASEBALL, FOOTBALL, SPORTS BETTING, WATER SPORTS,
HOCKEY, GOLF, CRICKET, RUGBY, ECONOMY, PERSONAL FINANCE, FINANCE, DIGITAL CURRENCIES,
MOBILE, ENERGY, GAMING, INTERNET SECURITY, GADGETS, VIRTUAL REALITY, ROBOTICS, NUTRITION,
PUBLIC HEALTH, MENTAL HEALTH, MEDICINE, SPACE, WILDLIFE, ENVIRONMENT, NEUROSCIENCE, PHYSICS,
GEOLOGY, PALEONTOLOGY, SOCIAL SCIENCES, EDUCATION, JOBS, ONLINE EDUCATION, HIGHER EDUCATION,
VEHICLES, ARTS-DESIGN, BEAUTY, FOOD, TRAVEL, SHOPPING, HOME, OUTDOORS, FASHION.
Parameters5
topic
string
required
Topic to search for articles.
period
integer
optional
Number of days to look back for articles.
max_results
integer
optional
Maximum number of results to return.
full_data
boolean
optional
Return full data for each article. If False a summary should be created by setting the summarize flag
summarize
boolean
optional
Generate a summary of the article, will first try LLM Sampling but if unavailable will use nlp
Raw schema
{
"additionalProperties": false,
"properties": {
"topic": {
"description": "Topic to search for articles.",
"type": "string"
},
"period": {
"default": 7,
"description": "Number of days to look back for articles.",
"minimum": 1,
"type": "integer"
},
"max_results": {
"default": 10,
"description": "Maximum number of results to return.",
"minimum": 1,
"type": "integer"
},
"full_data": {
"default": false,
"description": "Return full data for each article. If False a summary should be created by setting the summarize flag",
"type": "boolean"
},
"summarize": {
"default": true,
"description": "Generate a summary of the article, will first try LLM Sampling but if unavailable will use nlp",
"type": "boolean"
}
},
"required": [
"topic"
],
"type": "object"
}
get_top_news
Get top news stories from Google News.
Parameters4
period
integer
optional
Number of days to look back for top articles.
max_results
integer
optional
Maximum number of results to return.
full_data
boolean
optional
Return full data for each article. If False a summary should be created by setting the summarize flag
summarize
boolean
optional
Generate a summary of the article, will first try LLM Sampling but if unavailable will use nlp
Raw schema
{
"additionalProperties": false,
"properties": {
"period": {
"default": 3,
"description": "Number of days to look back for top articles.",
"minimum": 1,
"type": "integer"
},
"max_results": {
"default": 10,
"description": "Maximum number of results to return.",
"minimum": 1,
"type": "integer"
},
"full_data": {
"default": false,
"description": "Return full data for each article. If False a summary should be created by setting the summarize flag",
"type": "boolean"
},
"summarize": {
"default": true,
"description": "Generate a summary of the article, will first try LLM Sampling but if unavailable will use nlp",
"type": "boolean"
}
},
"type": "object"
}
get_trending_terms
Returns google trends for a specific geo location.
Parameters2
geo
string
optional
Geographic target for trending terms. Supports four levels of granularity:
- Worldwide: empty string ''
- Country: ISO 3166-1 alpha-2 code, e.g. 'US', 'GB', 'CA'
- Subdivision (state/province/region): ISO 3166-2 format 'CC-XX' or 'CC-XXX', e.g. 'US-CA' (California), 'BE-BRU' (Brussels)
- US metro area: bare Nielsen DMA code (numeric string), e.g. '807' (San Francisco Bay Area), '501' (New York City)
full_data
boolean
optional
Return full data for each trend including related news stories.
Raw schema
{
"additionalProperties": false,
"properties": {
"geo": {
"default": "US",
"description": "Geographic target for trending terms. Supports four levels of granularity:\n- Worldwide: empty string ''\n- Country: ISO 3166-1 alpha-2 code, e.g. 'US', 'GB', 'CA'\n- Subdivision (state/province/region): ISO 3166-2 format 'CC-XX' or 'CC-XXX', e.g. 'US-CA' (California), 'BE-BRU' (Brussels)\n- US metro area: bare Nielsen DMA code (numeric string), e.g. '807' (San Francisco Bay Area), '501' (New York City)",
"type": "string"
},
"full_data": {
"default": false,
"description": "Return full data for each trend including related news stories.",
"type": "boolean"
}
},
"type": "object"
}
get_trends
Pull search interest over time for keywords.
Parameters6
keyword
any
required
Search keyword(s) to analyze; comparison lists support 1-5 keywords.
Find articles from a specific publisher site using Google News.
Parameters5
site
string
required
Domain of the news site, e.g. 'cnn.com'.
period
integer
optional
Number of days to look back for articles.
max_results
integer
optional
Maximum number of results to return.
full_data
boolean
optional
Return full data for each article. If False a summary should be created by setting the summarize flag
summarize
boolean
optional
Generate a summary of the article, will first try LLM Sampling but if unavailable will use nlp
Raw schema
{
"additionalProperties": false,
"properties": {
"site": {
"description": "Domain of the news site, e.g. 'cnn.com'.",
"type": "string"
},
"period": {
"default": 7,
"description": "Number of days to look back for articles.",
"minimum": 1,
"type": "integer"
},
"max_results": {
"default": 10,
"description": "Maximum number of results to return.",
"minimum": 1,
"type": "integer"
},
"full_data": {
"default": false,
"description": "Return full data for each article. If False a summary should be created by setting the summarize flag",
"type": "boolean"
},
"summarize": {
"default": true,
"description": "Generate a summary of the article, will first try LLM Sampling but if unavailable will use nlp",
"type": "boolean"
}
},
"required": [
"site"
],
"type": "object"
}
get_article_content
Download, scrape and parse the content of a specific news article from a given URL.
Parameters3
url
string
required
The URL of the news article to download and parse.
full_data
boolean
optional
Return full data for the article. If False a summary should be created by setting the summarize flag
summarize
boolean
optional
Generate a summary of the article, will first try LLM Sampling but if unavailable will use nlp
Raw schema
{
"additionalProperties": false,
"properties": {
"url": {
"description": "The URL of the news article to download and parse.",
"type": "string"
},
"full_data": {
"default": false,
"description": "Return full data for the article. If False a summary should be created by setting the summarize flag",
"type": "boolean"
},
"summarize": {
"default": true,
"description": "Generate a summary of the article, will first try LLM Sampling but if unavailable will use nlp",
"type": "boolean"
}
},
"required": [
"url"
],
"type": "object"
}
get_interest_by_region
Retrieves geographical interest data based on keywords and other parameters.
Parameters7
keywords
any
required
Search keyword(s) to analyze.
timeframe
string
optional
Timeframe for search volume analysis (e.g., 'today 12-m').
geo
string
optional
Geographic region code (e.g. 'US' or empty '' for worldwide).
cat
integer
optional
Category ID (default: 0 for all).
gprop
string
optional
Google property filter (e.g., '', 'youtube', 'news', 'images', 'froogle').
resolution
string
optional
Geographic resolution: 'COUNTRY', 'REGION', 'CITY', or 'DMA'.
TrendPulse is a Python Model Context Protocol (MCP) server for researching current news and search-interest trends. It combines Google News discovery and article extraction with Google Trends analysis so MCP clients can inspect what is trending, compare keyword momentum, explore related demand, and add current-news context to research workflows.
The project currently ships as a community/self-hosted MCP server and also contains the implementation for a separate hosted TrendPulse by DigestSEO surface for remote MCP clients such as ChatGPT and Codex. The hosted layer uses a smaller, goal-oriented tool surface while the community server keeps the full low-level research toolkit available to developers.
Project status: the local/community server is usable today. The DigestSEO-hosted MCP and public OpenAI plugin are not released yet and should not be treated as available endpoints.
Need a fast evidence check before choosing a topic, keyword, market, product angle, or content bet? Tomi offers a human-produced TrendPulse Demand Brief for EUR 49.
For one decision, the brief covers up to five keywords/phrases and two geographic markets using TrendPulse's open-source research capabilities plus current public sources: search-interest direction, relative momentum, related demand, useful news context, and three concrete implications. Target turnaround is within 24 hours after payment is confirmed and the inputs are supplied.
The paid brief is optional. The Community MCP remains free and unchanged, and the TP-RS1 marker is only an inbound attribution marker; no hidden telemetry is added to the MCP.
What TrendPulse can do
News research
Search Google News by keyword, location, topic, or publisher domain.
Retrieve top news stories.
Resolve Google News links and extract article content.
Fall back from normal HTTP retrieval to Playwright/Chromium for difficult pages.
Optionally summarize article text with MCP client sampling, with local NLP as a fallback.
Trend research
Retrieve current trending terms for a geographic market.
Pull Google Trends interest-over-time data for one or more keywords.
Calculate keyword growth over custom windows such as 3M or 1Y.
Rank live trends by volume or growth.
Inspect interest by country, region, city, or DMA where supported.
Explore related queries, related topics, suggestions, and category IDs.
Compare Google Search, YouTube Search, News Search, Image Search, and Google Shopping trend properties where supported by the underlying provider.
Community and hosted architecture
TrendPulse is being developed with two deliberate surfaces:
Surface
Purpose
Status
Community MCP
Full Python MCP server for local use, development, self-hosting, and integrations with MCP-compatible clients.
Available in this repository
TrendPulse by DigestSEO
Managed remote MCP for ChatGPT/Codex and a future public OpenAI plugin with a smaller, task-oriented tool surface.
In development
The community server remains useful independently. The hosted edition will reuse the same core trend-research concepts while adding the deployment, reliability, authentication, observability, and product integration needed for a managed service.
The implemented hosted tool surface is intentionally higher level than the community API and centers on goals such as:
discover_trends
analyze_keyword_trend
compare_keyword_trends
discover_related_demand
get_trend_context
find_seo_opportunities
These names describe the hosted ChatGPT Apps/MCP interface; they remain separate from the current Community MCP tool names.
Installation
Run from PyPI with uvx (recommended)
TrendPulse is published on PyPI, so the shortest install path is:
bash
uvx mcp-trendpulse
To run the current repository head instead of the published package:
News/article tools can fall back to Playwright when ordinary retrieval cannot extract a usable article. Installing the Python playwright package does not install Chromium automatically.
For local use:
bash
playwright install chromium
For Linux environments that also require browser system dependencies:
bash
playwright install --with-deps chromium
Trend-only operations do not inherently require Chromium.
Client configuration
Claude Desktop and Claude Code
Claude Code plugin packaging is included in .claude-plugin/plugin.json with its MCP definition in .mcp.json. The Community MCP remains local/stdin-based and runs through uvx mcp-trendpulse.
Requires uv/uvx. The install runs the published Community MCP package from PyPI over local stdio.
For workspace-level configuration, put this in .vscode/mcp.json. The same top-level servers shape is used by the VS Code user-profile mcp.json for a global configuration.
OpenAI's local ChatGPT desktop and Codex clients support local stdio MCP servers and share the same MCP configuration on a Codex host. Add the published TrendPulse package once with:
The same local server is then available to the ChatGPT desktop app, Codex CLI, and the Codex IDE extension. In ChatGPT desktop, you can also open Settings -> MCP Servers and add an STDIO server with command uvx mcp-trendpulse, then restart the app. This runs the published Community MCP package from PyPI; it does not use the unreleased hosted TrendPulse endpoint. ChatGPT on the web is separate and does not read this local Codex MCP configuration.
Cursor and portable Agent Plugins
This repository includes an Agent Plugins 1.0 manifest at the repository root. Compatible clients such as Cursor and GitHub Copilot can load the same portable plugin.json + mcp.json package.
Cursor also supports global and project MCP configuration. Add the server to the relevant mcp.json configuration:
Devin CLI plugins can load Claude plugin packages and Agent Plugins 1.0 packages directly from GitHub. TrendPulse already ships both compatible layouts (.claude-plugin/plugin.json + .mcp.json, and root plugin.json + mcp.json). Install it with:
bash
devin plugins install AKzar1el/mcp-trendpulse
Devin requires a signed-in CLI session to manage plugins. The installed TrendPulse plugin starts the published Community MCP locally over stdio with uvx mcp-trendpulse; it does not use the unreleased hosted TrendPulse endpoint. The same plugin is available in Devin Desktop after installation.
Kiro
Requires uv/uvx. The install runs the published Community MCP package from PyPI; it does not use the unreleased hosted surface.
Requires uv/uvx. LM Studio runs the published Community MCP package locally over stdio; no hosted TrendPulse service is required.
ChatGPT web and other cloud MCP clients
The repository now includes a dedicated stateless Streamable HTTP ASGI entry point at mcp_trendpulse.asgi:app. This is separate from the Community stdio entry point, which remains unchanged.
For controlled local/private testing you can run the ASGI app with Uvicorn or use the provided container. See deploy/README.md for the hardened container, Host/Origin allowlists, Chromium sandbox requirements, health/readiness endpoints, and reverse-proxy notes.
The DigestSEO-hosted endpoint and public ChatGPT app are still not released. Hosted deployments now support fail-closed Clerk OAuth authentication; do not expose the remote transport publicly unless Clerk issuer/JWKS/audience settings, the public base URL, and the Host/Origin allowlists are configured for that deployment.
Configuration
TrendPulse loads environment variables from the process environment and from a local .env file when present.
GOOGLE_NEWS_LANGUAGE and GOOGLE_NEWS_COUNTRY select the Google News language/edition used by all news-discovery tools; defaults remain en and US. GOOGLE_TRENDS_DELAY controls the request delay used by the current Trends provider. Proxy variables can be useful when the upstream service rate-limits or blocks a particular network.
Remote deployments also support TRENDPULSE_HTTP_PATH, TRENDPULSE_HTTP_ALLOWED_HOSTS, TRENDPULSE_HTTP_ALLOWED_ORIGINS, and TRENDPULSE_BROWSER_SANDBOX. The container enables Chromium sandboxing explicitly; local Community runs retain the Playwright-compatible default unless you opt in.
Do not commit secrets, private proxy credentials, or machine-specific .env files.
MCP tools
The community MCP server currently exposes 16 tools.
News tools
Tool
Purpose
get_news_by_keyword
Find recent news articles matching a keyword.
get_news_by_location
Find recent news associated with a location.
get_news_by_topic
Find recent news for a supported Google News topic.
get_top_news
Retrieve top Google News stories.
get_news_by_site
Find recent news from a specific publisher domain.
get_article_content
Download, validate, extract, and optionally summarize one article URL.
Trend tools
Tool
Purpose
get_trending_terms
Retrieve current trending terms for a geographic target.
get_trends
Retrieve interest-over-time points for one or more keywords.
get_growth
Calculate search-interest growth over requested windows.
get_ranked_trends
Rank current trends by growth or volume.
get_top_trends
Retrieve a top-trends feed without supplying a keyword.
get_interest_by_region
Compare keyword interest across geographic regions.
get_related_queries
Retrieve top and rising related search queries.
get_related_topics
Retrieve top and rising related Google Trends topics.
get_suggestions
Resolve autocomplete/topic suggestions for a query.
get_categories
Search or page through Google Trends category IDs and names before using cat.
Example: explicit trend window
get_trends accepts an explicit timeframe. Supplying one is preferable when you need reproducible comparisons.
json
{"keyword":["technical SEO audit","AI SEO audit"],"geo":"US","source":"google search","timeframe":"today 12-m","cat":0}
Supported provider ranges include standard windows such as today 12-m and today 5-y, relative windows such as today 90-d, all, and exact date ranges such as 2021-01-01 2026-01-01.
Google Trends values are normalized interest scores. Do not interpret a 0-100 interest series as absolute search volume.
CLI
The separate Click CLI exposes a smaller news-oriented command set than the MCP server:
bash
uv run mcp-trendpulse-cli --help
Current CLI commands:
text
brief-pack
keyword
location
top
topic
trending
brief-pack emits the deterministic trend/growth evidence table used for Demand Brief fulfillment. It intentionally leaves the final interpretation and recommendations to the human-produced brief.
The CLI and MCP surfaces are intentionally documented separately because they do not expose the same command set.
Development
Install the project with its development dependencies using your preferred Python environment, then run the unit suite:
bash
python -m pytest
The default pytest configuration excludes live integration tests.
Run live provider tests explicitly with:
bash
python -m pytest tests/integration -m integration
Browser-marked integration tests require Playwright Chromium to be installed.
Run Ruff checks with:
bash
ruff check .
MCP Inspector
Run the published-from-GitHub server through the MCP Inspector:
npx @modelcontextprotocol/inspector uv run mcp-trendpulse
Packaging
A GitHub Actions workflow builds and publishes Python distributions through PyPI Trusted Publishing when a GitHub release is published. The current stable package can be run with uvx mcp-trendpulse; use the GitHub uvx --from ... form only when you intentionally want repository-head code.
Security notes
Article retrieval is an outbound network feature and is treated as untrusted input. The implementation validates HTTP(S) targets, rejects private and non-routable destinations, checks redirect targets, enforces response-size limits, and applies browser-route validation when Playwright is used.
If you deploy TrendPulse remotely, retain these controls and add deployment-level rate limiting, request timeouts, observability, and resource limits rather than relying only on application defaults.
For responsible disclosure instructions, see SECURITY.md.
Roadmap
Current production-readiness priorities are:
Keep documentation, packaging metadata, and generated MCP manifests coherent with the live tool surface.
Keep CI, package validation, and dependency/runtime coverage aligned with what users actually install.
Preserve provider boundaries so upstream sources can be changed without rewriting the MCP layer.
Harden and operate the existing stateless Streamable HTTP transport while preserving local stdio operation.
Refine the existing smaller hosted tool surface for ChatGPT/Codex against real deployment and buyer evidence.
Complete provider authorization and integrate the hosted service with the DigestSEO application and operational stack.
Package and test the hosted MCP as an OpenAI plugin only after the managed service is production-ready.