AEO Copilot MCP Server
An MCP server that puts AEO Copilot's AI-visibility data and prompt management inside your assistant, so you can inspect how ChatGPT, Claude, Perplexity and Google AI Overviews answer about a brand and act on it.
Brands & topics: list brands, create brands, list/create topic clusters.
Prompts: bulk-add prompts, list all prompts (including never-run ones), edit one or many prompts (text, topic, target page, engine), soft-delete up to 50 and restore them within 48 hours.
Running: trigger prompt runs for a whole brand or a single topic across all enabled engines.
Results: per-prompt results per engine with full answer text, mention status, position, sentiment, sources and competitors; filter by topic, date range, limit, or a single engine (chatgpt, claude, perplexity, googleAio).
Insights: visibility score, sentiment, competitive share, trends, top topics and competitor breakdown; plus prioritised recommendations.
Technical audit: scan a brand's website (schema markup, sitemap, llms.txt, etc.).
Industry indexes: create/list indexes, add topics and prompts, run them, then read per-prompt results, share of voice (top-1 share, HHI), cited domains and whitespace gaps where no entity dominates.
Caveat: the schema still exposes
get_recommendations(removed in 2.0.0) and omits the newer Actions, content-audit, Reputation and Gemini support described in the README.
Enables checking brand mentions, position, sentiment, and competitors in Google AI Overviews responses to prompt queries.
Enables checking brand mentions, position, sentiment, and competitors in Perplexity's AI responses to prompt queries.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@AEO Copilot MCP Server what's my brand's AI visibility score?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
AEO Copilot MCP Server
Connect AEO Copilot to Claude or any MCP-compatible assistant. Ask your AI how ChatGPT, Claude, Perplexity, Gemini and Google AI Overviews answer about your brand, then work through the fixes AEO Copilot finds (Actions) without switching tabs.
What is AEO Copilot?
AI search engines are eating into traditional search traffic. When someone asks ChatGPT "What's the best tool for X?", your brand either shows up or it doesn't. Unlike Google, there's no ranking page to check.
AEO Copilot runs prompts against 4 engines of your choice out of ChatGPT, Claude, Perplexity, Gemini, and Google AI Overviews, and records whether your brand got mentioned, where it ranked, how it was described, and which competitors showed up instead. This MCP server puts that data inside your AI assistant.
Related MCP server: ai-visibility-mcp
New in 2.1.0
Your agent can now read and act on Site audit > Content, to improve the pages your prompts point to.
get_content_audit: every audited page with its quality, substance, trust and copy scores, and the average over time.get_content_audit_page: one page's full report (failed checks, copy tells, fixes), its score history, the prompts that point to it and its open actions.set_content_audit_pagesandrun_content_audit: choose which pages are audited, and rescore them after you edit.
These need the new version of AEO Copilot on the brand.
New in 2.0.0
Recommendations are now Actions, in the app and here.
get_recommendationsis removed, along withGET /api/v1/brands/:id/recommendations. Uselist_actionsto read what to fix andupdate_actionto accept, dismiss or mark it done.get_insightskeeps itsrecommendationsfield. It now holds your 3 most urgent open actions.
On 1.x, get_recommendations returns a 404. npx aeo-copilot-mcp picks up 2.0.0 on its own; if you pinned a version, move to aeo-copilot-mcp@2.
Tools
Tool | Description |
| List all brands on your account |
| List topics for a brand (e.g. "Product Comparisons", "Pricing Questions") |
| Per-prompt results for each engine the account tracks (ChatGPT, Claude, Perplexity, Gemini, Google AI Overviews): mention status, position, sentiment, sources, competitors, and the full answer text. Set |
| Overview metrics: % of AI answers that name your brand (per engine, with the change since the last run), share of voice, what changed, who's named instead, reputation, cited sources, topics |
| Your brand's actions: page fixes, pages to create, sources to win, site fixes, each tied to the prompts it affects, with before/after for done ones |
| Accept, dismiss, mark done or reopen an action; done actions are measured on the next runs of their prompts |
| Reputation brands: answers that get your brand wrong (wrong product, outdated, contradicting your facts, engine doesn't know you), by engine, with the quote and the fact it conflicts with |
| Draft brand facts from your website for review (nothing is saved) |
| Save the brand facts answers are checked against, then re-check the latest answers |
| Re-check the latest answers against the saved brand facts |
| Create a new brand (subject to your plan's brand limit) |
| Create a topic cluster for a brand |
| Bulk-add prompts to a brand under a topic (subject to your plan's monthly prompt limit) |
| Run all prompts for a brand (or one topic) across every enabled LLM |
| Run the technical audit on the brand's website and return the full scan result |
| Site audit > Content: each audited page's quality, substance, trust and copy scores, the last change, prompts pointing to it, and the average over time |
| One page's content report (failed checks, copy tells, fixes), score history, matched prompts and open actions, to improve that page |
| Replace the pages added to the content audit (up to 20); new pages are scored right away |
| Rescore the content audit pages now, for example after editing a page |
| Create an industry index (brand-agnostic — every cited entity is captured) |
| List all industry indexes on your account |
| Add a topic cluster to an index |
| Bulk-add prompts to a topic in an index |
| Run all index prompts on the account's selected engines and store full per-LLM results |
| Raw per-prompt results for an index across all LLMs |
| Ranked entity list by citation frequency + concentration score (top-1 share, HHI) |
| Domains ranked by citation frequency across every LLM response |
| Prompts/topics where no entity is consistently cited — opportunity gaps |
Setup
1. Get your API key
Log in to aeo-copilot.com
Go to Settings → API
Click Create API key
Copy the key — it starts with
aeo_
Keep it somewhere safe; you won't be able to see the full key again after closing the dialog.
2. Add to Claude Code
claude mcp add aeo-copilot -e AEO_COPILOT_API_KEY=aeo_your_key_here -- npx aeo-copilot-mcp3. Add to Claude Desktop
Edit claude_desktop_config.json:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"aeo-copilot": {
"command": "npx",
"args": ["aeo-copilot-mcp"],
"env": {
"AEO_COPILOT_API_KEY": "aeo_your_key_here"
}
}
}
}Restart Claude Desktop after saving.
What you can ask
"What's my brand's AI visibility score?"
"Show me exactly what Claude said about my brand"
"Which prompts mention my competitors but not me?"
"Show me my visibility trend for the last 30 days"
"What topics are performing best in AI search?"
"What should I fix to improve my AI visibility?"
"Find my lowest-scoring page in the content audit, fix its copy on our site, then rescore it"
"Go through my new actions, accept the page fixes worth doing, and make them on our site"
"Which of the actions I finished last month actually got us named more often?"
"How does my brand compare to [competitor] in AI-generated answers?"
"What's the sentiment breakdown for my brand mentions?"
"Draft brand facts for my Reputation brand from our website, and show me what to correct"
"Which AI answers describe the wrong product, and where did they get it from?"
API reference
list_brands
GET /api/v1/brandsReturns all brands on your account: name, website, industry, products, competitors.
list_topics
GET /api/v1/brands/:id/topicsTopics group related prompts. Each topic has a name, description, target pages, and keywords.
get_results
GET /api/v1/brands/:id/resultsPer-prompt results. Each entry includes mention status, position, sentiment, sources cited, and competitors — broken down by AI engine. Every engine block also carries response: the full answer text that engine returned for the prompt.
Optional filters:
Parameter | Type | Description |
| string | Filter by topic |
| string | Return only one engine's answers: |
| ISO date | Start date, e.g. |
| ISO date | End date |
| number | Max results (default 100, max 500) |
The API has no server-side
enginefilter — it always returns a block per engine (null when that engine didn't run). The MCP server applies theenginefilter client-side so you get a focused, smaller payload when you only want one LLM (e.g. exactly what Claude said).
get_insights
GET /api/v1/brands/:id/insightsThe same numbers as the Overview page:
visibility: % of answers that name your brand (1 answer = 1 prompt on 1 engine, latest run of each active prompt), withvisibilityDeltain points and the split by engineshareOfVoice: your mentions as a share of all mentions of you and your tracked competitorschanges: prompts where an engine stopped or started naming you, and who was named insteadcompetitors: you and your competitors ranked on the same metricreputation,sources,topicsrecommendations: your 3 most urgent open actions (id, priority, category, type, title, description, target).list_actionsreturns them allLegacy fields kept: sentiment, competitiveShare, visibilityTrend, topTopics, mentionVolume, competitorBreakdown
get_reputation
GET /api/v1/brands/:id/reputationFor Reputation brands: every answer checked against your saved brand facts. Returns status, problems by type and engine, fixes (quote, conflicting fact, prompts, engine, cited sources), a prompts × engines matrix, tone on answers with no problem, changes, sources and the saved facts. "No problem found" means nothing conflicts with your facts, not that the answer is verified.
draft_brand_facts
POST /api/v1/brands/:id/brand-facts/draftDrafts aliases and 5 to 8 facts from your website, each with the page it came from. Nothing is saved.
set_brand_facts
PUT /api/v1/brands/:id/brand-facts
{ "aliases": ["generic name"], "facts": [{ "id": "f1", "statement": "...", "kind": "identity", "source": null }] }Replaces the facts (the version goes up by 1) and re-checks the latest answers. kind is one of identity, indication, regulatory, pricing, availability, other. Needs editor access. Accuracy checks run on paid plans.
check_reputation
POST /api/v1/brands/:id/reputation/checkRe-checks the latest answers against the current facts in the background. Read the result with get_reputation.
list_actions
GET /api/v1/brands/:id/actions?status=triage|accepted|done|dismissedActions for a Visibility-mode brand, high priority and most prompts first. Each has a type (cited_not_named, content_gap, page_structure, content_quality, source_opportunity, site), a target (page URL, topic, domain or site check), what's wrong (summary), what to do (detail), evidence, and the prompts it affects. Done actions carry baseline (at accept) and result (measured on runs after the change, measuredAt). enabled: false means Actions isn't switched on for the account yet.
update_action
PATCH /api/v1/actions/:id { "status": "accepted" }Moves: triage → accepted or dismissed; accepted → done or triage; done → accepted; dismissed → triage. A skipped step returns 409. Needs editor access.
create_brand
POST /api/v1/brandsCreate a new brand. Body: name (required), website, industry, products[], competitors[]. Returns 402 if you've hit your plan's brand limit.
create_topic
POST /api/v1/brands/:id/topicsCreate a topic cluster. Body: name (required), description, pages[], keywords[].
add_prompts
POST /api/v1/brands/:id/promptsBulk-add prompts under a topic. Body: topicId (required), prompts[] (required, array of strings). Returns 402 if adding these prompts would exceed your plan's monthly prompt limit.
run_brand_prompts
POST /api/v1/brands/:id/runRun all prompts across every enabled LLM. Optional query param topicId to scope to a single topic. Returns the count of prompts run.
scan_brand
POST /api/v1/brands/:id/scanRun the technical audit on the brand's website. Returns the full scan result (schema markup, sitemap, llms.txt, etc.) — same data the dashboard's technical scan view shows.
get_content_audit
GET /api/v1/brands/:id/content-auditAudited pages with their scores (quality, substance, trust, copy, 0-100), the pages added by URL list (addedUrls), the average quality and its history by day. processing is true while pages are being scored. enabled: false when the brand is not on the new version.
get_content_audit_page
GET /api/v1/brands/:id/content-audit/page?url=One page: page (scores), report (the slop detector's copy and quality reports), history, prompts pointing to the page, and actions about it. 404 when the page hasn't been scored.
set_content_audit_pages
PUT /api/v1/brands/:id/content-audit/pages { "urls": [...] }Replaces the added pages (up to 20, on the brand's site). Returns saved and refused with the reason. Editor access.
run_content_audit
POST /api/v1/brands/:id/content-audit/runRescores the content audit pages in the background (202). Editor access.
Industry indexes
Indexes are brand-agnostic: instead of tracking how your brand is mentioned, an index tracks every entity cited across an industry's prompts. Useful for category mapping, competitive whitespace, and seeing which sources the LLMs lean on.
create_index
POST /api/v1/indexesCreate an industry index. Body: name (required), industry (required), description.
list_indexes
GET /api/v1/indexesList all indexes on your account.
add_index_topic
POST /api/v1/indexes/:id/topicsAdd a topic cluster. Body: name (required), description.
add_index_prompts
POST /api/v1/indexes/:id/promptsBulk-add prompts under a topic. Body: topicId (required), prompts[] (required, array of strings).
run_index_prompts
POST /api/v1/indexes/:id/runRun every prompt on the engines the account has selected (up to 4 of ChatGPT, Claude, Perplexity, Gemini, Google AI Overviews). All extracted entities are stored as competitors — no brand filter.
get_index_results
GET /api/v1/indexes/:id/resultsRaw per-prompt results across all LLMs. Same shape as /brands/:id/results minus the brand-mention fields.
get_index_share_of_voice
GET /api/v1/indexes/:id/share-of-voiceRanked entity list by citation frequency, plus a concentration score:
top1Share: the % of mentions held by the most-cited entityhhi: an HHI-style index (sum of squared shares × 10,000) showing how concentrated mentions are. Higher = more dominated by a few entities.
get_index_sources
GET /api/v1/indexes/:id/sourcesDomains ranked by citation frequency across every LLM response in the index.
get_index_whitespace
GET /api/v1/indexes/:id/whitespacePrompts and topics where no entity is consistently cited — i.e. fewer than 1 consistent entity appears across at least 50% of runs. These are the gaps where a brand can establish authority before the category solidifies.
Development
git clone https://github.com/sofianbettayeb/aeo-copilot-mcp
cd aeo-copilot-mcp
npm install
AEO_COPILOT_API_KEY=aeo_your_key npm run devTo run against another instance, such as a local AEO Copilot dev server, set AEO_COPILOT_BASE_URL (default https://aeo-copilot.com):
AEO_COPILOT_BASE_URL=http://localhost:3000 AEO_COPILOT_API_KEY=aeo_your_key npm run devLicense
MIT
Available Tools
25 toolsadd_index_promptsC
Bulk-add prompts to a topic in an industry index.
Inputs: indexId (required), prompts (required), topicId (required).
add_index_topicB
Add a topic cluster to an industry index. Topics group related prompts (e.g. 'Pricing Questions', 'Best-of Comparisons').
Inputs: name (required), indexId (required), description.
add_promptsA
Bulk-add prompts to a brand under a specific topic. Subject to your plan's monthly prompt limit — the API will return an error if you've reached it.
Inputs: brandId (required), prompts (required), topicId (required).
create_brandA
Create a new brand on your AEO Copilot account. Subject to your plan's brand limit — the API will return an error if you've reached it.
Inputs: name (required), website, industry, products, +1 more.
create_indexA
Create an industry index — a brand-agnostic view of an industry that tracks every entity cited across prompts (no single brand is the focus).
Inputs: name (required), industry (required), description.
create_topicB
Create a topic cluster for a brand. Topics group related prompts (e.g. 'Pricing Questions', 'Product Comparisons').
Inputs: name (required), brandId (required), pages, keywords, +1 more.
delete_promptsA
Delete 1 to 50 prompts by id. This is a soft delete: the prompts stop collecting data immediately, stay restorable from the web app's Recently deleted view for 48 hours, and are then permanently removed along with their results. Prompts you don't own are skipped and reported back, not failed.
Inputs: promptIds (required).
get_index_resultsA
Get raw per-prompt results for an industry index across all 4 LLMs. Same shape as get_results minus the brand-mention fields — every cited entity is captured.
Inputs: indexId (required).
get_index_sourcesA
Get domains ranked by citation frequency across every LLM response in the index — which sources the AI engines lean on most.
Inputs: indexId (required).
get_index_whitespaceA
Find whitespace opportunities in an index: prompts and topics where no entity is consistently cited (threshold: fewer than 1 consistent entity across at least 50% of runs). These are gaps where a brand could establish authority.
Inputs: indexId (required).
get_insightsA
Get analytics insights for a brand: overall visibility score, sentiment breakdown, competitive share, visibility trends over time, top-performing topics, and competitor breakdown.
Inputs: brandId (required).
get_recommendationsB
Get prioritised, actionable recommendations to improve your brand's AI visibility — based on prompt results and a technical audit of your website.
Inputs: brandId (required).
get_resultsA
Get prompt execution results for a brand across AI engines (ChatGPT, Claude, Perplexity, Google AI Overviews). Each result includes a per-engine block with the full answer text (response), plus whether your brand was mentioned, its position, sentiment, sources, and which competitors appeared. Set engine to return only one engine's answers — e.g. 'claude' to read exactly what Claude said.
Inputs: brandId (required), to, from, limit, +2 more.
list_brandsB
List all brands you have access to in AEO Copilot.
Inputs: no named parameters.
list_deleted_promptsA
List recently deleted prompts for a brand that are still restorable (48-hour grace window), grouped by delete batch with sample texts and expiry. Use the batchId with restore_prompts to undo a deletion.
Inputs: brandId (required).
list_indexesA
List all industry indexes you have access to in AEO Copilot.
Inputs: no named parameters.
list_promptsA
List all prompts for a brand with their ids, text, topic, target page, last run date, and paused state. Use this to discover prompt ids for update_prompt, update_prompts, and delete_prompts — including prompts that have never been run (which get_results cannot see).
Inputs: brandId (required), topicId.
list_topicsA
List all topics configured for a brand. Topics group related prompts together (e.g. 'Product Comparisons', 'Feature Questions').
Inputs: brandId (required).
restore_promptsA
Restore a batch of recently deleted prompts (undo a delete_prompts call). Works while the batch is still inside the 48-hour grace window; get the batchId from list_deleted_prompts or from the delete_prompts response.
Inputs: batchId (required).
run_brand_promptsA
Run all prompts for a brand across every enabled LLM (ChatGPT, Claude, Perplexity, Google AI Overviews). Optionally filter to a single topic. Returns the count of prompts run.
Inputs: brandId (required), topicId.
run_index_promptsA
Run all prompts in an index across all 4 LLMs (ChatGPT, Claude, Perplexity, Google AI Overviews) and store full per-LLM results. No brand filter — every entity mentioned is captured.
Inputs: indexId (required).
scan_brandA
Run a technical audit on the brand's website. Returns the full scan result — same data the dashboard's technical scan view shows (schema markup, sitemap, llms.txt, etc.).
Inputs: brandId (required).
update_promptA
Edit a single prompt: its text, topic, or target page URL. Editing the text keeps all past results linked to the prompt — only future runs use the new wording.
Inputs: promptId (required), llm, text, topicId, +1 more.
update_promptsA
Bulk-edit up to 50 prompts in one call. Each update needs the prompt's id plus the fields to change (text, llm, topicId, recommendationPageUrl). Items are processed independently — the response reports how many updated and which failed, so you can retry just the failures. Editing text keeps past results linked; only future runs use the new wording.
Inputs: updates (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 25 tools
Tools are mostly distinct thanks to consistent brand/index prefixes and clear resource nouns, but update_prompt and update_prompts overlap functionally since the bulk variant can also handle a single prompt. Overall, descriptions resolve most ambiguity and misselection risk is low.
All tool names follow a consistent snake_case verb_noun pattern with predictable verbs: list, create, get, add, update, delete, restore, run, scan. Brand/index distinctions are systematically encoded, e.g. run_brand_prompts vs run_index_prompts and get_results vs get_index_results.
25 tools sits at the heavy end of the borderline range for a single MCP server. The domain is broad enough that most tools serve a purpose, but several bulk/parallel variants (e.g. update_prompt vs update_prompts, brand vs index families) make the surface feel larger than necessary.
Prompt lifecycle coverage is strong: list, add, update, delete, restore, and run are all present. However, brands, topics, and indexes have create/add/list/get operations but no corresponding update or delete tools, and index prompts cannot be listed or removed outside of results, leaving notable dead ends.
Maintenance
Related MCP Connectors
AI-visibility monitoring for your brand across ChatGPT, Claude, Perplexity & Gemini.
Track your brand's visibility in ChatGPT, Perplexity, Claude, Gemini, Grok and DeepSeek answers.
AI visibility & recommendation monitoring for ChatGPT, Claude, Gemini & Perplexity.
Track brand visibility across ChatGPT, Claude, Gemini & Perplexity. Scores, competitors, trends.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables brand visibility monitoring across major AI platforms like ChatGPT, Claude, Gemini, and Perplexity. It allows users to track visibility scores, analyze competitor data, and receive actionable insights to improve AI-generated brand recommendations.169 npm1MIT
- AlicenseAqualityDmaintenanceTrack brand visibility across ChatGPT, Perplexity, Claude, and Gemini.6277 npm11MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to scan brand visibility across ChatGPT, Claude, Gemini & Perplexity, analyze website GEO readiness, compare competitors, and get actionable recommendations.MIT
- AlicenseAqualityCmaintenanceEnables AI visibility analysis for brands, providing scores, sentiment, competitor comparison, and recommendations across multiple AI models like Claude and GPT-4o.215 npm1MIT