Trendzeist – Google Trends for content ideation

io.github.phalkmin由 GitHub 帳號 phalkmin 發布v0.2.1更新於 Oct 24, 2026

Free Google Trends MCP: ranked breakout/rising/evergreen topics for content ideas. No API key.

概覽

AI 產生的概覽

在本機執行的 MCP 伺服器,把 Google Trends、自動完成、新聞與維基百科資料整理成排序後的選題、問題與 AEO 機會。

可以做什麼
  • 依種子關鍵字找出分級的爆發、上升與長青選題,附角度、評分與網站覆蓋缺口
  • 挖掘長尾問題,並為 AEO 機會叢集評分,結合趨勢、新聞、維基百科與可引用性提示
  • 查看興趣曲線、關鍵字比較、相關查詢與主題、地區需求、分類與目前熱搜
  • 查詢主題的季節性、各管道熱度、新聞報導與維基百科關注度
  • 比對歷史快照查看變化,並瀏覽本機觀測存檔
  • 執行部落格選題、內容簡報、答案簡報與每週檢視等引導式提示
適用情境
適合讓助理依真實搜尋需求提出部落格、FAQ 或面向答案引擎的內容選題,或判斷某主題正在上升、具季節性,還是自家網站已涵蓋。它著重 SEO 與內容規劃,而非衡量自己在 AI 答案引擎中的曝光。
執行需求
以 stdio 在本機執行,通常透過 uvx 或 pipx 安裝 PyPI 套件,也可使用 Docker 映像;不需要 API 金鑰或帳號。選用環境變數:TRENDZEIST_HL 設定介面語言,TRENDZEIST_MIN_INTERVAL 控制請求間隔,TRENDZEIST_PROXIES 用於代理輪替。需要連線至 Google 與維基媒體端點的外網存取。
安裝前請注意
它呼叫 Google 未公開的介面,結果可能失效或被限流,且須自行遵守 Google 的服務條款。TRENDZEIST_PROXIES 中的代理網址屬於憑證。它會在本機寫入磁碟快取與 SQLite 觀測存檔,並把查詢送往 Google、自動完成、新聞與維基媒體。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Trendzeist – Google Trends for content ideation,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

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).

Quick start

bash
# any one of theseuvx trendzeist-mcppipx run trendzeist-mcppip install trendzeist-mcp && trendzeist-mcpdocker run -i --rm ghcr.io/phalkmin/trendzeist-mcp

Claude Desktop — add under mcpServers in claude_desktop_config.json (macOS ~/Library/Application Support/Claude/, Windows %APPDATA%\Claude\, Linux ~/.config/Claude/):

json
"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

