GEO Citation Tracker: MCP Pipeline
Track which AI models cite your brand. Daily pipeline: query ChatGPT, Perplexity, Gemini via search API, diff against yesterday, alert on changes.
A GEO citation tracker monitors which queries your brand gets cited in AI Overviews and other generative search features. Build one with a search API that returns AI Overview data alongside organic results, a daily scan pipeline for target queries, and alerts when citation status changes.
Why citation tracking matters
AI Overviews now appear for over 30% of Google queries. Being cited in an AI Overview drives brand visibility even when users do not click through. Tracking which queries cite your domain and which cite competitors is the new rank tracking.
Architecture
- Define 10-50 target queries that matter for your business
- Query each daily with AI Overview data enabled
- Parse citations from AI Overview responses
- Store results in SQLite or PostgreSQL
- Alert on changes (new citations, lost citations, competitor gains)
Build the scanner
import os, requests, json, sqlite3
from datetime import date
H = {"x-api-key": os.environ["SCAVIO_API_KEY"],
"Content-Type": "application/json"}
DB = sqlite3.connect("citations.db")
DB.execute("""CREATE TABLE IF NOT EXISTS citations (
date TEXT, query TEXT, domain TEXT, in_organic INTEGER,
organic_position INTEGER, in_ai_overview INTEGER)""")
TARGET_QUERIES = [
"best project management tool 2026",
"project management software comparison",
"alternative to asana 2026",
]
MY_DOMAIN = "myproduct.com"
def scan_citations():
today = date.today().isoformat()
for query in TARGET_QUERIES:
resp = requests.post(
"https://api.scavio.dev/api/v1/search",
headers=H,
json={"query": query, "country_code": "us",
"include_ai_overview": True},
)
data = resp.json()
organic = data.get("organic_results", [])
ai_overview = str(data.get("ai_overview", {}))
position = next(
(i + 1 for i, r in enumerate(organic)
if MY_DOMAIN in r.get("link", "")), 0)
in_aio = 1 if MY_DOMAIN in ai_overview else 0
DB.execute(
"INSERT INTO citations VALUES (?,?,?,?,?,?)",
(today, query, MY_DOMAIN, 1 if position > 0 else 0,
position, in_aio))
DB.commit()
print(f"Scanned {len(TARGET_QUERIES)} queries")
print(f"Cost: {len(TARGET_QUERIES) * 0.005:.3f}")
scan_citations()MCP integration for interactive tracking
Connect the scanner as an MCP tool in Claude Code. Type a natural language query like "check my AI Overview presence for project management keywords" and get a real-time report without leaving the terminal.
What to track weekly
- Citation presence rate: what % of target queries cite your domain
- Citation trend: are you gaining or losing citations over time
- Competitor citations: which competitors appear in AI Overviews for your queries
- Organic-to-AIO correlation: do your top-5 organic rankings correlate with citations