// diagnose
Search Demand Reader
Use when the user wants to know what people search for in their category and where the demand is going unmet, using their own Search Console data rather than an estimated keyword tool - reading a Queries export by intent, grouping it into topics, finding the topics they already appear for on page two or worse, queries split across their own pages, the branded share of their traffic, and rival-brand searches they show up in. Also use when the user mentions keyword research, search demand, Search Console queries, keyword gaps, cannibalisation, branded vs non-branded, or "what should we write next". Never estimates a search volume it cannot see.
npx skills add sarojkjha/aaj-marketing-skills --skill search-demand-readerClaude Code
/plugin marketplace add sarojkjha/aaj-marketing-skills/plugin install aaj-marketing-skills@aajOpenAI Codex
codex plugin marketplace add sarojkjha/aaj-marketing-skillscodex plugin add aaj-marketing-skills@aajClaude or ChatGPT — no install
Add this as a custom connector:
https://aaj-engines-mcp.sarojkjha10.workers.dev/mcp// when to use it
Use when the user wants to know what people search for in their category and where the demand is going unmet, using their own Search Console data rather than an estimated keyword tool - reading a Queries export by intent, grouping it into topics, finding the topics they already appear for on page two or worse, queries split across their own pages, the branded share of their traffic, and rival-brand searches they show up in. Also use when the user mentions keyword research, search demand, Search Console queries, keyword gaps, cannibalisation, branded vs non-branded, or "what should we write next". Never estimates a search volume it cannot see.
// what you give
A Search Console Queries export (query, clicks, impressions, average position, and the page where available), your brand words, and optionally rival brand words
// what you get
Impressions and clicks by intent; topics grouped by their most common word with position and pages; the gaps you already appear for past position 10; queries split across two of your pages; the branded share of clicks; rival-brand searches you appear in; findings and a verdict naming the first topic to build or refresh
Engine spec
// decision it supports
Which topics are people already finding us for where better content would win more clicks?
// inputs
A Search Console Queries export (query, clicks, impressions, average position, and the page where available), your brand words, and optionally rival brand words
// output
Impressions and clicks by intent; topics grouped by their most common word with position and pages; the gaps you already appear for past position 10; queries split across two of your pages; the branded share of clicks; rival-brand searches you appear in; findings and a verdict naming the first topic to build or refresh
// acts or analyzes
Analyzes onlyMakes no network calls, writes no files and changes nothing in your tools.
// where your information goes
| How you run it | Where your inputs go |
|---|---|
| Skill installed in your agent, or the local MCP server | The engine runs on your machine and AAJ receives nothing. Your AI agent still sends what you give it to its model provider (Anthropic, OpenAI and so on), under your own account's terms. |
| Hosted MCP server | Your agent's model provider, as above, plus AAJ's server on Cloudflare, which receives the engine inputs over HTTPS, runs them in memory and keeps no copy. Cloudflare keeps error logs (no inputs) for up to 7 days. |
No engine needs customer names, emails or other personal data; leave them out.
// limitations
- It sees only queries where your pages appeared. It cannot size a market or show demand you never appeared for, and impressions are not search volume.
- Topics group queries by their most common word. This is coarse on purpose; read the top queries under a topic before acting on it.
- Branded share depends on the brand words you list. Leave one out and branded searches are counted as non-branded demand.
- Cannibalisation needs the page for each query; without it none can be found. The 200-impression, position-10 and 20%-split cut-offs are this engine's rules.
// review before acting
// setup
npx skills add sarojkjha/aaj-marketing-skills --skill search-demand-readerhttps://aaj-engines-mcp.sarojkjha10.workers.dev/mcpAgents listed: Claude Code, Cursor, OpenAI Codex, Windsurf, Cline. Tested and recorded: Claude Code.
Search Demand Reader
Keyword tools estimate. Search Console counts. The counts are limited to searches where one of your pages appeared, and that limit is the point: every query in the export is one you can already win more of, because Google has already shown you for it. This engine reads that export the way a content lead would with a free afternoon: which intents your traffic serves, which topics carry the demand, where you rank past page one for something people search a lot, and where two of your own pages are fighting over one query.
When to use
Before planning content for a quarter, when deciding between a new page and a refresh, when the founder asks "what do people search for", and when branded traffic seems to be all there is.
Not for a site with no Search Console history, and not for sizing a market: a query you never
appeared for is not in this data and the engine will not guess it. For the demand you cannot see,
use interviews, review-mining, and the sizing method in market-sizing.
Before you start
- Read the brand/product context first (
.agents/product-marketing.md) for the brand words, rival names and the commercial topics that matter. - Export Queries for at least three months. Performance > Search results > Queries, all rows. Add the Page dimension if the interface lets you export query-and-page pairs; otherwise export Queries and, separately, filter by page for the few topics you care about.
- List your brand words (name, misspellings, product names) and the rival brands buyers compare you with.
Method
Intent is read from modifier words, in order: a brand word makes it branded; a rival's name makes it rival-brand; "demo", "trial", "buy", "pricing" and the like make it transactional; "best", "vs", "alternative", "software", "tool" make it commercial; "how", "what", "guide", "template" make it informational; anything else is unqualified, which means the words did not say, not that the engine guessed.
Topics are groups of queries sharing their most common content word, after light stemming. This is coarse on purpose: a word-level grouping you can check beats a clustering you cannot. Read the top queries under each topic before acting on it.
Gaps you already appear for. A topic with 200+ impressions (engine rule) whose impression-weighted average position is worse than 10 (engine rule). Google shows you for it and nobody clicks because you are on page two. These are the cheapest content wins on the list, because the search intent is proven and the page often exists.
Cannibalisation. A query where two or more of your pages each take 20% or more of its impressions (engine rule). Google is choosing between your pages, and the ranking suffers for it.
Branded share of clicks says how much of your organic traffic is people who already knew you. There is no right number; a rising non-branded share is the sign the content programme is working.
Rival-brand searches you appear in are comparison intent you have already earned a place in;
comparison-pages is the next step.
Workflow
Step 1 - Export, run, read the verdict.
Step 2 - Take the largest gap. Look at its top queries. If one page already holds them, refresh
it with seo-content-brief aimed at that query set. If no page is built for the topic, brief a new
one. Do not build a page per query.
Step 3 - Resolve cannibalisation by choosing the page that should win and pointing the other at it (a link, a consolidation, or a canonical), then watch the query's position next quarter.
Step 4 - Put the rival-brand queries into comparison-pages.
Step 5 - Put the rest in the calendar (content-calendar-planning), gaps before new ideas.
Step 6 - Re-run quarterly and track the non-branded share of clicks and the number of gaps.
Run the tool
node resources/search-demand.js --demo
node resources/search-demand.js '{"brand":["acme"],"queries":[{"query":"crm for dentists","clicks":3,"impressions":400,"position":12.1,"page":"/blog/dental-crm"}]}'
node resources/search-demand.js --help
run({ brand, rivals, queries }) returns totals, intents, topics, gaps, cannibalisation,
rival-brand queries, findings and a verdict. Deterministic, offline, no dependencies.
Present the result
- The verdict and the branded share of clicks.
- Intent table: queries, impressions and clicks by intent.
- Gaps, each with its top queries and the page that currently appears.
- Cannibalised queries with the page split.
- Rival-brand searches you appear in.
- Topics table (top 15) for the broader picture.
- Findings, especially missing pages or positions, which limit what can be read.
Guardrails & common mistakes
- Never present an impression count as search volume. It is the number of times your page was shown, which is at most the volume and usually far less.
- Never fill the gap you cannot see. If a topic is absent from the export, say that the data cannot speak to it rather than estimate.
- Unqualified is a category, not a guess. Read those queries by hand before assigning intent.
- One page per topic, not per query. The gap list groups queries for a reason.
- Branded share has no benchmark. Compare it with your own last quarter.
- Three months minimum. A month of queries is mostly noise for a small site.
Related AAJ resources
- Briefing the page that closes a gap: https://aajconsult.com/tools/content-brief-builder
- Sizing the market from accounts rather than searches: https://aajconsult.com/tools/bottom-up-market-sizer
- Where search data fits among other sources: https://aajconsult.com/playbooks/market-research-playbook
- The content system this feeds: https://aajconsult.com/playbooks/content-creation-playbook
Related skills
content-decay- the same export, read page by page over timeseo-content-brief- the brief for the gap pagecontent-calendar-planning- scheduling gaps and refreshesmarket-sizing- demand you cannot see in search dataaaj-programmatic-seo- when a gap is a template set, not a pagereview-mining- the language of the demand, from reviews
// faq
// install
npx skills add sarojkjha/aaj-marketing-skills --skill search-demand-reader// worked example
Get the worked example for Search Demand Reader
One email. The filled-in config, the output, and how to read it.
// human in the loop
Need a human in the loop?
AAJ builds the strategies, tools, and playbooks these skills are made of — with engagements for growth-stage and enterprise teams.