ToolWhat you get
discover_topicsRanked blog topics from 1-5 seeds: breakout > rising > evergreen, deduped, each with a title angle and an explainable score; plus questions[] people ask and suspect[] spam-like rising queries kept out of the ranking. Pass site_queries (what your site already ranks for) to mark each topic covered / partial / gap
mine_questionsLong-tail questions about a seed from Google Autocomplete (how to, why, what is, vs …), deduped and angle-tagged — FAQ / AEO fuel
aeo_opportunitiesQuestion clusters per seed × angle, scored with the seed's recent trend (direction_now, growth_3m over 12 months), Google News coverage (publishers to quote / pitch), Wikipedia presence, your site's coverage (site_queries) and citability hints — one call, partial failures per source
what_changedWhat 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 interest_over_time before retiring), rank moves and a direction_now flip — from the local observation archive
seasonalityWhen demand peaks each year (5-year weekly data): peak_months, seasonal_strength, next_peak, publish_by (6 weeks before), one-sentence insight
compare_channelsWhere a topic grows: web / YouTube / News / Images / Shopping with growth_3m, direction_now, fastest_channel, momentum (growing / flat / all_declining) and a format_hint (video tutorial, buying guide, newsjacking piece …)
trend_historyEverything the local archive has seen about a keyword: first_seen, breakout_episodes (separate runs; recurring = durable page) vs breakout_observations (polling count), direction_timeline per timeframe, seen_under_seeds — free, no requests
news_coverageWho covers a topic in Google News: headlines, publisher frequency table, recency histogram, coverage label
wiki_attentionExact-title Wikipedia article and daily pageviews (direction, growth); has_article=false and optional related_article when only a different search hit is found
trendzeist_statusHealth of every source (live / error / idle), cache usage, observation archive (rows, dates, last error), effective settings — free, no requests
interest_over_time0-100 interest curve with mean, peak, direction (whole window), direction_now (recent slope), growth_3m / growth_12m and a plain-English insight
compare_keywordsHead-to-head share and winner for 2-5 keywords
related_queriesTop & rising related searches with breakout flags, angles and questions[]
related_topicsTop & rising Knowledge-Graph topics (best-effort)
interest_by_regionWhere demand lives: COUNTRY (worldwide), REGION (within a country), CITY / DMA (US or worldwide)
suggest_keywordsDisambiguate a term into Google entities (title, type, mid)
trending_nowWhat's trending right now, with news headlines; topic_filter keeps only trends mentioning your words
list_categoriesFind 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 (currently 3; bumped only when a field is removed or changes meaning) and _meta with requests_made, cache_hit, cache_hits, cache_misses for that call — so the model knows when to slow down. _meta.archive_error appears only when the local archive could not be written (the tool result is unaffected).
  • Explainable score. discover_topics.topics[] and aeo_opportunities.opportunities[] carry score (0-100) and score_breakdown with five components, each {points, max, reason}: demand 25 (questions found or top-query popularity), momentum 25 (direction_now + breakout / rising), freshness 15 (Google News, 0 when not fetched), gap 20 (vs. site_queries: gap 20 / partial 10 / covered 0; neutral 10 without them), aeo 15 (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.sqlite3 next to the disk cache (stdlib sqlite3, 365-day retention, opened lazily). Related-query snapshots hold the complete lists regardless of a caller's limit, so comparisons never invent drops. what_changed and trend_history read it; trendzeist_status.archive reports it. Suspect rising queries never enter it. Archive errors never fail a tool. TRENDZEIST_ARCHIVE=0 turns it off.
  • Site coverage is conservative. An aeo_opportunities cluster is covered only when every question in it is covered; a mix is partial (see coverage_counts), so exclude_covered can never hide an unanswered question.
  • angle is one of how-to | comparison | listicle | definition | news (or null) — the title format the query suggests. Pair it with evidence: how-to → steps + numbers, comparison → table + quotes, definition → cite a primary source, news → dated publisher quotes.
  • Anything silently adjusted is reported: clamped limits add a note, empty results add a reason.
  • Two trend labels. direction compares the first and last third of the window (rising | falling | stable | new | no_interest | insufficient_data; new = no interest in the first third). direction_now compares the last quarter of the window with the quarter before it and answers "is it still growing now?". A topic that peaked mid-window reads direction: rising (or new) and direction_now: falling; the insight sentence says so. Composites (discover_topics, aeo_opportunities) always fetch the seed trend on today 12-m (echoed as query.trend_timeframe) and score on direction_now.
  • Suspect rising queries. Search-manipulation campaigns attach one name to many unrelated "Breakout" queries. related_queries flags such items suspect: true with a suspect_reason; discover_topics moves them to suspect[]; aeo_opportunities ignores them. Google's is_breakout value is kept, only the trust changes.
  • citability_hints (on aeo_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_HL unset, geo="BR" queries Google with hl=pt-BR (≈50 countries mapped), so related queries come back in Portuguese. The effective language is echoed as query.hl. Google News always uses the market's mapped edition (e.g. BR:pt), even when TRENDZEIST_HL pins the Trends UI language.
  • Authority channels: pass gprop="news" or gprop="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-mcptypical alternatives
Ranked topic discovery in one call✅ discover_topics❌ raw primitives only
Guided ideation prompt✅ blog_ideas_from_trends❌
Multi-source, keyless✅ Trends + Autocomplete + News + Wikipediasingle source, or paid aggregators
Knows when and what's worth it✅ what_changed, seasonality, compare_channels, site_queries gaps❌ data only, no editorial reading
Related queries + breakout detection✅often missing in hosted/paid servers
Cost / authfree, noneAPI key, monthly quota
Browser requirednoChrome for some Python libraries
Cache survives client restarts✅ safe JSON disk cacheusually in-memory or none
Rate-limit friendly✅ throttled per HTTP request❌ bursts, frequent 429s

Run from source

bash
git clone https://github.com/phalkmin/trendzeist-mcp && cd trendzeist-mcpuv sync --group devuv run pytest -q                 # offline testsuv run pytest -q -m live         # optional: live canary against Googleuv run trendzeist-mcp              # stdio servernpx @modelcontextprotocol/inspector uv run trendzeist-mcp   # interactive debugging

Point a client at the clone with "command": "uv", "args": ["--directory", "/path/to/trendzeist-mcp", "run", "trendzeist-mcp"].

Configuration (env vars)

VariableDefaultMeaning
TRENDZEIST_HL(unset → follows geo)Pin the Trends/Autocomplete UI language (e.g. en-US); Google News uses its country edition independently. When unset, language follows geo (BR → pt-BR, unknown → en-US)
TRENDZEIST_TZ360Timezone offset in minutes
TRENDZEIST_MIN_INTERVAL2.0Minimum seconds between every HTTP request to Google hosts (Trends cookie / token / data, RSS, Autocomplete, News)
TRENDZEIST_WIKI_MIN_INTERVAL0.5Minimum seconds between Wikimedia requests (separate lane from Google)
TRENDZEIST_EXPLORE_TTL900Cache seconds for Trends explore, News search
TRENDZEIST_RSS_TTL300Cache seconds for the trending RSS feed
TRENDZEIST_STATIC_TTL86400Cache seconds for categories, suggestions, Autocomplete, Wikipedia
TRENDZEIST_MAX_MEMORY_ENTRIES256In-memory cache entries (disk is unbounded, swept on expiry)
TRENDZEIST_MAX_SERIES_POINTS60Downsample interest curves to at most this many points (positive integer)
TRENDZEIST_RETRIES3Retry attempts on transient errors
TRENDZEIST_BACKOFF1.5Exponential backoff factor
TRENDZEIST_PROXIES—Comma-separated proxy URLs. Rotated per request for explore calls; RSS, Autocomplete, News and Wikipedia always use the first one
TRENDZEIST_CACHE_DIROS user cache dirPersistent JSON cache location (0700); off to disable (also disables the archive)
TRENDZEIST_ARCHIVE10 disables the observation archive (what_changed / trend_history then report available: false)
TRENDZEIST_ARCHIVE_DAYS365Retention for archive rows (pruned once per process on first write)
TRENDZEIST_LOG_LEVELWARNINGPython 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_questions issues 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 as limit is met and returns partial results if Google starts refusing.
  • Values are Google's relative 0–100 index, not absolute search volume. growth_3m / growth_12m compare the mean of the last window with the window before it, so each needs two windows of data: growth_3m needs ≥ 6 months (today 12-m), growth_12m needs today 5-y. When either is null for that reason the summary carries a growth_note saying 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.
  • Question prefixes in mine_questions are English; for native-language questions in a non-English market, pass a seed already phrased in that language.
  • related_topics frequently returns nothing from Google; related_queries is reliable.
  • Google's legacy daily trending_searches endpoint is gone (404); trending_now uses the RSS feed.
  • aeo_opportunities is the most expensive call: worst case 1 + 10 requests per seed (Wikipedia runs on its own lane). Google requests stop at the first 429; Wikipedia data is still returned. trendzeist_status shows which source is erroring without any request.
  • wiki_attention.has_article confirms an exact-title search match only; a different Wikipedia search hit appears as related_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_changed needs a baseline: the first call records one and reports reason: "baseline recorded <date>; rerun after <date>" per seed. Snapshots accrue from everyday use (discover_topics, related_queries on today 3-m; trend labels on today 12-m), so a week of normal work is enough. trend_history is archive-only.
  • seasonality needs at least 3 full years of non-zero weekly data (today 5-y); younger topics return seasonal: null with a reason. Profile and strength use full years only; zero off-season interest is reported as seasonal with strength_note (ratio unbounded); in_peak_now flags that the peak month is the current one. compare_channels issues 5 requests and stops at the first 429 (skipped lists the rest); channels are separate 0-100 scales, and momentum: all_declining means fastest_channel is only falling least.
  • what_changed never says "retire": leaving Google's relative, bounded related list is not evidence of falling demand. Items get review: ... actions; confirm with interest_over_time on 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).

來源:README.md,提交 46cc7fd

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

1
  1. v0.2.1最新Sep 16, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分