Skip to main content
Glama
jain-eshan

Google Trends MCP

by jain-eshan

Market Signal MCP

A local MCP server + Claude Code skill for researching whether a startup idea, product, or topic shows real market signal — search interest, reading interest, community sentiment, builder activity, and company registration — for case competitions and startup-idea validation.

Started as a single-source Google Trends wrapper; evolved into a multi-source signal aggregator with token-conscious defaults and a real eval suite, so it's something you can trust the output of, not just a demo. No database, no config file beyond optional API tokens for the tools that need them.

/market-signal — the actual product

The 9 raw tools below return structured data with no interpretation. The .claude/skills/market-signal/SKILL.md skill is where the judgment happens — and it's a conversation, not a one-shot command: it scopes the request, researches with the grounded tools plus live web search, writes a fixed-format SIGNAL REPORT so results are comparable across ideas and across sessions, then talks through what's real, what's noise, and whether it changes your plan.

/market-signal AI resume builder for Indian college students

Real output, from a live run against Trends + Wikipedia:

SIGNAL REPORT
════════════════════════════════════════════════════
Idea:            AI resume builder for Indian college students
Verdict:         MODERATE_SIGNAL
Confidence:      MEDIUM (3 sources, 12mo default window)

── Google Trends (interest_over_time + related_queries, India, 12mo) ──
"AI resume builder" holds steady in the high-30s/40s over the last 90 days
(most recent point isPartial - this week isn't finished yet, don't read the
dip as real). Top related query is generic ("resume ai free") - this space
isn't short on competitors already using the obvious framing. One rising
query, "jobsuit ai", spikes to an extreme relative value - worth a manual
check on whether that's a real emerging competitor or a data artifact.

── Wikipedia (Applicant_tracking_system pageviews) ──
Steady ~4,000-4,900 monthly views for most of the window, with a step up in
Dec 2025 (6,763) - no clear correlated spike with the Trends rising-query
signal. Reading interest in "how ATS works" isn't obviously accelerating
alongside search interest in resume tools.

Caveats:
- Default tier only - no Reddit/HN/Product Hunt signal in this run.
- The "jobsuit ai" rising-query spike is unverified from this data alone.
- Wikipedia's Sept 2026 figure (735) is a partial month, not a real drop.

Sources used:    interest_over_time, related_queries, wikipedia_pageviews
Tokens spent:    ~620 (default tier)
════════════════════════════════════════════════════
Pitch line: "Demand for AI resume tools is steady but crowded with generic
entrants - the real question worth digging into next is who's actually
complaining about existing tools, which needs the --deep tier to answer."

