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

DiagnoseengineStarter
bash
$npx skills add sarojkjha/aaj-marketing-skills --skill search-demand-reader
Or run it in Claude or ChatGPT through the AAJ engines connector

Claude Code

/plugin marketplace add sarojkjha/aaj-marketing-skills
/plugin install aaj-marketing-skills@aaj

OpenAI Codex

codex plugin marketplace add sarojkjha/aaj-marketing-skills
codex plugin add aaj-marketing-skills@aaj

Claude or ChatGPT — no install

Add this as a custom connector:

https://aaj-engines-mcp.sarojkjha10.workers.dev/mcp
Recipes: vendor data in, a verdict out

// 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 only

Makes no network calls, writes no files and changes nothing in your tools.

// where your information goes

How you run itWhere your inputs go
Skill installed in your agent, or the local MCP serverThe 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 serverYour 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

The content or SEO lead checks the export covers at least three months and includes pages, confirms the brand and rival words, and reads each gap's top queries before briefing a page.

// setup

install
$npx skills add sarojkjha/aaj-marketing-skills --skill search-demand-reader
hosted mcp
$https://aaj-engines-mcp.sarojkjha10.workers.dev/mcp

Agents listed: Claude Code, Cursor, OpenAI Codex, Windsurf, Cline. Tested and recorded: Claude Code.

Full spec on GitHub

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

  1. Read the brand/product context first (.agents/product-marketing.md) for the brand words, rival names and the commercial topics that matter.
  2. 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.
  3. 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

  1. The verdict and the branded share of clicks.
  2. Intent table: queries, impressions and clicks by intent.
  3. Gaps, each with its top queries and the page that currently appears.
  4. Cannibalised queries with the page split.
  5. Rival-brand searches you appear in.
  6. Topics table (top 15) for the broader picture.
  7. 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.
  • content-decay - the same export, read page by page over time
  • seo-content-brief - the brief for the gap page
  • content-calendar-planning - scheduling gaps and refreshes
  • market-sizing - demand you cannot see in search data
  • aaj-programmatic-seo - when a gap is a template set, not a page
  • review-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.

No spam. Unsubscribe anytime.

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