trendzeist-mcp
A local, keyless MCP server that turns Google Trends, Autocomplete, News, and Wikipedia into ranked content, SEO, and AEO research.
Discover ranked breakout, rising, and evergreen blog topics from seeds, with angles, scores, and site-coverage gaps.
Mine long-tail questions from Google Autocomplete for FAQs and answer-engine content.
Find and score AEO opportunities using trend momentum, news coverage, Wikipedia presence, site coverage, and citability hints.
Analyze interest over time, compare keywords, detect growth/decline, and plan seasonality.
Explore related queries/topics, regional demand, category IDs, and real-time trending searches.
See who covers a topic in Google News and track Wikipedia page attention.
Track changes with a local archive: new/promoted breakouts, cooled queries, recurring topics, and trend history.
Compare growth across web, YouTube, News, Images, and Shopping.
Check source health, cache usage, archive status, and effective settings.
Provides access to Google Trends data, enabling topic discovery, keyword comparison, interest-over-time analysis, related queries and topics, geographic breakdowns, and real-time trending searches.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@trendzeist-mcp Give me blog post ideas about home espresso for US readers."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
trendzeist-mcp
Turn Google Trends into your next 10 blog posts — in one call.
trendzeist-mcp gives your AI assistant ranked breakout / rising / evergreen topics, the questions people actually ask, an AEO opportunity finder that scores question clusters with trend, news coverage, Wikipedia presence and citability hints, plus interest curves, regional demand, real-time trends, who covers a topic in Google News and Wikipedia attention. Free, local, private. No API key, no account, no browser.
SEO and AEO: find the questions people ask — and answer engines answer — then make your site the source they cite. Measuring your own visibility inside ChatGPT / Perplexity / AI Overviews is out of scope; this server tells you what to write, not who cites you.
You: Give me blog post ideas about home espresso for US readers.
Agent: → discover_topics(["espresso", "espresso machine"], geo="US")
← 1 breakout, 14 rising, 14 evergreen candidates with growth %, angles and 6 questions
→ mine_questions("espresso machine", geo="US")
← 30 long-tail questions: how-to 18, comparison 6, definition 4, listicle 2
→ compare_keywords(["how to descale espresso machine", "best coffee beans for espresso"])
← "Interest in 'how to descale espresso machine' rose 120% ... peaking 2026-08-30 (rising)."
"1. How to Descale Your Espresso Machine (how-to, rising +120%, publish now) ..."Built with
trendzeist-mcp is a thin MCP layer over pytrends-modern,
which handles all Google Trends requests. Trendzeist adds the MCP tools and prompt, request
throttling, a persistent disk cache, strict input validation, LLM-friendly JSON output and the
ranked discover_topics workflow. Other runtime dependencies: mcp
(official MCP Python SDK), pandas, platformdirs and requests. All MIT/BSD/Apache licensed.
Google Autocomplete, Google News RSS and the Wikimedia REST API are called directly with
requests (keyless).
Related MCP server: google-search-trends-mcp
Quick start
# any one of these
uvx trendzeist-mcp
pipx run trendzeist-mcp
pip install trendzeist-mcp && trendzeist-mcp
docker run -i --rm ghcr.io/phalkmin/trendzeist-mcpClaude Desktop — add under mcpServers in claude_desktop_config.json
(macOS ~/Library/Application Support/Claude/, Windows %APPDATA%\Claude\, Linux ~/.config/Claude/):
"trendzeist": { "command": "uvx", "args": ["trendzeist-mcp"] }Claude Code: claude mcp add trendzeist -- uvx trendzeist-mcp
Cursor / VS Code / Codex: same command/args shape — see llms-install.md
(written so you can paste it to an AI assistant and let it do the install).
Tools
Tool | What you get |
| Ranked blog topics from 1-5 seeds: breakout > rising > evergreen, deduped, each with a title |
| Long-tail questions about a seed from Google Autocomplete ( |
| Question clusters per seed × angle, scored with the seed's recent trend ( |
| What moved since your last snapshot (1-90 days): new and promoted breakouts (investigate now), new rising (consider), cooled / dropped queries (refresh existing post, or review — verify with |
| When demand peaks each year (5-year weekly data): |
| Where a topic grows: web / YouTube / News / Images / Shopping with |
| Everything the local archive has seen about a keyword: |
| Topics that keep breaking out in the local archive (≥ |
| Who covers a topic in Google News: headlines, publisher frequency table, recency histogram, coverage label |
| Exact-title Wikipedia article and daily pageviews (direction, growth); |
| Health of every source (live / error / idle), cache usage, observation archive (rows, dates, last error), effective settings — free, no requests |
| 0-100 interest curve with mean, peak, |
| Head-to-head share for 2-5 keywords, each with a |
| Top & rising related searches with breakout flags, angles and |
| Top & rising Knowledge-Graph topics (best-effort) |
| Where demand lives: COUNTRY (worldwide), REGION (within a country), CITY / DMA (US or worldwide) |
| Disambiguate a term into Google entities (title, type, mid) |
| What's trending right now, with news headlines; |
| Find Google Trends category ids to narrow any query |
Prompts: blog_ideas_from_trends(topic, audience, geo) (guided ideation),
content_brief(topic, audience, geo) (titles, outline, FAQ, regions, publishers),
answer_brief(question, geo) (a citable answer: direct answer, statistic, quote, sources,
FAQ, schema) and weekly_review(seeds, geo, site_queries) (content meeting: publish now /
plan for a date / refresh / retire). A ready-made agent skill lives in SKILL.md.
Output conventions
Every result carries
schema_version(currently3; bumped only when a field is removed or changes meaning) and_metawithrequests_made,cache_hit,cache_hits,cache_missesfor that call — so the model knows when to slow down._meta.archive_errorappears only when the local archive could not be written (the tool result is unaffected).Explainable score.
discover_topics.topics[]andaeo_opportunities.opportunities[]carryscore(0-100) andscore_breakdownwith five components, each{points, max, reason}:demand25 (questions found or top-query popularity),momentum25 (direction_now+ breakout / rising),freshness15 (Google News, 0 when not fetched),gap20 (vs.site_queries: gap 20 / partial 10 / covered 0; neutral 10 without them),aeo15 (question-shaped; definition angle with no Wikipedia article). Compare scores within one call only.Observation archive. Every fresh fetch (not cache hits) of related queries, trend labels, trending searches and mined questions becomes one snapshot (unique id; an empty Google answer is a snapshot too) with normalised rows in
archive.sqlite3next to the disk cache (stdlibsqlite3, 365-day retention, opened lazily). Related-query snapshots hold the complete lists regardless of a caller'slimit, so comparisons never invent drops.what_changed,trend_historyandrecurring_topicsread it;trendzeist_status.archivereports it. Suspect rising queries never enter it. Archive errors never fail a tool.TRENDZEIST_ARCHIVE=0turns it off.Site coverage is conservative but not literal. An
aeo_opportunitiescluster iscoveredonly when every question in it is covered; a mix ispartial(seecoverage_counts), soexclude_coveredcan never hide an unanswered question. Tokens are compared after plural folding and a small tech synonym map (mac/macos, wp/wordpress, js/javascript …), so "claude code mac" is covered by a site query "claude code macos";matchednames the site query behind each verdict. Prefixes only match on 6-letter stems ("code" is not "codex"), and a one-word head term inside a longer site query ("claude" in "claude code macos") ispartial, not covered. Feeding the raw Search Console variants still helps.angleis one ofhow-to | comparison | listicle | definition | verdict | news(ornull) — the title format the query suggests. Pair it with evidence: how-to → steps + numbers, comparison → table + quotes, definition → cite a primary source, verdict (yes/no questions: "is it worth it", "does it work") → the verdict first, the deciding evidence, then caveats, news → dated publisher quotes.Anything silently adjusted is reported: clamped limits add a
note, empty results add areason.Two trend labels.
directioncompares the first and last third of the window (rising | falling | stable | new | no_interest | insufficient_data;new= no interest in the first third).direction_nowcompares the last quarter of the window with the quarter before it and answers "is it still growing now?". A topic that peaked mid-window readsdirection: rising(ornew) anddirection_now: falling; theinsightsentence says so. Composites (discover_topics,aeo_opportunities) always fetch the seed trend ontoday 12-m(echoed asquery.trend_timeframe) and score ondirection_now.Suspect rising queries. Search-manipulation campaigns attach one name to many unrelated "Breakout" queries.
related_queriesflags such itemssuspect: truewith asuspect_reason(a flagged.comalso flags the queries carrying its name as words);discover_topicsmoves them tosuspect[];aeo_opportunitiesignores them. Google'sis_breakoutvalue is kept, only the trust changes.Off-topic related queries. Under niche seeds Google lists unrelated searches ("how to bake a cake" under an AI-tool seed) as breakouts from a tiny base and at values 0-3 in the top list. A breakout, or a top query below 10, that shares no word with the seed, the call's other seeds or the seed's on-topic top queries is
off_topic: true(exact words after plural folding; generic words like make, work, best, github don't count).discover_topicsmoves them tofiltered_out[](list, reason, growth or popularity) and out oftopics,questionsand the score, with anotesuggestingcategory=from two items;aeo_opportunitieslists them inoff_topic_dropped;related_queriesflags them and keeps them out ofquestions. Measured risers ("moka pot" +300 %) are never flagged. They do not enter the archive, andwhat_changedre-applies the rules to older snapshots (baseline_filtered).Level shifts are flagged. A sustained step (4-week mean changes ≥ 30 % and stays) appears in the summary as
level_shifts[](each withdate,change_pct,post_shift_change_pct,growth_affected,shared) andlevel_shift(the largest).interest_over_time/compare_keywordsaddwarnings[]: a step shared by two or more keywords in one week islikely_artifact(a Google sampling change; on 2026-07-12 five unrelated series stepped down 30-50 % at once). Aflattenedwarning means joint normalisation squashed a small keyword: fetch it alone. Growth and direction figures spanning a step overstate the change; read the curve on each side."popularity unknown" in
score_breakdown.demandis normal for rising-only items: Google gives a growth % but no popularity for them, so demand gets the minimum points. A top item rising from a very low base deserves a look at its curve (interest_over_time) before it becomes a post.citability_hints(onaeo_opportunities) encode the GEO paper (Aggarwal et al., KDD 2024): citing sources, quotations and statistics each lifted AI-engine visibility 30-40%; keyword stuffing did nothing.Language follows the market. With
TRENDZEIST_HLunset,geo="BR"queries Google withhl=pt-BR(≈50 countries mapped), so related queries come back in Portuguese. The effective language is echoed asquery.hl. Google News always uses the market's mapped edition (e.g.BR:pt), even whenTRENDZEIST_HLpins the Trends UI language.Authority channels: pass
gprop="news"orgprop="youtube"to any explore tool to see what news outlets and video audiences are searching for — the sources answer engines cite most.gprop="images"and"froogle"(Shopping) also work.
Why this one?
trendzeist-mcp | typical alternatives | |
Ranked topic discovery in one call | ✅ | ❌ raw primitives only |
Guided ideation prompt | ✅ | ❌ |
Multi-source, keyless | ✅ Trends + Autocomplete + News + Wikipedia | single source, or paid aggregators |
Knows when and what's worth it | ✅ | ❌ data only, no editorial reading |
Related queries + breakout detection | ✅ | often missing in hosted/paid servers |
Cost / auth | free, none | API key, monthly quota |
Browser required | no | Chrome for some Python libraries |
Cache survives client restarts | ✅ safe JSON disk cache | usually in-memory or none |
Rate-limit friendly | ✅ throttled per HTTP request | ❌ bursts, frequent 429s |
Run from source
git clone https://github.com/phalkmin/trendzeist-mcp && cd trendzeist-mcp
uv sync --group dev
uv run pytest -q # offline tests
uv run pytest -q -m live # optional: live canary against Google
uv run trendzeist-mcp # stdio server
npx @modelcontextprotocol/inspector uv run trendzeist-mcp # interactive debuggingPoint a client at the clone with
"command": "uv", "args": ["--directory", "/path/to/trendzeist-mcp", "run", "trendzeist-mcp"].
Configuration (env vars)
Variable | Default | Meaning |
| (unset → follows | Pin the Trends/Autocomplete UI language (e.g. |
|
| Timezone offset in minutes |
|
| Minimum seconds between every HTTP request to Google hosts (Trends cookie / token / data, RSS, Autocomplete, News) |
|
| Minimum seconds between Wikimedia requests (separate lane from Google) |
|
| Cache seconds for Trends explore, News search |
|
| Cache seconds for the trending RSS feed |
|
| Cache seconds for categories, suggestions, Autocomplete, Wikipedia |
|
| In-memory cache entries (disk is unbounded, swept on expiry) |
|
| Downsample interest curves to at most this many points (positive integer) |
|
| Retry attempts on transient errors |
|
| Exponential backoff factor |
|
| Random extra spacing between requests, as a fraction of the lane interval ( |
|
| Seconds a source refuses uncached requests after an HTTP 429 (fail fast with |
|
| Serve an expired cache entry (kept 7 days past expiry) when a fetch is rate limited, flagged |
| — | Comma-separated proxy URLs. Rotated per request for explore calls; RSS, Autocomplete, News and Wikipedia always use the first one |
| OS user cache dir | Persistent JSON cache location ( |
|
|
|
|
| Retention for archive rows (pruned once per process on first write) |
|
| Python logging level (stderr) |
Notes & limitations
Google rate-limits aggressively (HTTP 429). Every HTTP request is serialised and throttled; results are cached (15 min explore / News, 5 min RSS, 24 h categories / Autocomplete / Wikipedia) as plain JSON on disk so client restarts don't re-fetch. Memory cache is bounded and expired files are swept automatically. Errors come back as tool errors with guidance.
mine_questionsissues up to 16 Autocomplete requests per uncached call (one per question prefix); at the default 2 s interval that is ~30 s worst case. It stops as soon aslimitis met and returns partial results if Google starts refusing.Values are Google's relative 0–100 index, not absolute search volume.
growth_3m/growth_12mcompare the mean of the last window with the window before it, so each needs two windows of data:growth_3mneeds ≥ 6 months (today 12-m),growth_12mneedstoday 5-y. When either isnullfor that reason the summary carries agrowth_notesaying which timeframe to use.Google rate-limits the first burst of a session hardest. Start with 1–2 seeds in
discover_topics/aeo_opportunities; a 429 on the trend-context step no longer aborts the call (related queries are still fetched), and skip messages say when to retry.mine_questionsprefixes follow the request language (hl, fromgeounlessTRENDZEIST_HLpins it): tables exist for pt, es, fr, de, it, pl and nl, andprefix_languagenames the one used (aeo_opportunitiesmines with the same set). For other languages the English set is used andlanguage_notesays so; pass a seed already phrased in the market's language. The verb-based realness points are English-only, so abroad only the literal prefix + seed echo is filtered as padding.After an HTTP 429 a source cools down (
TRENDZEIST_COOLDOWN, default 60 s, or Google'sRetry-After): uncached requests to it fail fast with a retryable error that says when to retry,trendzeist_status.sources[]showscooling_down/retry_after_s, and every result carries_meta.rate_limited[]while any source is cooling. Other sources keep working. If the cache holds an expired copy of the refused query (kept 7 days), it is served and the result carries a top-levelstale {age_days, note}(TRENDZEIST_STALE_FALLBACK=0turns that off).interest_over_time/compare_keywordsare one request for all keywords, so a 429 there has no per-keyword partial result;discover_topics/aeo_opportunitiesreport per-seed errors andskipped.related_topicsfrequently returns nothing from Google;related_queriesis reliable.Google's legacy daily
trending_searchesendpoint is gone (404);trending_nowuses the RSS feed.aeo_opportunitiesis the most expensive call: worst case 1 + 11 requests per seed (Wikipedia runs on its own lane). Google requests stop at the first 429; Wikipedia data is still returned.trendzeist_statusshows which source is erroring without any request.The ambiguous-seed check in
discover_topics/aeo_opportunitiesis one extra Google Trends request per seed the first time that seed is seen (cached for the static TTL, so repeats are free). It is skipped once a call is rate limited (the seed report then carries anambiguity_note); a failure there is anentities:<seed>error and never stops the seed. The lookup answers in the server language (TRENDZEIST_HL, defaulten-US), not the geo's: a Portuguese or German seed is rarely matched against English entity titles, so a non-English geo with no match gets anambiguity_notesaying so. SetTRENDZEIST_HLto the seed's language to check it properly.wiki_attention.has_articleconfirms an exact-title search match only; a different Wikipedia search hit appears asrelated_article, not as a citation or proof of a gap. Verify related titles and redirects manually before claiming an encyclopedic content gap.Cache TTLs, memory-entry count and series-point cap must be positive integers; invalid values produce an actionable tool error rather than an opaque formatter failure.
what_changedneeds a baseline: the first call records one and reportsreason: "baseline recorded <date>; rerun after <date>"per seed, together withfirst_run: trueandfirst_seen[](the current breakouts and rising queries, action "… (no history yet)"). When snapshots exist but none issince_daysold, it compares with the oldest and says so (baseline_note,baseline_age_days). Snapshots accrue from everyday use (discover_topics,related_queriesontoday 3-m; trend labels ontoday 12-m), so a week of normal work is enough.trend_historyandrecurring_topicsare archive-only; their episode counts can only separate two breakouts when a poll between them saw the topic not breaking out, so sparse polling undercounts (weeklywhat_changedruns are what makes them useful).seasonalityneeds at least 3 full years of non-zero weekly data (today 5-y); younger topics returnseasonal: nullwith areason(for a two-year-old topic, read the shape withinterest_over_time(..., "today 5-y")instead). Profile and strength use full years only; zero off-season interest is reported as seasonal withstrength_note(ratio unbounded);in_peak_nowflags that the peak month is the current one.compare_channelsissues 5 requests and stops at the first 429 (skippedlists the rest); channels are separate 0-100 scales, andmomentum: all_decliningmeansfastest_channelis only falling least.what_changednever says "retire": leaving Google's relative, bounded related list is not evidence of falling demand. Items getreview: ...actions; confirm withinterest_over_timeon the item before retiring. A snapshot where Google returned nothing is reported as such, not as a mass drop.Camoufox/browser mode from pytrends-modern is intentionally not used.
Disclaimer
This server talks to the same undocumented endpoints the trends.google.com frontend uses (plus Google Autocomplete and Google News RSS). They are unofficial and may change, rate-limit or disappear without notice. A weekly live canary runs in CI to catch breakage early. This project is not affiliated with, endorsed by, or sponsored by Google LLC. "Google Trends" is a trademark of Google LLC. You are responsible for complying with Google's terms of service in your jurisdiction.
Contributing
Issues and PRs welcome. Read AGENTS.md for architecture and conventions
(also useful if you point a coding agent at the repo). Data-shape corrections after a Google
change are the most valuable contribution — include the call you made and what came back.
License
MIT — see LICENSE. Built on pytrends-modern (MIT).
Available Tools
19 toolsaeo_opportunitiesA
AEO opportunity finder. For 1-5 seeds: question-shaped searches (Trends + a
capped Autocomplete pass) clustered by seed and title angle, each scored with
the seed's recent trend (direction_now over 12 months, growth_3m), Google News
coverage (who to quote / pitch), Wikipedia presence, the site's own coverage and
the evidence type that makes the answer citable (score_breakdown explains every
point). site_queries = queries the site already ranks for (fill from a Search
Console MCP or page titles); clusters then carry coverage covered / partial / gap
and exclude_covered drops covered ones. Spam-like rising queries are ignored.
Up to ~1+10 requests per seed; partial failures per source in errors. A seed
report with 'ambiguous' names several Google entities (e.g. Apple the company vs
the fruit): ask the user before writing, then re-run with a more specific phrase
(a mid only works for Google Trends, not for News / Wikipedia / Autocomplete).
limit: clusters (1-25).
Inputs: seeds (required), geo, limit, timeframe, +2 more. Returns: object
compare_channelsB
Which Google property a topic grows on: web, youtube, news, images, shopping,
each with direction / direction_now / growth_3m, plus fastest_channel and a
format_hint (video tutorial, buying guide, newsjacking piece ...). 5 requests
(web first; the rest are skipped on a 429). Channels are separate 0-100 scales:
compare growth, never means.
Inputs: keyword (required), geo, timeframe. Returns: object
compare_keywordsA
Compare 2-5 keywords head-to-head: relative share, leader and trend direction for each. Use to pick the strongest angle among alternatives. Each ranking row has a role (leader / rising challenger / declining / niche / steady) and a content_implication; winner is the term to target (a rising challenger beats a falling or dead leader; null + winner_reason when nothing has data or interest) and seo_interpretation sums it up in one sentence.
Inputs: keywords (required), geo, gprop, category, +1 more. Returns: object
discover_topicsA
One-shot topic discovery for blog ideation. For 1-5 seed keywords, pulls
12-month trend context (direction, direction_now, growth_3m) plus rising/top
related queries, de-duplicates and ranks candidates as breakout > rising >
evergreen, each tagged with a title angle and an explainable score.
questions collects question-shaped searches across seeds; suspect lists
spam-like rising queries kept out of the ranking. site_queries = queries the
site already ranks for (fill from a Search Console MCP or page titles): each topic
then gets coverage covered / partial / gap, and exclude_covered drops the covered
ones. Partial failures are reported per seed in errors instead of failing the
call. A seed report with 'ambiguous' names several Google entities (e.g. Apple
the company vs the fruit): ask the user before writing, or re-run with the right
mid. First call of a session: start with 1-2 seeds to avoid a 429.
Inputs: seed_keywords (required), geo, gprop, category, +4 more. Returns: object
interest_by_regionB
Where a keyword is searched most. resolution: COUNTRY (geo='' only), REGION (states/provinces within geo), CITY and DMA (US metro areas; geo='US' or worldwide only). Non-US countries support REGION only.
Inputs: keywords (required), geo, gprop, limit, +3 more. Returns: object
interest_over_timeA
Search-interest time series (0-100) for 1-5 keywords, with per-keyword summary (mean, latest, peak, direction over the whole window, direction_now = recent slope, growth_3m/growth_12m % and a plain-English insight). Use direction_now to decide whether to write about a topic now; direction can be 'rising' or 'new' for a topic that peaked months ago. A sustained step in a series is reported as summary..level_shift and in warnings (shared by several keywords = likely a Google sampling change): growth figures spanning that week overstate the change. Long series are downsampled to ~60 points. gprop: '' (web), 'news', 'youtube' (authority channels answer engines cite), 'images', 'froogle'.
Inputs: keywords (required), geo, gprop, category, +1 more. Returns: object
list_categoriesA
Browse/search Google Trends category ids (e.g. 'coffee' -> Food & Drink >
Coffee & Tea). Pass the id as category to other tools to narrow results.
Inputs: limit, search. Returns: object
mine_questionsA
Long-tail questions people type about a seed, from Google Autocomplete ('how to', 'why', 'what is', 'vs' ... expansions; localised prefixes for pt/es/fr/de/it/pl/nl follow geo's language, see prefix_language), de-duplicated and tagged with a title angle. Feeds FAQ sections and answer-engine (AEO) content. Up to ~16 throttled requests per call; results cached 24 h. limit: 1-100.
Inputs: seed (required), geo, limit. Returns: object
news_coverageA
Who is covering a topic in Google News: recent headlines, a publisher frequency table (mention / pitch targets) and a recency histogram with a coverage label. One request, cached 15 min. limit = headlines returned (1-50).
Inputs: topic (required), geo, limit. Returns: object
recurring_topicsA
Topics that broke out again and again (local archive, last days 1-365):
each with episodes (separate breakout runs under other seeds; runs that overlap
or restart within 7 days, under any seed, count once), first/last breakout, the
seeds it appeared under and an action (one durable page, refreshed at each
spike). min_episodes 2-10 (default 3); seeds
(optional, up to 5) limits the scan. coverage_days + note when the archive is
younger than the window. Free: makes no network requests.
Inputs: geo, days, limit, seeds, +1 more. Returns: object
seasonalityA
When demand for a keyword peaks each year (5-year weekly data): monthly_index, peak_months, seasonal_strength, next_peak and publish_by (6 weeks before the peak), with a plain-English insight. One request; seasonal=null with a reason when fewer than 3 full years exist.
Inputs: keyword (required), geo. Returns: object
suggest_keywordsA
Google's entity suggestions for a keyword (title, type, mid). Use to disambiguate ambiguous terms or find the canonical topic id.
Inputs: keyword (required). Returns: object
trend_historyA
Local archive of what the tools have seen about a keyword (as a seed or as a
related query under other seeds) in the last days (1-365): first_seen /
last_seen, breakout_episodes (separate breakout runs; >= 3 = recurring, durable
page) vs breakout_observations (polling count), direction_timeline per timeframe
and seen_under_seeds. Free: makes no network requests.
Inputs: keyword (required), geo, days. Returns: object
trending_nowA
Real-time trending searches (last ~24h) for a country or US state, with approximate traffic and linked news headlines. Good for newsjacking. topic_filter keeps only trends whose title or headlines contain every word given (e.g. 'coffee'); the full feed is still fetched and cached once.
Inputs: geo, max_articles, topic_filter. Returns: object
trendzeist_statusA
Health of every data source (google_trends, google_autocomplete, google_news, wikipedia: live / error / idle with the last error), cache usage, observation archive (rows, dates, last_error) and effective settings. Free: makes no network requests.
Inputs: no named parameters. Returns: object
what_changedA
What changed for 1-5 seeds since the last snapshot at least since_days (1-90) old: new_breakouts and promoted (action: investigate now), new_rising (consider), cooled / dropped queries (review: verify with interest_over_time before retiring, or refresh existing post), rank_moves and a direction_flip on direction_now. Leaving Google's relative list is not proof of falling demand. Refreshes current data first (1 + N requests, cached), then compares complete snapshots from the local observation archive, which fills up as any tool fetches fresh data. No snapshot old enough -> compares with the oldest available (baseline_note gives its real age); first run -> first_seen lists the current breakouts and rising queries ('no history yet') plus the date to rerun.
Inputs: seeds (required), geo, since_days. Returns: object
wiki_attentionA
Does Wikipedia have an exact-title article for a topic, and is attention growing?
Exact article (title, encoded URL, wordcount), daily pageviews for days (7-90)
with direction / growth / insight, or has_article=false with a related_article
suggestion (when search finds a different title); verify gaps before citing.
lang = Wikipedia edition ('en', 'pt', 'de'). Own rate lane; cached 24 h.
Inputs: topic (required), days, lang. Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 19 tools
Most tools have clearly distinct targets (trending_now vs seasonality vs interest_by_region vs wiki_attention), but the ideation layer overlaps heavily: discover_topics, mine_questions, aeo_opportunities, and related_queries all produce query-based content angles, and the descriptions' distinctions (scoring, clustering, site_queries) require careful reading to pick correctly. Similarly what_changed, recurring_topics, and trend_history all analyze the local archive, though their scopes are described well enough to separate.
All names use snake_case with short, readable, mostly verb_noun or noun-phrase forms (list_categories, mine_questions, suggest_keywords, news_coverage, wiki_attention). There is a mix of verb-led (compare_*, discover_*) and noun-led names, but the convention is predictable per concept and no casing chaos exists.
19 tools for a trend-research domain is heavy; several tools (discover_topics, aeo_opportunities, mine_questions) largely recombine the same underlying data sources, so the set feels padded even though each tool has a defensible niche.
Coverage is unusually full: real-time trends, time series, multi-keyword comparison, related queries/topics, regions, news, Wikipedia, autocomplete, seasonality, archive analytics, categories, and health status. Minor gaps remain, e.g. no daily/top-charts endpoint distinct from trending_now and no direct export or saved-report tooling.
Maintenance
Related MCP Connectors
Google Trends: Search, Images, News, Shopping over time, growth metrics. Free key at trendsmcp.ai
Bulk Google Trends: interest over time, regions, rising queries and plain-English trend summaries.
Google Trends in bulk: interest over time, by region, related and rising queries, trending now.
Related MCP Servers
- AlicenseBqualityDmaintenanceProvides access to Google Trends data including status, trending questions, and trending topics via MCP tools.2327 npm34MIT
- AlicenseNot gradedqualityCmaintenanceProvides Google Search trend data as an MCP tool, with historical series, growth percentages, and live trending searches, no scraping or rate limits.1MIT
- AlicenseAqualityDmaintenanceProvides free Google Trends data (interest over time, term comparison, related queries, trending now, regional breakdown) to MCP-compatible AI clients without needing an API key.5147 npm2MIT
- AlicenseAqualityBmaintenanceEnables querying Google Trends data directly from conversational MCP clients, including search interest over time, related queries and topics, regional breakdowns, and trending searches, for market research without leaving the chat.112MIT