That report is still the fixed core of every run — but it's not the whole flow anymore:

  • Scopes before researching. Asks at most 2 clarifying questions, and only when the request is genuinely ambiguous — a request that already states the decision, topic, and stakes gets no questions at all.

  • Blends grounded data with live web search. The tools above give quantitative signal; native web search adds qualitative context (competitor mentions, news, forum chatter), cited, never turned into a fabricated confidence score.

  • Structures a competitive landscape when there's one to show. Three or more named competitors surfaced by web search get grouped into a Differentiation Landscape (business-model archetype, funding, website) instead of loose prose.

  • Handles multi-sided ideas entity-by-entity. An idea naming 2+ distinct impacted stakeholders (e.g. a marketplace's supply and demand sides) gets researched and verdicted per entity — capped at 3, never a numeric score — then closes with an elevator pitch for whichever entity has the strongest signal.

  • Can render a shareable HTML version. Ask for something "presentable" or name a non-technical recipient, and the report publishes as a page instead of staying chat-only text.

  • Stays out of pricing/segment/business-model territory. If a request drifts there, it hands off to /idea-validator or /office-hours when either is installed, or asks one pointed question and stops if neither is.

After the report, it opens a real back-and-forth — what's real, what's noise, does this change your plan — capped at 2 exchanges. Every run is appended to a local history file; researching a similar idea again surfaces a Prior check: line citing your earlier verdict, and a substantive answer to "does this change your plan" gets logged too, as outcome.

Add --deep to also pull Reddit + Hacker News/Product Hunt (community and builder-activity signal, at higher token cost — see Tools below).

Related MCP server: Google Trends MCP Server

Tools

All 9 tools accept response_format="concise" (default — truncated, rounded, token-conscious) or "full" (complete, unrounded). /market-signal calls them itself; you can also call any tool directly.

Default tier (no credentials needed):

interest_over_time(keywords, timeframe="today 12-m", geo="IN", response_format="concise")

Relative Google search interest (0–100) over time for up to 5 keywords. concise returns the most recent 90 days.

Top and rising related search queries. A rising value of 5000% is Google's "Breakout" marker (explosive growth from near-zero), not a literal percentage. concise returns the top 10 of each.

Same as related_queries, but topic clusters instead of raw query strings.

interest_by_region(keyword, timeframe="today 12-m", geo="IN", response_format="concise")

Search interest by state/region. concise returns the top 10 regions by interest.

Today's top trending searches for a country. Known limitation: currently fails with HTTP 404 — Google retired the legacy endpoint this depends on. Fails cleanly with a readable error string; the other 8 tools are unaffected.

wikipedia_pageviews(article, timeframe="P1Y", response_format="concise")

Monthly Wikipedia pageview counts — a free, no-auth reading/reference-interest signal that complements Trends' search-interest signal. concise returns the last 12 months.

--deep tier (requires free credentials):

reddit_signal(query, subreddits=None, limit=25)

Qualitative community signal via Reddit search. Requires a free Reddit app — create one at https://www.reddit.com/prefs/apps (type "script") and set REDDIT_CLIENT_ID / REDDIT_CLIENT_SECRET. As of 2026-09-07, Reddit requires manual approval for new apps (self-service registration closed in late 2025) — expect a wait, not instant signup. Fully optional: --deep works fine without it, and this tool degrades to a clear setup message rather than erroring if unconfigured.

builder_activity(query)

Builder/launch-activity signal: Hacker News (Algolia search, no auth) + Product Hunt (requires a free developer token — create one at https://api.producthunt.com/v2/oauth/applications and set PRODUCTHUNT_TOKEN). Both hn and product_hunt are always present as lists; HN works regardless of whether the PH token is set.

Opt-in (not part of either tier — called only when a query names a specific company):

company_registration(name, jurisdiction=None)

Company registration lookup (incorporation date, status, company number) via OpenCorporates. Scope note: registration facts only, not funding/valuation/traction data — no free API exists for that (Tracxn, Crunchbase, and similar are sales-gated enterprise products; we looked). Requires a free OpenCorporates API token — register at https://opencorporates.com/api_accounts/new and set OPENCORPORATES_API_TOKEN. Free tier is roughly 50 requests/day, 200/month.

All tools catch failures (rate limits, missing credentials, network errors) and return a plain error string instead of crashing.

Setup

Recommended — install as a Claude Code Plugin. Two commands, no cloning, no manual path-finding. Run these inside any Claude Code session:

/plugin marketplace add jain-eshan/market-signal-mcp
/plugin install market-signal

Start a new Claude Code conversation after installing — sessions already running won't pick up a newly added plugin. Check it connected:

claude mcp list

You should see market-signal listed as ✔ Connected with 9 tools. Then run /market-signal <your idea> (add --deep for the community/builder tier).

Optional — set any of these before installing if you want the corresponding tool to work (all degrade gracefully if unset):

export REDDIT_CLIENT_ID=...
export REDDIT_CLIENT_SECRET=...
export PRODUCTHUNT_TOKEN=...
export OPENCORPORATES_API_TOKEN=...

Alternative — manual clone, if you want to read or modify the code:

git clone https://github.com/jain-eshan/market-signal-mcp.git
cd market-signal-mcp
uv sync
claude mcp add market-signal -- uv run --directory "$(pwd)" server.py

Same verification and env vars as above apply to this path too.

Evals

This isn't just an API wrapper — it has a real eval suite, because "does the tool exist" and "does it produce a trustworthy answer" are different questions.

Layer

What it checks

Status

Contract tests (tests/)

Every tool's output matches its documented schema; response_format contract holds; recorded fixtures, no live network

✅ 15/15 passing in CI

Structural report checks (tests/eval/test_report_structure.py)

Every SIGNAL REPORT has all 8 required fields, a valid verdict enum, a Caveats section, under budget — includes a 6-way mutation test proving the checks actually catch violations

✅ 8/8 passing in CI

Tool-selection eval (tests/eval/run_tool_selection.py)

Does /market-signal call the right tier of tools for a query (Tool Correctness) without calling extras (Tool-Calling Efficiency) — 16 labeled queries

⚠️ Built, harness logic unit-verified (stream-json tool-call parsing confirmed against a simulated transcript). Not run end-to-end: the claude CLI on the machine this was built on has an expired OAuth session, and re-authenticating requires an interactive browser login this environment can't do. Run it yourself once claude is logged in: uv run python tests/eval/run_tool_selection.py

Output-quality eval (tests/eval/run_report_quality_judge.py, rubric.md, gold_answers.jsonl)

Is the report's verdict actually correct, free of hallucinated numbers, and does it name the real caveats — 5 gold-labeled queries, LLM-as-judge

⚠️ Same gap as above — rubric and gold answers are real and committed. Run: uv run python tests/eval/run_report_quality_judge.py

Both eval scripts run entirely through claude -p (Claude Code's own headless CLI, --mcp-config pointed at this repo's server.py) — no separate LLM provider API key, unlike an earlier version of this eval built on the mcp-eval framework. A tool meant to live inside Claude Code should use Claude Code's own capability, the same way this project's self-update check and other tooling lean on already-authenticated CLIs rather than holding credentials of their own.

CI runs the always-green contract + structural suites on every push: test. The two claude -p-driven evals aren't in CI (a runner has no authenticated claude CLI) — run them locally from a logged-in machine.

Design notes

  • Data only in the server, judgment only in the skill. Every tool returns raw structured data — the verdict, caveats, and pitch line all get decided in .claude/skills/market-signal/SKILL.md, not baked into server.py. This keeps the server simple and lets the skill's judgment evolve independently.

  • Token-conscious by default. response_format="concise" (the default) truncates and rounds; the default research tier costs ~600-1000 tokens, --deep ~2500-3500 — both measured, not estimated, against real API responses.

  • Self-updating awareness, not self-updating. A cached, throttled (24h) check compares your local VERSION against GitHub and tells you if a newer one exists — it doesn't modify your install.

  • Remembers what you've researched. Every run appends to ~/.config/market-signal-mcp/history.jsonl; researching something similar again surfaces what you found last time.

  • The guardrail hands off, it doesn't absorb. When a request drifts into segment/pricing/business-model territory, the skill either calls a real sibling skill (/idea-validator, /office-hours) or asks one question and stops — it never grows a second synthesis engine of its own.

Known limitations

  • trending_now is broken upstream (see Tools) — not fixable here.

  • company_registration covers registration facts only, never funding/traction/valuation data — no free API exists for that.

  • The self-update check notifies only; it does not modify your local install.

  • reddit_signal, the Product Hunt half of builder_activity, and company_registration's success path were built and their error/setup paths verified live, but their successful credentialed calls haven't been verified end-to-end — no API tokens were available while building this. If you set the corresponding env var and hit an issue, please file one.

  • Reddit's self-service app registration is closed (see Tools) — getting reddit_signal working involves a manual approval queue, not instant signup. Don't count on it for a same-day setup.

  • The tool-selection and output-quality evals (see Evals) are built and their parsing/harness logic verified, but not yet run end-to-end — the claude CLI needs a logged-in session, which wasn't available while building this.

  • The guardrail's handoff to /idea-validator was verified live (it receives the drifted question correctly); the /office-hours handoff and the shareable HTML rendering (which needs the Artifact tool) haven't been verified end-to-end yet.

License

MIT — see LICENSE.

Available Tools

5 tools
interest_by_regionA

Search interest for a keyword broken down by state/region within the given geo.

Args: keyword: a single search term. timeframe: pytrends timeframe string, e.g. "today 12-m". geo: ISO country code (e.g. "IN"), or "" for worldwide.

Returns: A list of records, one per state/region within the specified geo, each containing: - "geoName": the name of the state or region (e.g. "Maharashtra", "Delhi", "Karnataka" for India) - A column with the keyword name as the key: relative search interest (0-100 scale) for that region. Higher values indicate higher relative interest in that region compared to others in the same country. This is Google Trends' standard region-relative scale.

ParametersJSON Schema
NameRequiredDescriptionDefault
geoNoIN
keywordYes
timeframeNotoday 12-m

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden. It discloses the return shape (list of records with geoName and keyword column), explains the 0-100 relative scale, and notes that values are region-relative. This gives an agent a concrete expectation of the output's meaning. It does not mention side effects, but as a 'search' operation it is implicitly non-mutating. This level of disclosure is solid for a read-only retrieval tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a well-organized docstring with a purpose line, Args section, and Returns section. It avoids fluff, and the key scoping constraint is front-loaded. It is slightly longer than strictly necessary (e.g., repeating the 0-100 scale), but every sentence adds useful information, so it earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 3 parameters, no output schema, and no annotations, this description is quite complete. It covers parameter formats, return structure, and the meaning of the interest scale. One minor gap is that for a worldwide geo, it is not explicitly clarified that records will be per country rather than per state/region, but this is a minor ambiguity given the phrase 'state/region within the specified geo.'

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, and the description fully compensates. It defines 'keyword' as a single search term, 'timeframe' with an example format, and 'geo' with ISO code and 'worldwide' option, plus a default. All three parameters are explained beyond the schema, which only lists names and types. This is exemplary.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence clearly states the action ('Search interest for a keyword') and the resource/scope ('broken down by state/region within the given geo'). This distinguishes it from siblings like interest_over_time (time series) and related_queries/topics (associations). The purpose is unambiguous and actionable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies a use case (regional breakdown of interest) and provides parameter constraints, but it does not explicitly mention when not to use this tool or name alternative tools. It says 'within the given geo' which hints at context, but there is no direct comparison to siblings. Thus, usage guidance is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

interest_over_timeA

Relative Google search interest (0-100) over time for up to 5 keywords, compared side by side.

Args: keywords: 1-5 search terms to compare. Only the first 5 are used; additional keywords are silently dropped. timeframe: pytrends timeframe string, e.g. "today 12-m", "today 5-y", "now 7-d", or "YYYY-MM-DD YYYY-MM-DD". geo: ISO country code (e.g. "IN", "US"), or "" for worldwide.

Returns: A list of records, one per date, each containing: - "date": ISO date string - "isPartial": boolean indicating if the time period is incomplete (True for the most recent period) - One numeric key per keyword (0-100 relative interest value)

ParametersJSON Schema
NameRequiredDescriptionDefault
geoNoIN
keywordsYes
timeframeNotoday 12-m

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses important behaviors: it notes that only the first 5 keywords are used and additional ones are silently dropped, and it explains the 'isPartial' field indicating incomplete time periods. Since no annotations are provided, the description carries the full burden and adequately covers these behavioral nuances. It does not address rate limits or authentication, but for a read-only tool this is acceptable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear Args and Returns sections, front-loads the core purpose, and uses concise bullet points. Every sentence adds information, such as the maximum keyword count and return fields, without unnecessary filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given there is no output schema and no annotations, the description compensates by fully specifying the return format (date, isPartial, numeric per-keyword values) and parameter constraints. It provides everything an agent needs to call the tool correctly, including examples and edge cases, making it contextually complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has minimal descriptions (0% coverage), but the description adds extensive semantic detail: keyword limit and silent drop behavior, example timeframe formats, and the meaning of an empty geo string. This far exceeds the bare schema, making parameter semantics highly clear.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns relative Google search interest (0-100) over time for up to 5 keywords compared side by side. This is distinct from siblings like related_queries or interest_by_region, which focus on different dimensions. The specific verb and resource make the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description presents a clear context (temporal interest comparison) but does not explicitly state when to use it over sibling tools. It provides parameter details but no guidance on selecting this tool versus related_queries or interest_by_region. The intended use is implied by the description, not explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 5 tool updatesv0.1.0
    • First observedinterest_by_region
    • First observedinterest_over_time
    • First observedrelated_queries
    • First observedrelated_topics
    • First observedtrending_now

TDQS

A4.2/5.0

Scored across 5 tools

Disambiguation5/5

Each tool targets a distinct aspect of Google Trends data: time series, related queries, related topics, regional breakdown, and trending now. Even the two 'related' tools are clearly separated by query strings vs topic clusters, so there's no ambiguity in selecting the right tool.

Naming Consistency4/5

All tool names use snake_case and are descriptive, but they don't follow a unified verb-noun pattern. 'interest_over_time' and 'interest_by_region' are noun phrases, 'related_queries' and 'related_topics' are adjective-noun, and 'trending_now' is verb-adverb. Despite this slight mix, the naming is intuitive and predictable.

Tool Count5/5

Five tools is well-scoped for a Google Trends server, covering the core data endpoints without redundancy. Each tool serves a clear purpose, and the count is within the ideal range for a focused integration.

Completeness4/5

The toolkit covers the essential Google Trends operations: time series, related queries/topics, regional interest, and trending searches. Minor gaps exist, such as no multi-keyword comparison for related data or a dedicated city-level breakdown, but the core workflows are fully supported.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers