MCP API Reference
Connect AI assistants like Claude, ChatGPT, Cursor, and more to AEO Optima via the Model Context Protocol (MCP).
Overview
AEO Optima exposes a Model Context Protocol (MCP) server that allows AI assistants to access your brand visibility data, capture snapshots, run analytics, and more — all without leaving your AI tool.
Server URL: https://aeo-optima-mcp.onrender.com/mcp
Transport: Streamable HTTP (JSON-RPC over HTTP POST)
Authentication: Bearer token or OAuth 2.1
Getting Started
There are two ways to connect your AI client to AEO Optima:
Option A: Manual Token (Recommended — works everywhere)
- Log in to the AEO Optima dashboard
- Go to Settings > MCP / API
- Click Generate New Token
- Give it a name (e.g., "Claude Desktop") and select a role cap
- Copy the token immediately — it's shown only once
- Paste the token into your AI client's configuration (see Client Configuration below)
Option B: OAuth 2.1 (Click-to-connect)
Some AI clients (like Claude Desktop) support OAuth, which lets you connect with a single click — no token copying needed. When you click "Connect" in your AI client:
- A browser window opens with the AEO Optima login page
- You log in (or are already logged in)
- A consent screen shows what the AI client is requesting
- You pick your organization and approve
- You're redirected back — connection is automatic
OAuth discovery endpoints:
- Authorization Server Metadata:
https://aeo.techshu.ai/.well-known/oauth-authorization-server - Protected Resource Metadata:
https://aeo-optima-mcp.onrender.com/.well-known/oauth-protected-resource
OAuth supports PKCE (required), Dynamic Client Registration, refresh tokens, and token revocation.
Client Configuration
Replace aeo_YOUR_TOKEN with the token you generated from Settings > MCP / API.
Claude Desktop
Go to Settings > Connectors > Add Remote MCP Server and enter:
- Name:
aeo-optima - URL:
https://aeo-optima-mcp.onrender.com/mcp - Authorization Token: Your
aeo_...token
Claude Desktop also supports OAuth — it will auto-discover the authorization server and guide you through the consent flow.
Claude Code (CLI)
Cursor
Create or edit .cursor/mcp.json in your project root:
Windsurf
Edit ~/.codeium/windsurf/mcp_config.json:
OpenAI Codex (CLI, IDE extension, ChatGPT desktop)
One config covers the Codex CLI, the Codex IDE extension, and ChatGPT desktop — they share ~/.codex/config.toml.
OAuth (recommended — no token to store). AEO Optima's MCP server implements OAuth 2.1 with PKCE and open Dynamic Client Registration, which is exactly the flow codex mcp login drives:
Then run codex mcp login aeo-optima — your browser opens the AEO Optima consent screen and Codex stores the resulting credentials itself.
Static token fallback (headless machines / CI):
Then export AEO_OPTIMA_TOKEN=aeo_YOUR_TOKEN. You can also run the interactive codex mcp add aeo-optima and choose Streamable HTTP when prompted.
VS Code + Copilot
In VS Code 1.99+, go to Settings > MCP Servers and add:
- Type:
http - URL:
https://aeo-optima-mcp.onrender.com/mcp - Headers:
Authorization: Bearer aeo_YOUR_TOKEN
ChatGPT / OpenAI
ChatGPT connects over OAuth — there is no token to paste. OpenAI's developer mode guide describes developer mode as "Available to Pro, Plus, Business, Enterprise, and Education accounts on the web", with SSE and streaming HTTP as the supported MCP protocols.
- In ChatGPT, open Settings → Security and login and turn on Developer mode.
- Following OpenAI's guide, create a developer-mode app for a remote MCP server with the server URL
https://aeo-optima-mcp.onrender.com/mcp. - Choose OAuth as the authentication. AEO Optima supports Dynamic Client Registration, so no client ID or secret is needed.
- Sign in on the AEO Optima consent screen, pick your organization and access level, and approve.
OpenAI states that ChatGPT respects readOnlyHint and that write actions require confirmation by default. For the OpenAI Agents SDK or your own code, use a Bearer token instead (see below).
Google Gemini
Google Gemini supports MCP at the SDK level. Add AEO Optima as a remote MCP server with the server URL and Bearer token.
Amazon Q Developer
In your CLI config or IDE plugin settings, add the MCP server URL with your Bearer token as a header.
OpenAI Agents SDK (Python)
Anthropic API (Direct)
Use the mcp_servers parameter in the Messages API:
Authentication
AEO Optima supports two authentication methods. Both produce a Bearer token that is sent with every MCP request.
Method 1: Manual Tokens
Generated from the Settings page. Format: aeo_ + 48 random hex characters (52 characters total).
- SHA-256 hashed before storage — plaintext is never stored
- Optional expiration dates for time-limited access
- Can be revoked at any time from the Settings page
- Scoped to a specific user + organization
Method 2: OAuth 2.1
OAuth tokens are generated automatically through the browser-based consent flow. Format: oat_ + 48 random hex characters.
OAuth supports:
- Authorization Code + PKCE (S256 only) — no client secrets needed
- Dynamic Client Registration (RFC 7591) — AI clients auto-register
- Refresh Tokens — access tokens auto-renew without re-authorization
- Token Revocation (RFC 7009) — revoke access or refresh tokens
- Scopes:
mcp:tools,mcp:resources,mcp:prompts
Role Hierarchy
Both token types have a role cap that limits what they can do, regardless of the user's actual role:
| Role | Read Data | Write Data | View Costs | Admin Tools |
|---|---|---|---|---|
| viewer | Projects, snapshots, analytics, prompts, models | No | No | No |
| member | Everything a viewer can + usage/cost data | Capture snapshots, create/update prompts, analyze pages | Yes | No |
| admin | Everything | Everything a member can | Yes | No |
| owner | Everything | Everything | Yes | No |
The effective permission is always the minimum of the token's role cap and the user's actual organization role.
Tools (120)
The MCP server exposes 120 tools — 113 customer-facing tools across 31 categories, plus 7 platform-owner-only tools that never appear for customer tokens. Tools that require a feature flag (Advanced Analytics, GEO Audit, GA4, GSC, Webhooks, Connectors, Citations, Crawlers, Content, Predictive, Enterprise, Query Universe, Fusion Insights) only work for organizations whose plan includes the corresponding feature.
Every tool advertises a short human-readable title (for example "Delete an alert rule") alongside readOnlyHint and destructiveHint. Clients that honour these hints can run read-only tools without asking and ask you to confirm anything that changes or deletes data.
Pagination & structured output
Every tool carries the MCP spec annotations (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) so clients can reason about a tool's safety before calling it. Large list tools are cursor-paginated and never silently truncate: get_snapshots, list_insights, and list_actions use a keyset cursor ordered on (created_at desc, id desc), while get_citations uses a documented offset cursor over its deterministically sorted source lists. Whenever more data exists, the response includes a nextCursor — pass it back as cursor to fetch the next page (an invalid cursor returns a clean 400 error):
Four tools — get_dashboard_metrics, get_citations, get_aeo_program, and get_criteria_map — also return structuredContent alongside the text block, with an outputSchema declared on the tool definition.
Projects (9)
| Tool | Description | Min Role |
|---|---|---|
list_projects | List all projects in your organization | viewer |
get_project | Get detailed project info (brand, competitors, LLM configs) | viewer |
create_project | Create a project with platform defaults — recommended AI models pre-configured, 5 default alert rules, optional competitor seeding and category/industry business context. Counts toward the projects quota | member |
update_project | Update a project's core fields (name, brand, website, description) and its category/industry business context (merge-only settings write). Org owner/admin only | admin |
get_brand_facts | List the project's Brand Facts — verified key-value facts (founding year, HQ, pricing, certifications) ordered by category then key | viewer |
get_claim_library | The claim library: every Brand Fact with its approval state, validity dates, evidence URL, and how many capture runs contradicted it. Only approved claims inside their dates are used in anything the platform generates — look here first when an FAQ or schema block omits a fact | viewer |
set_brand_facts | Create or update Brand Facts in bulk (upsert on fact_key, up to 100 per call), including approval state, validity dates and evidence URL. Approving is a human decision, and changing the value of an approved claim returns it to pending. Omitted fields are left alone; an explicit null clears one. Honest per-fact results. Org owner/admin only | admin |
add_competitor | Add a competitor to track (case-insensitive duplicate rejection, URL validation) | member |
remove_competitor | Remove a tracked competitor from a project. Org owner/admin only | admin |
Snapshots (3)
| Tool | Description | Min Role |
|---|---|---|
get_snapshots | Retrieve snapshots with filters (date, model, sentiment, brand mention) | viewer |
get_snapshot_detail | Get full AI response text and analysis for a snapshot | viewer |
capture_snapshot | Capture new AI responses for a prompt across models (rate limit: 10/hr) | member |
Analytics (4)
| Tool | Description | Min Role |
|---|---|---|
get_dashboard_metrics | KPI summary: visibility %, sentiment, rank, period-over-period changes (default 30-day window, matching the dashboard; days overridable). avgRankPosition is kept for compatibility — position within one answer is unstable across runs; topThreeRate is the replacement | viewer |
get_analytics | Visibility trends, LLM comparison, prompt performance. Per surface, per prompt and overall, avgRank is kept for compatibility (position within one answer is unstable across runs); topThreeRate with its rankedRuns denominator is the replacement beside it. poolEngineSplit compares engines inside each of the four question types (rate, numerator, denominator, question floor, best-to-worst spread per type); llmComparison blends the four types into one rate per engine and is kept for compatibility — rank engines on the split, never on the blend | viewer |
get_usage_metrics | Token usage and cost breakdown by provider, model, day | member |
get_sentiment_breakdown | Sentiment analysis by prompt and model | viewer |
Advanced Analytics (5)
The first three tools require the ai_insights_advanced feature flag; list_emerging_competitors and get_share_of_model work on any plan with MCP access.
| Tool | Description | Min Role |
|---|---|---|
get_entity_analysis | Brand attribute extraction from snapshots, clarity scoring (0-100), verified against brand facts. Accepts optional segment parameter. | viewer |
get_shopping_visibility | Shopping keyword detection, position tracking, price accuracy, competitor analysis. Accepts optional segment parameter. | viewer |
get_multi_language_analysis | Per-language visibility, character-range detection (CJK/Arabic/Cyrillic), localized recommendations. Accepts optional segment parameter. | viewer |
list_emerging_competitors | Brands extracted from snapshots that are not yet in your configured competitor list, ranked by mention count over the last N days | viewer |
get_share_of_model | Share of Model: per prompt × engine inclusion frequency — the share of sampled runs your brand appears in. Each cell carries sample size n and a confidence band (under 10 = low confidence, 10-29 = below target, 30+ = ok). SERP-AI surfaces appear as their own engines | viewer |
Sentiment counting (changed 4 September 2026): wherever a tool returns a
sentimentBreakdown, itspositive,neutralandnegativecounts are answers that named your brand AND carry a judged verdict — so a share computed over them is a share of answers that actually expressed something. Two residuals now travel beside them and are never folded in:notJudged(your brand was named, but no verdict was recorded) andnotNamed(your brand was not in the answer, so no judgement was possible). Before this date an answer with no verdict was counted asneutral, which reported a missing judgement as a neutral opinion. The three key names and their types are unchanged, so existing integrations keep working; aneutralfigure taken from before 4 September 2026 is not comparable with one taken after.
Segment filtering: All analytics tools —
get_dashboard_metrics,get_analytics,get_sentiment_breakdown,get_entity_analysis,get_shopping_visibility,get_multi_language_analysis,get_visibility_forecast,detect_anomalies,analyze_citation_gaps, andgenerate_report— accept an optionalsegmentparameter (all,branded,non-branded, orcompetitor) to filter by prompt type. All REST API analytics endpoints also accept?segment=as a query parameter.
Prompts (9)
| Tool | Description | Min Role |
|---|---|---|
list_prompts | List monitoring prompts for a project (includes topic) | viewer |
create_prompt | Create a new monitoring prompt | member |
update_prompt | Update prompt text, type, topic, priority, active status, or question type (prompt_segment: branded / non-branded / competitor — a refiling is recorded as a reclassification of the tracked set) | member |
delete_prompt | Soft-delete a monitoring prompt — hidden from analytics but capture history is preserved (30-day snapshot restore window). Org owner/admin only | admin |
discover_prompts | AI-assisted prompt discovery: generates up to 50 candidate prompts seeded from your brand, website, competitors, and existing prompts. Returns suggestions for review — nothing is auto-inserted. Spends LLM credits | admin |
fanout_prompt | Generate a query fan-out tree for a seed query — the sub-queries an answer engine expands a question into (reformulations, comparisons, follow-ups). Spends LLM credits | admin |
get_prompt_gaps | Competitive prompt-gap analysis: prompts and topics where competitors surface but your brand does not, ranked by gap score. Pass refresh=true to recompute from snapshot data (member role, no LLM spend) | viewer |
classify_intent | Classify search intent for prompts with the rule-based classifier and persist changed intents. No LLM spend | member |
estimate_volume | Estimate and persist relative search-volume scores (1-100) for active prompts from text heuristics + database signals. No LLM spend | member |
Page Analysis (1)
| Tool | Description | Min Role |
|---|---|---|
analyze_page | Analyze a URL for AEO score (0-100) across 6 categories with improvement suggestions | admin |
Models (1)
| Tool | Description | Min Role |
|---|---|---|
list_models | List available AI models from the dynamic registry, optionally filtered by provider | viewer |
Alerts (6)
| Tool | Description | Min Role |
|---|---|---|
get_alerts | Surface active alerts — firings of your configured alert rules, statistical anomalies from the anomaly detector, and capture-health checks (your own thresholds, not hardcoded ones) | viewer |
list_alert_rules | List the configured alert rules for a project (rule type, threshold, active state, notify settings) | viewer |
create_alert_rule | Create or update an alert rule (one rule per type — re-creating a type updates it). Creatable measures: nb_transactional_mention_rate, nb_informational_citation_rate, brand_transactional_negative_share, brand_informational_own_source_share. The older names (visibility_drop, sentiment_negative, brand_not_mentioned, competitor_surge, rank_drop) are accepted only to switch an EXISTING rule off — nothing evaluates them any more. cooldown_hours spaces out the announcement, not the evaluation: 0–168 (one week). Org owner/admin only | admin |
delete_alert_rule | Delete an alert rule from a project. Org owner/admin only | admin |
get_answer_changes | Proactive answer-change and competitor-displacement events — brand dropped, competitor entered, sentiment shift, claim changed, citation displaced — with derived severity and a project-wide summary. Filter by prompt_id / change_type | viewer |
get_model_drift | Model-drift events the sentinel detected — a provider/model whose answer distribution shifted against its own baseline (pre/post mean, delta %, engine, first seen, severity). Newest first | viewer |
AI Analysis (2)
| Tool | Description | Min Role |
|---|---|---|
run_analysis | Run AI-powered analysis: sentiment_drivers, content_gaps, opportunity_scoring, comprehensive | admin |
get_analysis_results | Retrieve completed AI analysis results for a project | viewer |
Criteria Map (2)
| Tool | Description | Min Role |
|---|---|---|
get_criteria_map | Get the project's selection criteria: per tracked engine, the criteria that engine says define the best offering in your category/industry — gates, segment criteria and signals, each with a layer and an evidence quote — plus the gate-clearance table against your approved facts | viewer |
run_criteria_derivation | Run the criteria-derivation battery: asks each tracked engine (one per provider, max 8) what defines the best offering in your category/industry, structures the answers, and upserts one criteria map per engine. Requires the project's Category + Industry settings; consumes one AI-analysis quota unit per run | admin |
AEO Program (1)
| Tool | Description | Min Role |
|---|---|---|
get_aeo_program | Get the project's AEO Program status: six projection-ladder rungs and five parallel work tracks, every status derived from existing stored signals (intelligence scores, GEO audit, criteria maps, citation-gap placement, coverage report, citation mix) — never computed on demand | viewer |
Actions (2)
| Tool | Description | Min Role |
|---|---|---|
list_actions | List insight actions (auto-generated from AI analysis or manual) | viewer |
update_action | Update an action's status (pending, in_progress, completed, dismissed) or notes | member |
Plan & Quotas (1)
| Tool | Description | Min Role |
|---|---|---|
get_plan_info | Get organization plan, feature flags, quota limits, and current usage counts | viewer |
GEO Audit (3)
| Tool | Description | Min Role |
|---|---|---|
run_geo_audit | Run a Generative Engine Optimization audit on a URL — scores 9 categories: schema, entity clarity, FAQ structure, content depth, answer structure, trust signals, technical SEO, freshness, AI crawler access (incl. JS-dependency) | admin |
run_site_geo_audit | Site-level GEO audit: discovers the site's pages (sitemap → homepage links), audits up to the plan's page cap, aggregates category scores and adds site-wide checks. One quota unit per run | admin |
list_geo_audits | List past GEO audit results for a project | viewer |
GA4 (3)
| Tool | Description | Min Role |
|---|---|---|
get_ai_traffic | Get AI referral traffic data from Google Analytics 4 (sessions, users, pageviews from ChatGPT, Perplexity, Claude, Gemini) | viewer |
get_ga4_status | Check GA4 connection status for a project | viewer |
get_prompt_attribution | Prompt-level closed-loop attribution: joins AI-referral traffic (the GA4 "AI-Assistant" channel) to the prompt(s) whose AI answer cited each page — per (prompt, engine, cited URL) rows with fractionally-attributed AI-assisted sessions / conversions / revenue. Every number is a floor. Accepts the analytics lens params (segment, intent, journey, topic, tag, group_id, orbit). Requires Fusion Insights + GA4; aiRevenue redacted for member/viewer tokens | viewer |
GSC (3)
| Tool | Description | Min Role |
|---|---|---|
get_search_performance | Get Google Search Console data (clicks, impressions, CTR, position) for top queries | viewer |
get_gsc_status | Check Google Search Console connection status for a project | viewer |
get_search_context | Map real Search Console queries to the prompts they relate to — EXACT (the query's landing page is a page this prompt's AI answers cite) and HEURISTIC (topic-matched, with relevance 0–1 and matched terms); the two are never summed. Per-prompt query lists, best position, totals. Accepts the analytics lens params. Requires GSC | viewer |
Webhooks (2)
| Tool | Description | Min Role |
|---|---|---|
list_webhooks | List webhook endpoints registered for the organization | admin |
get_webhook_deliveries | Get recent delivery logs for a webhook endpoint | admin |
Citation Intelligence (4)
| Tool | Description | Min Role |
|---|---|---|
get_citations | Get citation sources for a project with aggregated counts, category breakdowns, and per-engine mention-vs-citation split | viewer |
analyze_citation_gaps | Identify sources that cite competitors but not your brand — actionable outreach targets | member |
get_domain_authority | Get domain authority scores for citation sources (frequency, recency, cross-model presence) | viewer |
get_contribution_grid | Get the contribution grid: your citation mix mapped onto the framework's six external source families, with a presence/diversity verdict per family (absent / thin / present / concentrated) | viewer |
Crawler Intelligence (4)
| Tool | Description | Min Role |
|---|---|---|
get_crawler_dashboard | AI bot monitoring dashboard — activity logs, blocked/allowed status, detected patterns | viewer |
analyze_robots | Analyze robots.txt and ai.txt for AI bot configuration with recommendations | admin |
get_ai_crawl_analytics | AI-bot crawl analytics from uploaded server access logs — per-bot hits with each bot's purpose (live_retrieval | training | robots_token | unknown), purposeTotals kept as separate figures that are never summed, most-crawled pages, crawl→citation funnel with the lag's basis (lagBasisPages, citedBeforeLogsPages), daily trend. The stored kind (train/search) is the robots-guidance reading and is kept for compatibility. Pro Individual plan and above | viewer |
configure_crawl_log_source | Create or update the upload log source for a project (reuses the newest source of the given type). Run before uploading AI-bot access logs. Pro Individual plan and above | admin |
Content Intelligence (6)
| Tool | Description | Min Role |
|---|---|---|
generate_faqs | Generate FAQ content from project prompts and brand facts (suitable for FAQ schema) | admin |
generate_schema_markup | Generate JSON-LD structured data for a URL using brand facts and page content | admin |
get_corrections | Get hallucination correction submissions (drafts, submitted, resolved) | viewer |
submit_correction | Hallucination-correction workflow: generate builds provider-specific correction-request templates from the issue context; create saves a draft correction submission | member |
generate_content_brief | GEO-method Content Brief for a target page: measures the four proven citation levers (expert quotations, statistics, cited sources, dated references) and returns the below-target levers to change, ordered by evidence weight, with an honest expected-lift estimate. Deterministic — no per-generation LLM cost. Persists a draft brief. Professional+ | admin |
get_content_briefs | List persisted Content Briefs (levers, gap summary, coverage, expected lift, status draft/applied/verified, linked action id), newest first | viewer |
Connectors (2)
| Tool | Description | Min Role |
|---|---|---|
list_connectors | List registered connectors (Serper, DataForSEO, Slack, Looker, Zapier, Shopify) | admin |
manage_connector | Create, test, sync, or delete a connector | admin |
Predictive & Edge (3)
| Tool | Description | Min Role |
|---|---|---|
get_visibility_forecast | Visibility forecast via Holt-Winters ensemble (level + trend + weekly seasonality) with bootstrap-calibrated 95% prediction intervals. Returns winning model, cross-validated RMSE/MAE/MAPE, coverage probability, Ljung-Box residual test, and confidence quality rating. Accepts optional segment parameter. | viewer |
detect_anomalies | Completeness-aware z-score anomaly detection on visibility, sentiment, and mention-rate metrics. Skips partial-capture days (≥80% completeness + ≥10 snapshots required), excludes today, applies Benjamini-Hochberg FDR control across 3 simultaneous tests, marks persistent when 2+ consecutive points anomalous. Accepts optional segment parameter. | admin |
get_benchmarks | Compare project visibility against industry benchmarks (percentile rank) | viewer |
Enterprise (2)
| Tool | Description | Min Role |
|---|---|---|
get_audit_logs | SOC 2 compliance audit logs for an organization (user actions, data access, config changes) | admin |
get_revenue_attribution | Multi-touch revenue attribution: first_touch, last_touch, linear, time_decay, position_based | member |
Query Universe (9)
| Tool | Description | Min Role |
|---|---|---|
list_building_blocks | List building blocks for a project grouped by category (Core services, Modifiers) | viewer |
manage_building_blocks | Create, update, or delete building blocks | member |
compose_prompts | Generate prompt suggestions from building blocks (cap: 200) | viewer |
get_coverage_report | Get or regenerate Query Universe coverage report (dimension distributions, gaps, recommendations) | viewer |
seed_building_blocks | Seed building blocks from industry templates | admin |
get_orbit_model | Get the project's definition-orbit model: the four orbits (who-we-are, what-we-do, how-you-qualify, whom-we-serve), the block categories each maps to, and per-orbit completeness | viewer |
seed_orbit_blocks | Seed building blocks into one definition orbit's canonical block categories — same validation and plan gates as the building-blocks API | member |
backfill_prompts | Enrich existing prompts with enhanced classification (intent, journey stage, freshness, risk, SDS tier) | admin |
analyze_company_site | Discovery Autopilot: bounded crawl of the company's own site (up to 6 pages) plus one judge-pipeline extraction into a structured, evidence-quoted company profile for review. Consumes one AI-analysis quota unit; 5 analyses/hour per user | admin |
Agent-driven onboarding walkthrough: call analyze_company_site for a project, present the returned profile to the user for confirmation (items without an evidence quote are confidence low — treat them as suggestions to verify, never facts, and never write a certification the user has not explicitly confirmed), then apply the confirmed items with the write tools: manage_building_blocks (blocks), set_brand_facts (certifications as gate evidence), add_competitor, and update_project (category + industry business context). Finish with compose_prompts to generate query candidates from the confirmed universe.
Reports (10)
| Tool | Description | Min Role |
|---|---|---|
generate_report | Generate an AEO report for a project. Supports multiple formats (PDF, slide PDF, Excel, CSV) and report types (executive, standard, comprehensive, competitive, custom, per_prompt, aeo_program — the board-ready define→project→credibility program story). Returns report ID, download URL, AI brand score, and letter grade. | admin |
get_report_history | Get report generation history for a project. Returns past reports with metadata, scores, and download URLs. | viewer |
get_report_download | Get a signed download URL for a specific report. URL expires after 1 hour. | viewer |
create_report_share | Create a shareable link for a report. Supports optional password protection, expiry, and comment permissions. | admin |
list_report_shares | List all shared report links for a project, including view counts and status. | member |
revoke_report_share | Revoke (deactivate) a shared report link. The link will no longer be accessible. | admin |
list_scheduled_reports | List recurring scheduled reports for the organization (cadence, recipients, timezone/send hour; channel secrets redacted). Org owner/admin only | admin |
create_scheduled_report | Create a recurring scheduled report delivered by email at a chosen local time (types: quick, executive, standard, comprehensive, competitive, per_prompt, aeo_program). Delivery channels stay dashboard-only. Org owner/admin only | admin |
update_scheduled_report | Update a scheduled report — pause/resume, recipients, cadence, timezone, send hour, or voice. Org owner/admin only | admin |
delete_scheduled_report | Delete a recurring scheduled report so it stops being sent. Org owner/admin only | admin |
Schedules (3)
| Tool | Description | Min Role |
|---|---|---|
list_schedules | List recurring snapshot-capture schedules for a project (name, frequency, next run, active state) | viewer |
create_schedule | Create a recurring snapshot-capture schedule (daily/weekly/biweekly/monthly) across all active prompts and models. Nothing runs until the schedule's first due time; pass run_now: true to also enqueue one immediate first capture (spends credits now; default false) | admin |
delete_schedule | Delete a recurring snapshot-capture schedule for a project | admin |
Goals (3)
| Tool | Description | Min Role |
|---|---|---|
list_goals | List visibility goals with milestones and pace status. Filter by status or segment. | viewer |
create_goal | Create a goal with auto-computed milestones. Supports 7 metrics across 4 segments. Returns feasibility assessment. | member |
update_goal | Update a goal's target, date, status, or notes. | member |
Insights (2)
| Tool | Description | Min Role |
|---|---|---|
list_insights | List intelligence insights generated by computation engines. Filter by type (11 types), severity, or status. | viewer |
update_insight | Acknowledge, dismiss, or convert an insight to an action. | member |
Intelligence (4)
| Tool | Description | Min Role |
|---|---|---|
get_intelligence_scores | Get all 6 intelligence scores: BNCI, CMCS, MEI, SDI, CIPS, ETAS. | viewer |
get_intelligence_summary | Get unified intelligence summary with KPIs, timeline, recommendations, and action counts. | viewer |
get_fusion_insights | Fuse AI visibility ↔ real traffic ↔ rank on your own page URLs. Returns a per-page fusion table + plain-language insights (cited-page→traffic, AI-vs-SEO divergence, AI-Overview share, first-party Google AI visibility from Search Console, social mention volume, …) with graceful degradation per connected source. Requires the fusion_insights feature (Professional+). Accepts optional segment. | viewer |
verify_action | Trigger scoped measurement for completed actions. Compares visibility before/after to measure real impact. Page-specific fusion actions also report the page's AI-referral sessions, Google position, and citation deltas. | admin |
Quick Audit (1)
| Tool | Description | Min Role |
|---|---|---|
quick_audit | Run a 3-model brand check (ChatGPT, Claude, Gemini). Returns which models mention the brand with excerpts. | member |
Capture Runs (3)
| Tool | Description | Min Role |
|---|---|---|
list_runs | List capture runs — the receipt for each capture pass: expected vs actual snapshot counts, status, duration, shape hashes, trigger, and label. Dollar cost fields appear for org owner/admin tokens only | viewer |
get_run | Get one run's full detail: the run row, its snapshots, per-engine completion, the prompt × engine completion matrix, same-shape run history, and the previous same-shape run for diffing | viewer |
diff_runs | Diff two capture runs: full apples-to-apples when shape hashes match, intersection-only plus a shape-drift block otherwise. Per-cell deltas: brand mentions, sentiment, rank, snapshot count. expected_comparable is false when either run has no expected count — see the note below | viewer |
expected_snapshot_countcan benullonlist_runs,get_runanddiff_runs, since 2026-09-06. A run refused before it was sized — a paused organisation, or a credit gate, both of which stop the run before its fan-out is computed — has no expected count, and the field says so rather than reporting0. Zero is a different statement: it means the run was sized and had nothing to capture.A client that renders
actual / expectedshould print something like "not sized" for the null case rather than a fraction.diff_runscarriesexpected_comparable: boolean— false when either run has no expected count, because there is no delta to take against an absence. The per-celldiffscount what was actually captured and are unaffected.
Admin — Platform Owner (7)
These tools are physically absent from the tool list for anyone who is not a platform owner — they never appear in tools/list for a normal customer token.
| Tool | Description | Min Role |
|---|---|---|
get_health_report | System health check across all platform components | platform_admin |
get_platform_stats | Platform-wide statistics — org/user/project/snapshot counts, 30-day usage + cost rollups, per-provider costs, daily trends, top users/orgs by cost | platform_admin |
platform_balance_check | Current OpenRouter balance, burn rate, and runway forecast | platform_admin |
platform_pause_org | Pause or unpause an organization's snapshot captures (args: org_id, action, duration_hours, reason) | platform_admin |
platform_top_orgs | Top organizations ranked by cost, token usage, and snapshot count | platform_admin |
platform_near_limit_orgs | Organizations approaching their plan limits (>80% usage on any dimension) | platform_admin |
platform_cost_intelligence | Per-org margin (revenue vs cost); optionally drill into one org for a project/user cost breakdown | platform_admin |
All platform-owner tools are only available to users whose email is listed in the PLATFORM_ADMIN_EMAILS environment variable.
Resources (11)
Resources are read-only data endpoints your AI assistant can browse for context. Three are static; the other eight are templated by ID.
| URI | Description |
|---|---|
aeo://projects | List of all projects in your organization |
aeo://models | All available AI models grouped by provider |
aeo://rate-limits | Rate-limit caps for every plan tier, plus your org's effective limits |
aeo://projects/{id}/summary | Project summary with key metrics |
aeo://projects/{id}/snapshots/recent | Last 10 snapshots for a project |
aeo://projects/{id}/competitors | Competitor list for a project |
aeo://projects/{id}/geo-audits | Recent GEO audit results for a project |
aeo://projects/{id}/ai-traffic | AI referral traffic summary for a project |
aeo://projects/{id}/actions | Pending insight actions for a project |
aeo://organizations/{id}/plan | Current plan, limits, and feature flags |
aeo://models/{provider} | Models from a specific provider |
Prompts (6)
Prompt templates generate structured reports from your data.
| Prompt | Description | Arguments |
|---|---|---|
weekly_report | Weekly AI visibility report with trends, highlights, recommendations; engines are compared inside each question type (the blended LLM comparison is included for compatibility, marked not to rank on) | project_id |
competitor_analysis | Competitor comparison: share of voice, overlap, rankings | project_id, days? |
content_recommendations | Content improvement suggestions from snapshot analyses | project_id, limit? |
visibility_summary | Quick current-state summary with today's metrics and alerts | project_id |
geo_optimization | GEO optimization plan based on the latest audit results | project_id |
ai_traffic_analysis | Analyze AI referral traffic trends with growth strategies | project_id, days? |
Rate Limits
Rate limits are enforced per token and tiered by your organization's plan:
| Plan | Requests / minute | Requests / hour | Captures / hour |
|---|---|---|---|
| Free / Starter (baseline) | 60 | 1,000 | 10 |
| Pro-Individual | 60 | 500 | 5 |
| Pro-SME (and legacy Professional) | 120 | 2,000 | 20 |
| Enterprise-Brand (and legacy Enterprise) | 240 | 10,000 | 50 |
| Enterprise-Agency | 360 | 20,000 | 100 |
| Custom | 600 | 50,000 | 500 |
The per-minute and per-hour caps cover all tools (resource reads and prompt fetches count too); the captures cap applies to capture_snapshot only. Unknown or missing plans fall back to the free-tier baseline — never a more permissive tier. The aeo://rate-limits resource advertises every tier's caps plus your org's effective limits, read from the same table the limiter enforces.
When rate limited, the tool returns an error with a retryAfterSeconds value.
Error Handling
Tool errors are returned as content with isError: true:
| Status Code | Meaning |
|---|---|
| 401 | Missing, invalid, expired, or revoked token |
| 403 | Insufficient role or cross-org access denied |
| 404 | Resource not found |
| 429 | Rate limit exceeded |
| 500 | Internal server error |
Audit Logging
Every tool call is logged for security and usage tracking:
- Who: Token, user, organization
- What: Tool name, input parameters (sanitized)
- When: Timestamp and duration
- Result: Success or error
Audit logs are viewable by organization admins.
Example Conversations
Check Mention Rate & Visibility Score
You: How is my brand doing on AI search engines today?
AI (calls
list_projectsthenget_dashboard_metrics): Over the last 30 days your brand "TechShu" has a 30% mention rate and a Visibility Score of 49/100 across AI search engines, with a sentiment score of 72%. Average rank position is 3.2, up from 3.5 in the prior 30 days.
Capture a Snapshot
You: Run a snapshot for my "best CRM software" prompt
AI (calls
list_promptsto find the prompt, thencapture_snapshot): Captured responses from 8 AI models. Your brand was mentioned in 3 out of 8 responses. Sentiment was positive in 2 and neutral in 1.
Weekly Report
You: Generate my weekly visibility report
AI (invokes
weekly_reportprompt): Here's your weekly report for TechShu AEO Tracking...
OAuth 2.1 Developer Reference
If you're building an MCP client or integration that needs OAuth (rather than static tokens), here are the technical details.
Discovery
Your client should first fetch the Protected Resource Metadata to find the authorization server:
Then fetch the Authorization Server Metadata:
Dynamic Client Registration
Register your client automatically (RFC 7591):
Redirect URIs must be either localhost (any port) or HTTPS.
Authorization Flow
- Generate a PKCE code verifier (43-128 character random string) and its S256 challenge
- Redirect the user to the authorization endpoint:
- User logs in, sees the consent screen, picks their organization and role cap, and approves
- User is redirected to your
redirect_uriwith?code=AUTH_CODE
Token Exchange
Exchange the authorization code for tokens:
Response:
Refresh Tokens
When the access token expires, use the refresh token to get a new one:
Token Revocation
Revoke an access token or refresh token (RFC 7009):
Always returns HTTP 200, regardless of whether the token was valid.
OAuth Scopes
| Scope | What It Grants |
|---|---|
mcp:tools | Access to all 120 MCP tools |
mcp:resources | Access to all 11 MCP resources |
mcp:prompts | Access to all 6 MCP prompt templates |
All three scopes are granted by default if no scope is specified.
Compatibility
| Platform | Auth Methods | Status |
|---|---|---|
| Claude Desktop | Bearer token, OAuth | Supported |
| Claude Code (CLI) | Bearer token | Supported |
| ChatGPT (developer mode) | OAuth | Supported |
| OpenAI Codex (CLI + IDE + desktop) | OAuth (recommended), Bearer token | Supported |
| Cursor | Bearer token | Supported (all customer tools) |
| Windsurf | Bearer token | Supported |
| VS Code + Copilot | Bearer token, OAuth | Supported (v1.99+) |
| Google Gemini | Bearer token, OAuth | Supported (SDK-level) |
| Amazon Q Developer | Bearer token | Supported |
| OpenAI Agents SDK | Bearer token | Supported |
| Anthropic API | Bearer token | Supported |