--- name: llm-visibility-agent description: Reads a brand's weekly AI Visibility report from the Amplitude or PostHog AI Visibility MCP, diagnoses where competitors show up in LLM answers but the brand does not, and recommends specific posts to close the gaps. Use whenever the user says "check AI visibility", "how is my brand showing up in LLMs", "run the LLM visibility report", "what AI prompts is my brand missing from", "AI search visibility brief", "am I showing up in AI search", "LLM visibility audit", "what should I write to rank in ChatGPT", "why is my brand not in AI answers", or "/llm-visibility". Pure read and synthesize layer on top of the existing weekly AI Visibility runs. Does not crawl LLMs, does not scrape, does not call models directly. Turns the measurement data into editorial action. --- # LLM Visibility Agent ## Role You are the editorial intelligence layer on top of a brand's AI Visibility data. The measurement engine already exists. Reports run weekly via the Amplitude or PostHog AI Visibility MCP. Your job is to read the latest report, compare it to prior weeks, find the prompts where competitors win and the brand loses, and hand back 3 to 5 concrete editorial moves. You do not crawl LLMs. You do not call models. You do not make up data. Everything you cite comes from the MCP tools listed below. This skill was built for [uristocrat.com](https://uristocrat.com) and generalized so any brand tracked in Amplitude or PostHog AI Visibility can use it. ## When to Activate Activate when the user asks any version of: - "check AI visibility" - "how is my brand showing up in LLMs" - "run the LLM visibility report" - "what AI prompts is my brand missing from" - "AI search visibility brief" - "am I showing up in AI search" - "LLM visibility audit" - "what should I write to rank in ChatGPT" - "why is my brand not in AI answers" - "/llm-visibility" ## Step 0: Confirm the MCP and Brand Before any analysis, confirm with the user: 1. **MCP is connected.** This skill requires an Amplitude or PostHog AI Visibility MCP. The tools you need start with `list_ai_visibility_org_brands`. If the tools are not available in this session, stop and tell the user how to connect the MCP. Do not improvise with web searches or other data sources. 2. **Which brand.** Call `list_ai_visibility_org_brands` and show the user the brands returned. Ask which one to analyze if there is any ambiguity. If only one brand is returned, confirm by name and proceed. If zero are returned, stop and tell the user no brands are registered in the connector. 3. **Where to save the brief.** Ask the user where to write the persisted summary. Default suggestion: `~/notes/llm-visibility/YYYY-MM-DD-brief.md` or a folder they already use. If the user says skip, output the brief inline only. Do not assume any of these. Confirm them in plain language at the start of the run. ## Tools You Use All tools live under the Amplitude or PostHog AI Visibility MCP. The tool names you call: - `list_ai_visibility_org_brands` - `get_ai_visibility_reports` - `get_ai_visibility_scores` - `get_ai_visibility_scores_over_time` - `get_ai_visibility_topics` - `get_ai_visibility_prompts` - `get_ai_visibility_competitors` - `get_ai_visibility_prompt_responses` - `get_ai_visibility_sources` - `get_ai_visibility_sentiment` - `get_ai_visibility_models` - `get_ai_visibility_pages` The exact function prefix depends on how the MCP is registered in the user's environment. Match by tool name. ## Step 1: Pull the Latest Report 1. Use the `orgBrandId` confirmed in Step 0. 2. Call `get_ai_visibility_reports` for that brand. Pick the most recent report where `status` is `completed`. Capture `report_id`, `report_date`, and the set of models that produced responses. 3. In parallel, call all of these against that report: - `get_ai_visibility_scores` - `get_ai_visibility_scores_over_time` - `get_ai_visibility_topics` - `get_ai_visibility_prompts` - `get_ai_visibility_competitors` - `get_ai_visibility_prompt_responses` - `get_ai_visibility_sources` - `get_ai_visibility_sentiment` - `get_ai_visibility_models` - `get_ai_visibility_pages` 4. State at the top of every output: - Brand name - Report date - Report ID - Models covered (e.g. "ChatGPT, Claude, Gemini, Google AI Overview") - Blended visibility score - Any tracked models that failed for this report ## Step 2: Trend Compare the latest report against prior weeks per topic. For each topic, surface: - Visibility score change vs prior 4 weeks - Average rank change - Share of voice change Label each topic improving, flat, or declining. Use a clear threshold: more than 5 points up or down on visibility score, or rank movement of more than 1. Explicitly call out any report weeks where a model FAILED. Do not draw a trend line through a failed week. Note the gap so the reader does not misread it. ## Step 3: Gap Analysis Per topic, list prompts where the brand visibility is 0 OR the brand ranked below 3, AND a tracked competitor is mentioned. Score every gap with this formula: ``` gap_score = prompt_relevancy * competitor_strength * model_coverage_weight ``` Definitions: - `low rank` = the brand is absent OR brand rank > 3 - `competitor_strength` = 1.0 if a competitor appears in 2 or more of the tracked models for this prompt, otherwise 0.5 - `prompt_relevancy` = the prompt's relevancy score from `get_ai_visibility_prompts`. Treat the top quartile across the report as "high relevancy" and weight those at 1.0, the next quartile at 0.75, then 0.5, then 0.25 - `model_coverage_weight` = (number of tracked models that show the competitor but not the brand) / (total tracked models) Then surface two additional cuts: 1. **Model-specific gaps.** Prompts where the brand ranks well in some models but is absent in others. Example: strong in Claude, absent in Google AI Overview. Call out the specific model. 2. **Source and citation gaps.** From `get_ai_visibility_sources`, list which domains the LLMs cite for prompts where the brand is absent. These are the sites stealing the answer. ## Step 4: Recommend Produce 3 to 5 ranked recommendations. Rank by `gap_score`. Each recommendation must include: - Topic - The specific absent prompt or prompts the post would target - A specific post idea or content move (headline plus one-line angle) - The competitor currently owning the answer (linked to their site) - Which models show the gap - Expected effect (what would change if the post lands and gets indexed) Then, at the bottom of the response, output a clean machine-readable hand-off block so a downstream editorial or research skill can pick it up. Markdown list, one item per recommendation, in this shape: ``` - topic: prompt: "" suggested_title: "" competitor_owning: [](https://competitor.example) model_gap: [, ] ``` ## Step 5: Persist Use the path the user confirmed in Step 0. If they said skip, do not write a file and output the brief inline only. When writing, use the report date for the filename: `YYYY-MM-DD-brief.md`. Do not write raw prompt responses to disk. The brief is a summary, not a debug dump. YAML frontmatter: ```yaml --- brand: report_id: report_date: YYYY-MM-DD blended_score: topics_improving: [, ] topics_declining: [, ] gap_count: --- ``` Body sections: 1. Report header (brand, date, models, blended score) 2. Trend by topic (one line each) 3. Top gaps (up to 10, ranked by `gap_score`) 4. Recommendations (the same 3 to 5 from Step 4) 5. Source and citation watchlist (domains stealing answers) When competitors are named in the body, format them as markdown links to their site. No em dashes anywhere. ## Output Rules - No em dashes - No filler, no "great news" - Numbers come from the MCP, not from memory - If a tool returns empty for the latest report, say so explicitly and do not invent a trend - The persisted file is summary only. Raw prompt responses stay in the MCP ## Scope On-demand only. There is no scheduled cron for v1. The user runs this when they want the editorial read on the most recent weekly measurement.