TrendFlow
概要
作者による説明(英語の原文)
Google Trends data: interest over time, by region, related queries, and trending now.
PopNx MCPの3つの柱
この3つを1つのスコアにまとめることはしません。意見、測定、人気はそれぞれ別のものだからです。
- 利用者の声iレビューはまだありませんレビューは今後のステップで、アカウント機能と一緒に始まります
- 私たちの基本チェックi1項目中1項目に合格公開情報からチェック。コードはまだスキャンしていません
- 利用状況iとても新しい★ –
できること
このサーバーのやさしい解説はまだ書いていません。以下はレジストリから読み取った事実です。
- 接続方法: クラウドで動く
- トランスポート: Streamable HTTP
- カテゴリ: マーケティング・SNS
インストール
使っているAIアプリを選んで、設定をコピーしてください。
インストールの前に
- 基本チェック:1項目中1項目に合格
- 作者のサーバーで動きます。あなたが頼んだ内容は、作者のサーバーを通ります。
- レジストリには、入力が必要なキーは載っていません。
必要なもの
- クラウドで動くインストール不要。インターネット経由でつながります
どのアプリを使っていますか?
上でアプリを選んでください。選んだアプリを覚えておくので、次からはボタンに「…にインストール」と表示されます。
ウェブ、デスクトップ、モバイルのClaudeで使えます:
- Settings → Connectors を開く
- Add custom connector を押す
- 下のアドレスを貼り付けて Add を押す
- サインインを求められたら、作者のサービスにサインインする
https://trendflow.mory.dev/mcpターミナルでこれを実行します
claude mcp add --transport http trendflow https://trendflow.mory.dev/mcpまたは、設定を自分でコピーする
プロジェクトの .cursor/mcp.json、または ~/.cursor/mcp.json に貼り付けます
{
"mcpServers": {
"trendflow": {
"url": "https://trendflow.mory.dev/mcp"
}
}
}ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。
または、設定を自分でコピーする
プロジェクトの .vscode/mcp.json に貼り付けます
{
"servers": {
"trendflow": {
"type": "http",
"url": "https://trendflow.mory.dev/mcp"
}
}
}ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。
ChatGPTがつなげるのは、インターネット上のサーバーだけです:
- ウェブ版のChatGPTを開き → Settings → Connectors (Apps)
- Create または Add を押す(プランによっては、先に Advanced で Developer mode をオンにする必要があります)
- 下のアドレスを貼り付け、名前を付けて保存する
- サインインを求められたら、作者のサービスにサインインする
https://trendflow.mory.dev/mcpメニューの名前は、プランや時期によって少し違うことがあります。
選んだアプリは、この端末のCookieに保存されます。アカウントは不要です。
この設定は、作者のレジストリ登録情報から作成しています。READMEと違う場合は、READMEに従ってください。
できること
このサーバーのツール一覧はまだ読み取っていません。エンドポイントは順番にチェックしています。
基本チェックi
誰でも見られる情報をチェックしており、コードは読んでいません。当てはまらない項目は数に入れていません。 · 2026年11月9日にチェック
- ✓ 合格
作者とリポジトリが一致
レジストリ名はドメイン mory.dev で確認済みです(レジストリがドメインの所有を確認しています)
- … 未チェック
今もメンテナンスされている
このリポジトリはまだGitHubから読み取っていません
- … 未チェック
ライセンスがある
このリポジトリはまだGitHubから読み取っていません
- … 未チェック
エンドポイントが応答する
まだチェックしていません。エンドポイントは順番にチェックしています
- … 未チェック
OAuthでサインイン
まだチェックしていません。エンドポイントは順番にチェックしています
- … 未チェック
ツールの説明に隠れた指示がない
まだチェックしていません。エンドポイントをチェックするときにツール一覧を読み取ります
マーケティング・SNSのほかのサーバーとの比較i
- このカテゴリのほかの3630件のうち0%よりスターが多い
- このカテゴリのほかの3630件のうち24%より最近レジストリに公開
- 基本チェックの結果が、このカテゴリのほかの3630件のうち100%と同じかそれ以上
レジストリでこのカテゴリにある有効なすべてのサーバーと比較しています。スターは、公開者がリポジトリの所有者である場合だけ数えます。
よくある質問
TrendFlowは安全ですか?
当てはまる基本チェック1項目のうち1項目に合格しました。コードは読んでいません。キーやトークンを追加する前に、サーバーがどんなアクセスを求めているかを確認し、必要な権限だけを持つキーを使ってください。
どんなキーやコードが必要ですか?
レジストリには必須のキーは載っていません。ただし、最初に使うときにサインインを求めるサーバーもあります。
パソコンで動きますか、それともクラウドですか?
作者のクラウドで動きます。インストール不要でインターネット経由でつながりますが、送った内容は作者のサーバーを通ります。
今もメンテナンスされていますか?
GitHubリポジトリの最終更新は–、最新バージョン(0.1.0)がレジストリに届いたのは3 か月前です。
どのアプリで使えますか?
Claude Desktop、Claude Code、Cursor、VS CodeなどのMCP対応アプリで使えます。URLでつながるので、リモートMCPサーバーに対応したアプリ(開発者モードのChatGPTなど)でも使えます。
代わりに使えるものは?
同じカテゴリには:MCP YouTube Transcript, Google Analytics MCP, BibiGPT YouTube Video Summarizer
代わりの候補
同じカテゴリで、ほかの作者が作ったサーバー。スターの多い順。
カードの見方:↓ 週あたりのダウンロードi★ GitHubスターi3つの柱:レビュー · チェック · 利用状況i更新=最新バージョンをレジストリに公開した日i
Google Analytics MCP
GA4 MCP server for AI agents: schema discovery, server-side aggregation, analysis-ready defaults.
BibiGPT YouTube Video Summarizer
AI video summarizer: summarize and transcribe YouTube, Bilibili, TikTok and podcast videos.
作者のREADME
READMEを開く
作者のリポジトリから書かれたとおりにコピーしたものです。PopNx MCPは内容を確認・推奨していません。HTML、画像、スクリプトは取り除いています。リンクはこのサイトの外へ移動します。
Trendflow JS
A type-safe JavaScript/TypeScript library for querying and exporting Google Trends data. The JavaScript port of trendflow-py.
📖 Documentation: [trendflow.mory.dev/docs/js](https://trendflow.mory.dev/docs/js) — guides for both libraries, plus a hosted MCP server for ChatGPT, Claude, and Cursor.
- GitHub: https://github.com/dariomory/trendflow-js/
- npm package: https://www.npmjs.com/package/trendflow
- API reference: https://dariomory.github.io/trendflow-js/
- Python sibling: https://pypi.org/project/trendflow-py/
- Created by: [Dario Mory](https://mory.dev) | GitHub https://github.com/dariomory
- Free software: MIT License
Install
npm install trendflow
Requires Node.js 18+ (uses the global fetch). Ships ESM and CommonJS with bundled type declarations.
Usage
import { Client, Region, Timeframe, Resolution, SearchProperty, ExportFormat } from "trendflow";
// Initialize client (optional config) const tf = new Client({ language: "en", timeout: 10_000 });
// --- Const objects for type safety --- // Region.US, Region.GB, Region.DE ... (or any code: "US-CA", "807") // Timeframe.PAST_HOUR ... PAST_5_YEARS, ALL_TIME (or "2023-01-01 2023-06-30") // Resolution.COUNTRY, Resolution.REGION, Resolution.CITY // SearchProperty.WEB, IMAGES, NEWS, YOUTUBE, SHOPPING
// Fetch interest over time const data = await tf.interestOverTime( ["Python", "JavaScript", "Rust"], Timeframe.PAST_YEAR, Region.US, );
console.log(data.keywords); // ["Python", "JavaScript", "Rust"] console.log(data.granularity); // "weekly" console.log(data.points); // TrendPoint[] — { date: Date, scores: Record }
// Regional breakdown (region defaults to Region.US) const regional = await tf.interestByRegion("Python", Resolution.COUNTRY); for (const row of regional.rows) { console.log(row.label, row.value); }
// Trending searches right now (any country code, or omit for worldwide) const trending = await tf.trendingNow(Region.US); for (const item of trending.results) { console.log(item.title, item.growth, item.volume, item.traffic); // "fifa world cup 2026" 3650 6 "+3,650%" }
// Related queries (region defaults to worldwide) const related = await tf.relatedQueries("machine learning", { region: Region.GB }); for (const query of related.top) console.log(query.term, query.value); for (const query of related.rising) console.log(query.term, query.breakout);
// --- Narrowing a query --- // Every query method takes an optional category and search property, and any of them // accepts a custom date range and a sub-region or metro code in place of the named values.
// "jaguar" the car, on YouTube, in California, over the first half of 2023 const jaguar = await tf.interestOverTime(["jaguar"], "2023-01-01 2023-06-30", "US-CA", { category: 47, // Autos & Vehicles — disambiguates without needing a topic id searchProperty: SearchProperty.YOUTUBE, });
// --- Exports --- data.toArray(); // [{ date: Date, Python: 80, ... }] — plain objects, the JS answer to DataFrames data.toJSON(); // same rows with ISO 8601 date strings (also drives JSON.stringify) data.toCSV(); // CSV text
// Node.js only — writes UTF-8 to disk await data.export(ExportFormat.CSV, "trends.csv"); await data.export(ExportFormat.JSON, "trends.json");
Errors
Failed requests throw ResponseError, or TooManyRequestsError (a subclass) on HTTP 429. Both carry .status and the raw .response.
import { TooManyRequestsError } from "trendflow";
try { await tf.interestOverTime(["Python"], Timeframe.PAST_YEAR, Region.US); } catch (error) { if (error instanceof TooManyRequestsError) { // Google is rate-limiting this IP — back off and retry later. } }
Trending backends: RPC and RSS
Google exposes trending searches two ways. They are not interchangeable, so backend lets you pick:
"rpc" (batchexecute) | "rss" (feed) | |
|---|---|---|
| items | 50 | 10 |
| payload | ~2 KB JSON | ~21 KB XML |
| growth % and volume | ✅ | ❌ — buckets like "2000+" |
| news articles | ❌ | ✅ |
window selection | ✅ | ignored by Google |
| worldwide | ✅ | ❌ country only |
const rss = await tf.trendingNow(Region.US, { backend: "rss" });
rss.source; // "rss" rss.results[0].articles; // [{ title: "...", url: "https://...", source: "Buffalo News", picture: "https://..." }]
"auto" (the default) tries the RPC and falls back to the feed. The RPC comes first deliberately: it returns five times the items with real growth figures, so defaulting to RSS would quietly degrade results. Reach for "rss" when you want the articles — that is the one thing the RPC cannot give you — or as a second opinion if the RPC id ever goes stale.
Note that the feed is not a lighter path despite being a feed, and Google ignores hours, sort and count on it: it always returns the same 10 entries.
Topics and search suggestions
Google distinguishes a search term (the literal string) from a topic (the entity, in every spelling and language). suggestions() finds the topic; every query method already accepts one — pass the mid where you would pass a keyword.
const topics = await tf.suggestions("artificial intelligence");
// [{ mid: "/m/0mkz", title: "Artificial intelligence", type: "Professional field" }]
const data = await tf.interestOverTime( [topics[0].mid, "artificial intelligence"], Timeframe.PAST_YEAR, Region.US, ); // { "/m/0mkz": 62, "artificial intelligence": 1 }
That gap is the point: the topic scores 62 where the literal phrase scores 1, because it aggregates every phrasing and translation people actually search.
suggestions() needs no cookie and no proxy — it answers on IPs the widgetdata endpoints reject with 429, same as trendingNow(). type disambiguates same-name entities ("Nike" returns both the company and the goddess) and is null when Google omits it.
Rate limits
Google Trends aggressively rate-limits datacenter and shared IPs, so 429 is common even on your first request of the day. Two things matter:
- User-Agent. Google returns
429to the default agent strings Node HTTP clients send, no matter how few requests you have made. This library sends a browser User-Agent by default for exactly that reason — if you overrideheaders, keep a realistic one. - IP reputation. Once an IP is flagged, every request gets
429regardless of headers. Route through a residential proxy to recover.
Using a proxy pool
Pass a list of proxy URLs and the client rotates through them automatically, moving to the next one whenever a query is refused:
import { Client, Region, Timeframe } from "trendflow";
const tf = new Client({ proxies: [ "http://user:pass@gate.decodo.com:7000", "http://user:pass@gate.decodo.com:7000", ], maxProxyAttempts: 3, // defaults to the pool size, capped at 5 onProxyRotate: ({ attempt, error }) => console.warn(rotated after ${attempt}:, error), });
const data = await tf.interestOverTime(["Python"], Timeframe.PAST_YEAR, Region.US); console.log(tf.currentProxy); // the proxy that answered
Proxy support needs undici, an optional peer dependency — npm install undici. Entries are just URLs, so a pool can mix providers. Repeating one rotating gateway also works: each entry gets its own connection, so it lands on a fresh exit IP.
Rotation happens per query, not per request — this matters. Google binds the NID cookie and the widget token to the IP that requested them, so a single query must complete on one exit IP; sending the follow-up widgetdata call from a different IP earns an instant 429. The pool pins one proxy for the whole query and advances only on failure, re-seeding the cookie jar each time. For the same reason, point the pool at sticky sessions rather than per-request rotating endpoints if your provider offers the choice.
Rotation is skipped for errors a different IP cannot fix, such as a 404 or the UnknownRpcError raised when Google renames a batchexecute RPC id.
Where to get proxies
Residential proxies are what actually clears Google's 429. Verified against this library:
| Provider | Notes | Endpoint format |
|---|---|---|
| Decodo (formerly Smartproxy) | Cheapest entry tier; pay-as-you-go available. Used to verify this library's live tests. | http://user:pass@gate.decodo.com:7000 |
const tf = new Client({
proxies: ["http://user:pass@gate.decodo.com:7000"], });
Ask for sticky sessions when you sign up — per-request rotating endpoints break the cookie/token binding described above. Note that a shared residential pool can be exhausted for Google Trends specifically, in which case even a valid proxy returns 429; that is what maxProxyAttempts is for.
Bringing your own client
For logging, caching, or custom routing, pass a fetch instead (mutually exclusive with proxies — the library will tell you if you pass both):
import { ProxyAgent, fetch as undiciFetch } from "undici";
const agent = new ProxyAgent("http://user:pass@proxy.example.com:7000"); const tf = new Client({ fetch: ((input, init = {}) => undiciFetch(input, { ...init, dispatcher: agent })) as typeof globalThis.fetch, });
Browser / Next.js
Every method except export() works anywhere fetch does, but Google Trends sends no CORS headers — calls from browser JavaScript will be blocked. Use this library server-side (Route Handlers, Server Actions, API routes) and pass results to the client.
MCP server
An MCP server ships alongside the library as trendflow-mcp, so agents can query Google Trends directly. It's a separate package — the library keeps its zero runtime dependencies.
claude mcp add trendflow -- npx -y trendflow-mcp
Six tools (search_topics, get_interest_over_time, get_interest_by_region, get_related_queries, get_trending_now, research_trend) and two resources. See mcp/README.md.
Feature Parity
Current: trendflow-py 0.2.0 · trendflow 0.1.0. Versions are independent; each changelog cross-references the sibling release.
| Feature | Python — trendflow-py | JS — trendflow |
|---|---|---|
| Interest over time | ✅ | ✅ |
| Interest by region | ✅ | ✅ |
| Trending now | ✅ | ✅ |
| Trending growth % and volume | ✅ | ✅ |
| Trending for any country code | ✅ | ✅ |
| Trending news articles (RSS) | ✅ | ✅ |
| Selectable trending backend | ✅ |
冒頭だけを表示しています。続きはリポジトリで読めます