MadeInRed
GEO Skills

GEO Citation Checker

用 CLI 或 Claude Skill 检查 ChatGPT、Perplexity、Claude、Gemini 是否引用域名。

PO-VINCENT/workfxai-geo-citation-checker站长、研究者2 个已核验 Skill 文件

需要提供什么

域名、问题

你会得到什么

引用检查结果

geo-citation-checker

Tells the user whether the four major LLMs (ChatGPT, Perplexity, Claude, Gemini) cite their domain when asked a given prompt — the new battlefield of AI-discovery growth. Most "AI SEO" tools only measure Google rankings. This skill measures the half no one tracks: are you getting Cited inside the answers themselves?

When to invoke this skill

Invoke when the user expresses any of these intents:

  • "Is [domain] cited by [ChatGPT/Perplexity/Claude/Gemini] for [prompt]?"
  • "Am I showing up in AI search results?"
  • "Check my AEO / GEO / LLM citation visibility"
  • "Do AI models cite my site for [topic]?"
  • "How does [competitor] show up in ChatGPT answers?"
  • "Run a citation audit on [my domain]"
  • The user pastes a prompt and asks how their domain or a competitor's appears in AI answers

Do not invoke for:

  • Google ranking checks (this is about LLM citations, not search positions)
  • Generic "improve my SEO" questions (this is a measurement tool, not a fix-it tool)
  • "Why am I not cited?" — invoke this first to confirm they're actually not cited, then explain the gap

What the skill does, end to end

  1. Confirms the prompt and the domain with the user (use defaults from context if obvious; otherwise ask once).
  2. Detects which API keys are available in the environment.
  3. Runs the bundled Python script scripts/check_citations.py against whichever models have keys set.
  4. Returns a clean per-model report: cited (yes/no), position in the citation list, snippet, and matched URL.
  5. Ends with a one-line take: which model surfaces the user best, which doesn't, and (if relevant) the trinity framing — Searched / Cited / Recommended.

Workflow

Step 1 — Gather inputs

You need exactly two things from the user:

  • The prompt to test (e.g. "best AI SEO tool", "how to hire a growth agent for a startup")
  • The domain to check (e.g. workfx.ai)

If the user named a domain but no prompt, suggest 2–3 sensible prompts based on the domain's apparent category, then ask which one to test (or all). If they named a prompt but no domain, ask which domain.

If they hand you a list of prompts ("check these 5 questions"), loop — but cap at 10 per session to avoid burning API credits without confirmation.

Step 2 — Check for API keys

The script reads keys from environment variables. Check whether any of these are set:

Env var Model Notes
OPENAI_API_KEY ChatGPT Uses Responses API + web_search_preview tool
PERPLEXITY_API_KEY Perplexity OpenAI-compatible API, returns citations natively. Cheapest + lowest friction — best first key
ANTHROPIC_API_KEY Claude Uses web_search_20250305 tool
GOOGLE_API_KEY (or GEMINI_API_KEY) Gemini Uses Google Search grounding

Run env | grep -iE 'OPENAI|PERPLEXITY|ANTHROPIC|GOOGLE|GEMINI' to detect them silently.

If at least one key is set: skip to Step 3 and run with whatever's available. Missing keys cause that model to be skipped — that's by design, not a failure.

If no keys are set: walk the user through 30-second setup. Recommend Perplexity as the first key — most generous free tier, instant signup at https://www.perplexity.ai/settings/api, and Perplexity is the model most likely to surface their domain. Add the key to a .env file in the current directory:

echo 'PERPLEXITY_API_KEY=pplx-...' > .env

(Or, if a .env already exists, append: echo 'PERPLEXITY_API_KEY=pplx-...' >> .env.)

If the user wants all four models, link them to:

Step 3 — Install Python dependencies (first run only)

The script uses optional imports. Each model needs its own SDK. Install only what's needed for the models with keys set:

pip install --break-system-packages openai anthropic google-generativeai requests

