Query Fan-Out MCP for AI Search Optimisation
I built fanout-mcp because AI search doesn't work with keywords - it expands every question into dozens of semantic variants and cites whoever covers them. In today's post I explain Google's query fan-out research, how I adapted it into an MCP server you can run inside Claude, and what it found when I pointed it at my own writing.
I've been building a group of content optimisation tools for the past six months (some available on houtini's github , some coming soon). It's really clear that traditional keyword research is now quite broken and outdated for AI search. Not because keyword tools are bad at what they do - they're brilliant at finding interesting terms and approximate search volume, but, AI systems like ChatGPT and Perplexity don't work with keywords. They work with semantic query clusters.
Query Fan-Out runs as an MCP server inside Claude Desktop, so you'll need a Claude account. New to Claude? New accounts get a free week of Claude Code - the same Pro or Max plan covers Claude Desktop.
Because I'm a sim racing nerd, I'm going to use sim racing keywords throughout this article. Sorry!
When someone asks ChatGPT "what are good sim racing wheelbases under £500", it doesn't just look for that exact phrase in your content. It expands the query into dozens of variant queries: "budget direct drive wheels", "affordable wheelbases for beginners", "10Nm wheelbases under 500 pounds", "Fanatec vs Moza comparison under budget". Your content needs to address these semantic variants, not just the original query.
Traditional SEO tools can't map these variants. They're entity-blind and conversation-deaf (fair enough, they weren't designed for this and anyway, some of those ideas are 20 years old). So, I built something that provides a bit of guidance when you're rewriting a page: Query Fanout MCP.
Quick Navigation
The visibility crisis |
Google's fan-out research |
Prompts over neural networks |
Testing results |
Key findings |
Where this fits |
Setting it up |
Lessons learned |
Links & references
What We're Going to Cover
This is a technical explanation of query fan-out methodology and how I adapted it for content gap analysis:
- Google's query fanout patent and research methodology
- The eight query variant types and some testing results
- Why I chose LLM prompts over neural networks
- Real outcome data from my 6,491-word test article
- Default 5 types vs. all 8 types trade-offs
- Integration into my content optimisation workflow
What this doesn't cover: Traditional SEO keyword research, backlink strategies, or content writing techniques. This is about identifying gaps, not filling them.
The SEO Visibility Crisis
Sites perfectly optimised for Google are not quite "completely invisible to AI systems" (Gemini research, 2025) but they are getting closer all the time. Only 12% of URLs cited by AI tools overlap with Google's top 10 results, by the research doing the rounds when I first wrote this (late 2025). That's not to say that "traditional SEO techniques" aren't viable in AI search - they still form the basis of it. But we wouldn't be doing our jobs very well if we just decided that AI search wasn't a serious channel and that we needed some data on what works. You know - for when the only search tool in Google is AI mode.
When AI Overviews appear in Google search results, click-through rates for top-ranking pages fall off a cliff. Ahrefs measured a 34.5% drop when they first looked , and their December 2025 re-run puts it at 58%. Not because your content is bad, but because AI systems prioritise different signals: citations, entity mentions and semantic coverage. Backlinks still matter, to be fair - the retrieval step that builds the candidate pool leans on traditional rankings - but they buy you the audition rather than the part.
The new metrics are Answer Presence (are you cited?), Citation Share (how often?), and Passage Selection Frequency (which specific sections?). Traditional SEO tools measure none of these.
Google's Query Fan-Out Research
Google's patent US 11663201 B2 (Granted 2023) describes the core methodology for expanding queries into semantic variants using neural networks trained on query logs.
The patent identified eight distinct variant types:
- Equivalent: Same meaning, different phrasing ("best direct drive wheel" → "top DD wheelbase")
- Specification: Narrower focus ("sim racing cockpit" → "aluminum profile cockpit under £1000")
- Generalisation: Broader context ("Fanatec CSL DD" → "entry-level direct drive wheelbases")
- FollowUp: Natural conversation progression ("what's force feedback" → "how much torque do I need")
- Comparison: Entity relationships ("Moza R9 vs Fanatec CSL DD")
- Clarification: Disambiguation ("what does DD mean in sim racing")
- RelatedAspects: Connected topics ("wheelbase mounting options", "compatible steering wheels")
- Temporal: Time-dependent queries ("best wheelbases 2025", "is the R9 still supported")
Their approach used neural networks trained on massive query logs. Effective, but requires Google-scale infrastructure. I needed something lighter. Here's the paper .
Houtini's Adaptation: Prompts Over Neural Networks
I wanted to solve this problem with (powerful) tools that we now all have access to. Claude Desktop and MCP servers. The breakthrough was realising that Claude already understands query semantics well enough - the server calls Claude Sonnet 4 under the hood, and because the model pin lives in the server it gets a little better every time I bump it.
No need to train a custom model when enterprise LLMs are pretrained on trillions of parameters including search queries. I mean, it's interesting but I run several local LLMs here and the output is quite limiting sometimes.
My approach uses structured prompts with context signals alongside the keyword:
Intent context:
{
"intent": "shopping",
"specificity_preference": "balanced"
}
Temporal context:
{
"currentDate": "2025-12-15",
"season": "winter"
}
The LLM generates variants that feel natural, like something a human would search for, not algorithmic permutations.
Why this works:
- LLMs understand context (they know "budget wheelbase" implies different things to beginners vs experienced intent)
- No training data required (zero-shot generation - YOLO)
- Customisable per domain (I can tune specificity and variant types based on the domain, competitors and topic)
- Fast enough for production (4-5 seconds per query assessment)
The trade-off: slightly lower precision than Google's neural networks (my system scores 0.75/1.0 query realism vs Google's reported 0.85/1.0). But for content gap analysis, something I've been interested in since my Builtvisible days pretty decent.
Mike King at iPullRank got there first, I should say. His Qforia is a free, open-source fan-out simulator: give it a query and a Gemini API key and it shows you the synthetic queries an AI answer would probably run. The wider discipline now goes by GEO or AEO depending on who is selling it. Where fanout-mcp differs is what happens after the variants exist - it reads your page and scores coverage against each one, quoting the exact passage as evidence, which is the bit I wanted for content updates. If you want the citation-readiness angle on the same page, our GEO analyser does that side.
Testing Results: Sample
My testing ran against a 6,491-word sim racing buyer's guide covering sim racing for Playstation owners. Seven test scenarios covering different keyword intents and specificity levels. Here's what that looked like in the chat output:
Key Findings
Overall Coverage: 71/100 - Pretty solid actually!
Main Strengths:
- ✅ Excellent coverage of PlayStation compatibility issues (100%)
- ✅ Strong equipment recommendations across all price points
- ✅ Good ecosystem lock-in explanation (the Fanatec/Logitech reality)
- ✅ Budget breakdowns are comprehensive
Critical Gaps:
- No definition of sim racing itself - Assumes everyone knows what it is
- GT7 never explained - Mentions it everywhere but never says what it is
- Limited game coverage - Only GT7 + brief RENNSPORT mention
- Missing VR content - Zero coverage of PS5 VR racing support
- No calibration/settings guides - Mentions you need to adjust FF but not how
Interesting Insight: The keyword fan-out analysis shows you're actually covering the equivalent/specification variants well (best wheels, bundles, direct drive compatibility) but missing follow-up questions users naturally ask after reading:
- "How do I actually set this up?"
- "What settings should I use?"
- "What other games work besides GT7?"
Looks like I'm not such a bad writer myself! But there's work to do (isn't there always?). I like reports so, MCP is also inclined to generate an artifact / report for you - here's what that looks like:
Where This Fits in the Content Workflow
Query fan-out isn't a replacement for keyword research. It's the missing link between keyword data and actual content coverage (the technical side - crawl, Search Console, the fixes - is a different job, and I wrote that one up separately ). I really like this stuff for content updates, anything remotely laborious and repetitive; that's where your AI should be stepping up.
Traditional workflow:
- Keyword research (volume, competition)
- Write content
- Hope it ranks
My AI-optimised workflow:
- Keyword research (volume, competition)
- Query fan-out (semantic variants)
- Content gap analysis (what's missing)
- Write/update content (address gaps)
- Validate coverage (Self-RAG assessment)
My fanout-mcp server implements this as a single command:
npx @houtini/fanout-mcp@latest
Then call analyze_content_gap with a URL and optional keyword. It outputs an interactive dashboard showing:
- Generated query variants
- Coverage assessment per query
- Specific gaps identified (with exact sections that should address them)
- Quality metrics (realism, specificity, coverage accuracy)
How to Set Up the Fan-Out Query Analyser
Right, let's get this running. The setup is surprisingly straightforward - no cloning repositories or building from source required.
Prerequisites
You'll need three things:
- Claude Desktop (download from anthropic.com if you haven't got it)
- Anthropic API key (get one from console.anthropic.com )
- Node.js 18+ (but you probably have this already - I'm running v24+)
Quick Setup (5 Minutes)
The fastest way is using npx, which downloads and runs the package directly:
(Claude Desktop's Customize > Connectors screen handles directory and remote connectors these days; a local npx server like this one still goes in the config file, which is what the README documents.)
Step 1: Edit your Claude Desktop config
Location depends on your operating system:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
Open the file and add this to the mcpServers section:
{
"mcpServers": {
"fanout": {
"command": "npx",
"args": ["-y", "@houtini/fanout-mcp@latest"],
"env": {
"ANTHROPIC_API_KEY": "sk-ant-api03-your-key-here"
}
}
}
}
Important: Replace sk-ant-api03-your-key-here with your actual API key from console.anthropic.com, hopefully that's a bit obvious :-)
Step 2: Restart Claude Desktop
Completely quit and reopen the application. The MCP server loads on startup.
Step 3: Verify it works
In Claude Desktop, type:
List available tools You should see fanout:analyze_content_gap in the output. If you don't, check your config file for syntax errors (no trailing commas!).
Using Claude Code instead? It doesn't read claude_desktop_config.json, so register the server with one command:
claude mcp add -e ANTHROPIC_API_KEY=sk-ant-... -s user fanout -- npx -y @houtini/fanout-mcp@latest Then claude mcp get fanout should report Status: Connected.
What Each Function Does
The tool provides one main function: analyze_content_gap
Core parameters you'll use:
url(required) - The page to analysedepth(optional) - How many queries to generate:target_keyword(optional) - Enables fan-out mode with query variantsfocus_area(optional) - Narrow analysis to specific topic (e.g., "pricing", "installation")
Advanced parameters (you probably won't need these initially):
fan_out_types- Which variant types to generate (defaults to 5 most useful types)fan_out_only- Skip content analysis, just generate keyword variants (50% faster)context- Intent signals (shopping,research) and temporal context
Using the Tool
Basic content analysis (no keyword targeting):
Analyse https://your-site.com/article for query coverage gaps Claude generates queries based on your article structure and assesses coverage.
Keyword-targeted analysis (recommended for optimisation):
Analyze https://your-site.com/sim-racing-guide with target_keyword "direct drive racing wheels" This generates 15-25 keyword-specific query variants and checks coverage for each.
Quick scan (fastest option):
Quick analysis of https://your-site.com/pricing Generates only 5 queries, useful for rapid gap identification.
Focus on specific section:
Analyze https://your-site.com/installation-guide focusing on "setup process"
Narrows analysis to queries related to your focus area.
What You Get Back
Claude creates an interactive visual dashboard showing:
Coverage Summary:
- Overall score (0-100)
- Queries fully covered (90-100% confidence)
- Queries partially covered (40-89% confidence)
- Gaps identified (0-39% confidence)
Query-by-Query Assessment:
For each query, you'll see:
- Coverage status (✓ Covered, ⚠ Partial, ✗ Gap)
- Confidence level (percentage)
- Evidence quotes (exact text from your content)
- Location (which section addresses this)
- Recommendations (what to add/improve)
Example output for a covered query:
Query: "best PS5 racing wheels under £300"
Status: ✓ COVERED (95% confidence)
Evidence: "For most PlayStation owners getting into sim racing,
I'd recommend starting with the Logitech G29. It's proven kit,
widely available, and you can sell it easily if sim racing doesn't
stick. Current Amazon pricing sits at £200..."
Location: Entry Level: The £200-300 Sweet Spot Example output for a gap:
Query: "wireless PS5 racing wheel options"
Status: ✗ GAP (0% confidence)
Gap: No wireless racing wheel options discussed
Recommendation: Add section on wireless PS5 racing wheel options if any exist,
or explain why wired is standard for sim racing Plus a detailed markdown report with all data if you need to save or share results.
Common Use Cases
1. Pre-publish check:
Quick analysis of https://your-site.com/draft-article Identifies obvious gaps before publishing.
2. Competitive research:
Analyze https://competitor.com/article with target_keyword "your target keyword"
Discover what queries they're covering that you're not, collect a bunch of urls that feature well in AI search to find out why.
3. Content refresh:
Analyze https://your-site.com/old-article with target_keyword "primary keyword"
Find coverage gaps that have emerged since you last updated.
4. Topic exploration:
Comprehensive analysis of https://your-site.com/comprehensive-guide
Runs every potential query variant (30 queries, useful for pillar content).
Troubleshooting Common Issues
"Tool not found" error:
- Did you restart Claude Desktop after editing the config?
- Check
claude_desktop_config.jsonfor syntax errors (no trailing commas) - Verify the API key is correctly set
Slow performance:
- This is normal! Analysis runs at ~4-5 seconds per query
- Use
quickdepth for faster results - Standard analysis (15 queries) takes ~75 seconds - grab a coffee
Low coverage scores:
- Expected behaviour: Fan-out variants typically score 57-64% coverage
- This is intentional - the tool explores broader query space
- Focus on high-priority gaps in the recommendations
If you want the methodology in more depth, the README's research section explains how query fan-out works under the hood.
Lessons Learned
Context-awareness is critical. Early versions generated technically accurate variants that no human would search for. I made this mistake early on - ignoring intent signals. Adding intent and temporal signals improved realism scores from 0.62 to 0.75. This is done for you in the MCP.
Linear scaling is acceptable. I initially worried that 4-5 seconds per query would be too slow. In practice, analysing 20-30 variants (120-150 seconds) is reasonable for a comprehensive gap analysis. Background processing makes this invisible to users!
Quality metrics matter more than quantity. I optimised for realism and specificity rather than generating hundreds of variants. Better to assess 20 realistic queries than 100 algorithmic permutations.
Self-RAG prevents hallucinations. Coverage assessment must quote actual text from the content. This eliminated false positives where the system claimed coverage that didn't exist.
E-E-A-T signals remain dominant. The highest-cited content in AI search results demonstrates history of expertise, not just optimisation tricks. One large citation analysis puts the correlation between entity mentions (tools, people, companies) and citation frequency at 0.334 - stronger than the same study found for backlinks or keyword density.
Links & References
GitHub Repository:
https://github.com/houtini-ai/fanout-mcp
README (methodology and research notes):
https://github.com/houtini-ai/fanout-mcp#readme
NPM Package:
https://www.npmjs.com/package/@houtini/fanout-mcp
Google Research:
- Patent US 11663201 B2 (Query Expansion Systems)
Performance Note: Running this analysis on your own content reveals gaps you didn't know existed. I found 31% coverage gaps in what I thought was comprehensive content. The variants AI systems look for are different from what keyword tools suggest. This is very cool - but a report can take time. This is why we use an anthropic API key.
Try it yourself: npx @houtini/fanout-mcp@latest and let me know how you get on!
Related Posts
Continue reading.
- ExplainerWhat is a Marketing Engineer (and do you need one)?31 Aug 2026
- AI WorkflowsDynamically updating infographics and content (so you don't have to)28 Aug 2026
- Case StudiesThe parts Shopify Plus B2B doesn't do (and how we built them)28 Aug 2026
- Local AIvLLM settings for a pair of RTX 4090s: the flags I run for twelve local models, and why26 Aug 2026
- StrategyThe 26%: what the companies actually making money from AI do differently26 Aug 2026
- AI ToolsWhich AI model pitches the best content ideas?23 Aug 2026