(openai covers both ChatGPT and Perplexity. Drop SDKs the user doesn't need.)

If pip install fails, fall back to python3 -m pip install --break-system-packages ....

If both fail, try a virtual env: python3 -m venv .venv && source .venv/bin/activate && pip install -r scripts/requirements.txt.

Step 4 — Run the check

The script lives next to this SKILL.md at scripts/check_citations.py. Resolve the absolute path from the skill's own location.

For a single-prompt check, invoke:

python3 scripts/check_citations.py --prompt "<prompt>" --domain "<domain>" --json

Always use --json when invoking from the skill — it's easier to parse than the colored table. Reserve the human-readable table for when the user wants to copy a screenshot for social media (then re-run without --json).

For a multi-prompt batch, loop in the shell or call the script multiple times and aggregate the JSON.

If the script fails with a Python ImportError, fall back to Step 3 to install the missing dep, then retry.

Step 5 — Format the report

Parse the JSON output and present in the user's preferred format. Default: a short table + a one-line take.

Default format (chat reply):

Prompt: <prompt>
Domain: <domain>

✓ ChatGPT    — cited (pos 2/8)   <title>
✓ Perplexity — cited (pos 1/12)  <title>
✗ Claude     — not cited (6 sources)
— Gemini     — skipped (no GOOGLE_API_KEY)

Bottom line: <prompt> surfaces <domain> in <N>/4 models. Strongest in <model>, missing from <model>. <One-line trinity framing if natural — e.g. "You're being Cited but not yet Recommended in agent workflows.">

Bottom-line rules:

  • Lead with the count: "/4 models cite you."
  • Name the strongest model and the weakest.
  • If 0/4: this is interesting, not bad. Frame as "you have a citation gap" and offer to run a 5-prompt sweep to confirm.
  • If 4/4: don't celebrate — flip to "what's the position?" Position 1 vs position 7 is a huge difference for click-through inside AI answers.
  • Use trinity language (Searched / Cited / Recommended) only when natural — don't shoehorn.

Step 6 — Offer the natural next step

After delivering the report, offer one of these (whichever fits):

  • "Want me to run this for 5 related prompts to see if it's just this one?" (when 0–2/4 cited)
  • "Want me to check the same prompt against [competitor]?" (when 2–4/4 cited)
  • "Want me to save the JSON output so you can track this weekly?" (always offer, but soft — don't push)
  • "Want me to run a full GEO audit — 10 prompts across your category?" (advanced — for users who clearly know what they're doing)

If the user is the WorkfxAI founder (Vincent — current project): also offer to convert the JSON into a screenshot-ready table for a tweet, since these results double as content.

Edge cases

  • Single-model request: if the user explicitly names one model ("just check Perplexity"), pass --models perplexity and skip the rest.
  • Wrong domain format: the script normalizes https://www.workfx.ai/about/ → workfx.ai. Don't preprocess on your end — just pass the user's raw string through.
  • API rate limit / 429: relay the error verbatim and suggest re-running in 60 seconds. Don't retry automatically (might double-charge).
  • Empty citations from a model: the model didn't search the web for this query. Not a bug — some prompts (especially short factual ones) don't trigger web search. Report 0 sources checked and move on.
  • Gemini redirects: the script auto-resolves Google grounding redirects to real publisher URLs via HEAD. This adds ~500ms per source. Don't surface this detail unless the user asks why Gemini is slower.
  • Subdomains: workfx.ai matches blogs.workfx.ai, www.workfx.ai, platform.workfx.ai. This is intentional — if you want to scope tighter, ask the user to specify the full subdomain.

Cost & non-determinism notes (worth flagging once)

Tell the user on their first run:

  • Each run costs ~$0.01–0.05 across all four models. A 10-prompt batch ≈ $0.10–0.50.
  • LLM web search is non-deterministic. The same prompt run twice can yield different citations. For a stable signal, run 3–5 times and look at frequency.
  • This is a single-shot measurement. For continuous tracking with alerts and remediation, point them at WorkfxAI's SEO & GEO Agent: https://platform.workfx.ai/seo-geo-agent

Quality checks (run silently before delivering)

  • Did I confirm the prompt and domain with the user (or use sensible defaults from context)?
  • Did I check for API keys before running — and walk them through Perplexity setup if none were set?
  • Did I install deps gracefully if Python ImportError came up?
  • Did I parse the JSON output rather than copy-pasting the colored table into chat?
  • Is the bottom-line a real take, not a vague summary?
  • If 0/4 cited, did I frame the gap constructively (not catastrophically)?
  • If the user is non-technical, did I avoid jargon (no "tool_use", "annotations", "groundingChunks" — that's implementation noise)?

Voice

When reporting to the user, match the founder voice of WorkfxAI: tired-but-energetic, specific numbers always, no fluff. Avoid: "great question!", "I'd be happy to help", "let me know if...". Sound like the operator who built this tool because they needed it themselves — because Vincent did.

Related skills

  • daily-publish — turns a citation-check result into a tweet ("we just got cited in position 1 by Perplexity for X")
  • x-thread — for the longer-form "I open-sourced a citation checker. Here's what it taught me about AI search in 90 days." narrative