AEO Optima Docs
Reference

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:

  1. Log in to the AEO Optima dashboard
  2. Go to Settings > MCP / API
  3. Click Generate New Token
  4. Give it a name (e.g., "Claude Desktop") and select a role cap
  5. Copy the token immediately — it's shown only once
  6. 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:

  1. A browser window opens with the AEO Optima login page
  2. You log in (or are already logged in)
  3. A consent screen shows what the AI client is requesting
  4. You pick your organization and approve
  5. 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)

claude mcp add aeo-optima --transport http \
  https://aeo-optima-mcp.onrender.com/mcp \
  --header "Authorization: Bearer aeo_YOUR_TOKEN"

Cursor

Create or edit .cursor/mcp.json in your project root:

{
  "mcpServers": {
    "aeo-optima": {
      "url": "https://aeo-optima-mcp.onrender.com/mcp",
      "headers": {
        "Authorization": "Bearer aeo_YOUR_TOKEN"
      }
    }
  }
}

Windsurf

Edit ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "aeo-optima": {
      "url": "https://aeo-optima-mcp.onrender.com/mcp",
      "headers": {
        "Authorization": "Bearer aeo_YOUR_TOKEN"
      }
    }
  }
}

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:

[mcp_servers.aeo-optima]
url = "https://aeo-optima-mcp.onrender.com/mcp"
auth = "oauth"

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):

[mcp_servers.aeo-optima]
url = "https://aeo-optima-mcp.onrender.com/mcp"
bearer_token_env_var = "AEO_OPTIMA_TOKEN"

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.

  1. In ChatGPT, open Settings → Security and login and turn on Developer mode.
  2. 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.
  3. Choose OAuth as the authentication. AEO Optima supports Dynamic Client Registration, so no client ID or secret is needed.
  4. 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)

from agents import MCPServerStreamableHttp
 
mcp = MCPServerStreamableHttp(
    url="https://aeo-optima-mcp.onrender.com/mcp",
    headers={"Authorization": "Bearer aeo_YOUR_TOKEN"}
)

Anthropic API (Direct)

Use the mcp_servers parameter in the Messages API:

{
  "mcp_servers": [{
    "type": "url",
    "url": "https://aeo-optima-mcp.onrender.com/mcp",
    "name": "aeo-optima",
    "authorization_token": "aeo_YOUR_TOKEN"
  }]
}

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:

RoleRead DataWrite DataView CostsAdmin Tools
viewerProjects, snapshots, analytics, prompts, modelsNoNoNo
memberEverything a viewer can + usage/cost dataCapture snapshots, create/update prompts, analyze pagesYesNo
adminEverythingEverything a member canYesNo
ownerEverythingEverythingYesNo

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):

{ "project_id": "...", "limit": 50, "cursor": "eyJjcmVhdGVkX2F0Ijoi..." }

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)

ToolDescriptionMin Role
list_projectsList all projects in your organizationviewer
get_projectGet detailed project info (brand, competitors, LLM configs)viewer
create_projectCreate 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 quotamember
update_projectUpdate a project's core fields (name, brand, website, description) and its category/industry business context (merge-only settings write). Org owner/admin onlyadmin
get_brand_factsList the project's Brand Facts — verified key-value facts (founding year, HQ, pricing, certifications) ordered by category then keyviewer
get_claim_libraryThe 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 factviewer
set_brand_factsCreate 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 onlyadmin
add_competitorAdd a competitor to track (case-insensitive duplicate rejection, URL validation)member
remove_competitorRemove a tracked competitor from a project. Org owner/admin onlyadmin

Snapshots (3)

ToolDescriptionMin Role
get_snapshotsRetrieve snapshots with filters (date, model, sentiment, brand mention)viewer
get_snapshot_detailGet full AI response text and analysis for a snapshotviewer
capture_snapshotCapture new AI responses for a prompt across models (rate limit: 10/hr)member

Analytics (4)

ToolDescriptionMin Role
get_dashboard_metricsKPI 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 replacementviewer
get_analyticsVisibility 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 blendviewer
get_usage_metricsToken usage and cost breakdown by provider, model, daymember
get_sentiment_breakdownSentiment analysis by prompt and modelviewer

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.

ToolDescriptionMin Role
get_entity_analysisBrand attribute extraction from snapshots, clarity scoring (0-100), verified against brand facts. Accepts optional segment parameter.viewer
get_shopping_visibilityShopping keyword detection, position tracking, price accuracy, competitor analysis. Accepts optional segment parameter.viewer
get_multi_language_analysisPer-language visibility, character-range detection (CJK/Arabic/Cyrillic), localized recommendations. Accepts optional segment parameter.viewer
list_emerging_competitorsBrands extracted from snapshots that are not yet in your configured competitor list, ranked by mention count over the last N daysviewer
get_share_of_modelShare 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 enginesviewer

Sentiment counting (changed 4 September 2026): wherever a tool returns a sentimentBreakdown, its positive, neutral and negative counts 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) and notNamed (your brand was not in the answer, so no judgement was possible). Before this date an answer with no verdict was counted as neutral, which reported a missing judgement as a neutral opinion. The three key names and their types are unchanged, so existing integrations keep working; a neutral figure 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, and generate_report — accept an optional segment parameter (all, branded, non-branded, or competitor) to filter by prompt type. All REST API analytics endpoints also accept ?segment= as a query parameter.

Prompts (9)

ToolDescriptionMin Role
list_promptsList monitoring prompts for a project (includes topic)viewer
create_promptCreate a new monitoring promptmember
update_promptUpdate 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_promptSoft-delete a monitoring prompt — hidden from analytics but capture history is preserved (30-day snapshot restore window). Org owner/admin onlyadmin
discover_promptsAI-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 creditsadmin
fanout_promptGenerate 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 creditsadmin
get_prompt_gapsCompetitive 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_intentClassify search intent for prompts with the rule-based classifier and persist changed intents. No LLM spendmember
estimate_volumeEstimate and persist relative search-volume scores (1-100) for active prompts from text heuristics + database signals. No LLM spendmember

Page Analysis (1)

ToolDescriptionMin Role
analyze_pageAnalyze a URL for AEO score (0-100) across 6 categories with improvement suggestionsadmin

Models (1)

ToolDescriptionMin Role
list_modelsList available AI models from the dynamic registry, optionally filtered by providerviewer

Alerts (6)

ToolDescriptionMin Role
get_alertsSurface 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_rulesList the configured alert rules for a project (rule type, threshold, active state, notify settings)viewer
create_alert_ruleCreate 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 onlyadmin
delete_alert_ruleDelete an alert rule from a project. Org owner/admin onlyadmin
get_answer_changesProactive 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_typeviewer
get_model_driftModel-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 firstviewer

AI Analysis (2)

ToolDescriptionMin Role
run_analysisRun AI-powered analysis: sentiment_drivers, content_gaps, opportunity_scoring, comprehensiveadmin
get_analysis_resultsRetrieve completed AI analysis results for a projectviewer

Criteria Map (2)

ToolDescriptionMin Role
get_criteria_mapGet 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 factsviewer
run_criteria_derivationRun 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 runadmin

AEO Program (1)

ToolDescriptionMin Role
get_aeo_programGet 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 demandviewer

Actions (2)

ToolDescriptionMin Role
list_actionsList insight actions (auto-generated from AI analysis or manual)viewer
update_actionUpdate an action's status (pending, in_progress, completed, dismissed) or notesmember

Plan & Quotas (1)

ToolDescriptionMin Role
get_plan_infoGet organization plan, feature flags, quota limits, and current usage countsviewer

GEO Audit (3)

ToolDescriptionMin Role
run_geo_auditRun 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_auditSite-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 runadmin
list_geo_auditsList past GEO audit results for a projectviewer

GA4 (3)

ToolDescriptionMin Role
get_ai_trafficGet AI referral traffic data from Google Analytics 4 (sessions, users, pageviews from ChatGPT, Perplexity, Claude, Gemini)viewer
get_ga4_statusCheck GA4 connection status for a projectviewer
get_prompt_attributionPrompt-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 tokensviewer

GSC (3)

ToolDescriptionMin Role
get_search_performanceGet Google Search Console data (clicks, impressions, CTR, position) for top queriesviewer
get_gsc_statusCheck Google Search Console connection status for a projectviewer
get_search_contextMap 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 GSCviewer

Webhooks (2)

ToolDescriptionMin Role
list_webhooksList webhook endpoints registered for the organizationadmin
get_webhook_deliveriesGet recent delivery logs for a webhook endpointadmin

Citation Intelligence (4)

ToolDescriptionMin Role
get_citationsGet citation sources for a project with aggregated counts, category breakdowns, and per-engine mention-vs-citation splitviewer
analyze_citation_gapsIdentify sources that cite competitors but not your brand — actionable outreach targetsmember
get_domain_authorityGet domain authority scores for citation sources (frequency, recency, cross-model presence)viewer
get_contribution_gridGet 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)

ToolDescriptionMin Role
get_crawler_dashboardAI bot monitoring dashboard — activity logs, blocked/allowed status, detected patternsviewer
analyze_robotsAnalyze robots.txt and ai.txt for AI bot configuration with recommendationsadmin
get_ai_crawl_analyticsAI-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 aboveviewer
configure_crawl_log_sourceCreate 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 aboveadmin

Content Intelligence (6)

ToolDescriptionMin Role
generate_faqsGenerate FAQ content from project prompts and brand facts (suitable for FAQ schema)admin
generate_schema_markupGenerate JSON-LD structured data for a URL using brand facts and page contentadmin
get_correctionsGet hallucination correction submissions (drafts, submitted, resolved)viewer
submit_correctionHallucination-correction workflow: generate builds provider-specific correction-request templates from the issue context; create saves a draft correction submissionmember
generate_content_briefGEO-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_briefsList persisted Content Briefs (levers, gap summary, coverage, expected lift, status draft/applied/verified, linked action id), newest firstviewer

Connectors (2)

ToolDescriptionMin Role
list_connectorsList registered connectors (Serper, DataForSEO, Slack, Looker, Zapier, Shopify)admin
manage_connectorCreate, test, sync, or delete a connectoradmin

Predictive & Edge (3)

ToolDescriptionMin Role
get_visibility_forecastVisibility 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_anomaliesCompleteness-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_benchmarksCompare project visibility against industry benchmarks (percentile rank)viewer

Enterprise (2)

ToolDescriptionMin Role
get_audit_logsSOC 2 compliance audit logs for an organization (user actions, data access, config changes)admin
get_revenue_attributionMulti-touch revenue attribution: first_touch, last_touch, linear, time_decay, position_basedmember

Query Universe (9)

ToolDescriptionMin Role
list_building_blocksList building blocks for a project grouped by category (Core services, Modifiers)viewer
manage_building_blocksCreate, update, or delete building blocksmember
compose_promptsGenerate prompt suggestions from building blocks (cap: 200)viewer
get_coverage_reportGet or regenerate Query Universe coverage report (dimension distributions, gaps, recommendations)viewer
seed_building_blocksSeed building blocks from industry templatesadmin
get_orbit_modelGet 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 completenessviewer
seed_orbit_blocksSeed building blocks into one definition orbit's canonical block categories — same validation and plan gates as the building-blocks APImember
backfill_promptsEnrich existing prompts with enhanced classification (intent, journey stage, freshness, risk, SDS tier)admin
analyze_company_siteDiscovery 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 useradmin

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)

ToolDescriptionMin Role
generate_reportGenerate 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_historyGet report generation history for a project. Returns past reports with metadata, scores, and download URLs.viewer
get_report_downloadGet a signed download URL for a specific report. URL expires after 1 hour.viewer
create_report_shareCreate a shareable link for a report. Supports optional password protection, expiry, and comment permissions.admin
list_report_sharesList all shared report links for a project, including view counts and status.member
revoke_report_shareRevoke (deactivate) a shared report link. The link will no longer be accessible.admin
list_scheduled_reportsList recurring scheduled reports for the organization (cadence, recipients, timezone/send hour; channel secrets redacted). Org owner/admin onlyadmin
create_scheduled_reportCreate 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 onlyadmin
update_scheduled_reportUpdate a scheduled report — pause/resume, recipients, cadence, timezone, send hour, or voice. Org owner/admin onlyadmin
delete_scheduled_reportDelete a recurring scheduled report so it stops being sent. Org owner/admin onlyadmin

Schedules (3)

ToolDescriptionMin Role
list_schedulesList recurring snapshot-capture schedules for a project (name, frequency, next run, active state)viewer
create_scheduleCreate 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_scheduleDelete a recurring snapshot-capture schedule for a projectadmin

Goals (3)

ToolDescriptionMin Role
list_goalsList visibility goals with milestones and pace status. Filter by status or segment.viewer
create_goalCreate a goal with auto-computed milestones. Supports 7 metrics across 4 segments. Returns feasibility assessment.member
update_goalUpdate a goal's target, date, status, or notes.member

Insights (2)

ToolDescriptionMin Role
list_insightsList intelligence insights generated by computation engines. Filter by type (11 types), severity, or status.viewer
update_insightAcknowledge, dismiss, or convert an insight to an action.member

Intelligence (4)

ToolDescriptionMin Role
get_intelligence_scoresGet all 6 intelligence scores: BNCI, CMCS, MEI, SDI, CIPS, ETAS.viewer
get_intelligence_summaryGet unified intelligence summary with KPIs, timeline, recommendations, and action counts.viewer
get_fusion_insightsFuse 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_actionTrigger 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)

ToolDescriptionMin Role
quick_auditRun a 3-model brand check (ChatGPT, Claude, Gemini). Returns which models mention the brand with excerpts.member

Capture Runs (3)

ToolDescriptionMin Role
list_runsList 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 onlyviewer
get_runGet 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 diffingviewer
diff_runsDiff 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 belowviewer

expected_snapshot_count can be null on list_runs, get_run and diff_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 reporting 0. Zero is a different statement: it means the run was sized and had nothing to capture.

A client that renders actual / expected should print something like "not sized" for the null case rather than a fraction. diff_runs carries expected_comparable: boolean — false when either run has no expected count, because there is no delta to take against an absence. The per-cell diffs count 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.

ToolDescriptionMin Role
get_health_reportSystem health check across all platform componentsplatform_admin
get_platform_statsPlatform-wide statistics — org/user/project/snapshot counts, 30-day usage + cost rollups, per-provider costs, daily trends, top users/orgs by costplatform_admin
platform_balance_checkCurrent OpenRouter balance, burn rate, and runway forecastplatform_admin
platform_pause_orgPause or unpause an organization's snapshot captures (args: org_id, action, duration_hours, reason)platform_admin
platform_top_orgsTop organizations ranked by cost, token usage, and snapshot countplatform_admin
platform_near_limit_orgsOrganizations approaching their plan limits (>80% usage on any dimension)platform_admin
platform_cost_intelligencePer-org margin (revenue vs cost); optionally drill into one org for a project/user cost breakdownplatform_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.

URIDescription
aeo://projectsList of all projects in your organization
aeo://modelsAll available AI models grouped by provider
aeo://rate-limitsRate-limit caps for every plan tier, plus your org's effective limits
aeo://projects/{id}/summaryProject summary with key metrics
aeo://projects/{id}/snapshots/recentLast 10 snapshots for a project
aeo://projects/{id}/competitorsCompetitor list for a project
aeo://projects/{id}/geo-auditsRecent GEO audit results for a project
aeo://projects/{id}/ai-trafficAI referral traffic summary for a project
aeo://projects/{id}/actionsPending insight actions for a project
aeo://organizations/{id}/planCurrent plan, limits, and feature flags
aeo://models/{provider}Models from a specific provider

Prompts (6)

Prompt templates generate structured reports from your data.

PromptDescriptionArguments
weekly_reportWeekly 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_analysisCompetitor comparison: share of voice, overlap, rankingsproject_id, days?
content_recommendationsContent improvement suggestions from snapshot analysesproject_id, limit?
visibility_summaryQuick current-state summary with today's metrics and alertsproject_id
geo_optimizationGEO optimization plan based on the latest audit resultsproject_id
ai_traffic_analysisAnalyze AI referral traffic trends with growth strategiesproject_id, days?

Rate Limits

Rate limits are enforced per token and tiered by your organization's plan:

PlanRequests / minuteRequests / hourCaptures / hour
Free / Starter (baseline)601,00010
Pro-Individual605005
Pro-SME (and legacy Professional)1202,00020
Enterprise-Brand (and legacy Enterprise)24010,00050
Enterprise-Agency36020,000100
Custom60050,000500

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:

{
  "content": [{ "type": "text", "text": "{\"error\": \"...\", \"statusCode\": 401}" }],
  "isError": true
}
Status CodeMeaning
401Missing, invalid, expired, or revoked token
403Insufficient role or cross-org access denied
404Resource not found
429Rate limit exceeded
500Internal 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_projects then get_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_prompts to find the prompt, then capture_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_report prompt): 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:

GET https://aeo-optima-mcp.onrender.com/.well-known/oauth-protected-resource

Then fetch the Authorization Server Metadata:

GET https://aeo.techshu.ai/.well-known/oauth-authorization-server

Dynamic Client Registration

Register your client automatically (RFC 7591):

POST https://aeo.techshu.ai/api/mcp/oauth/register
Content-Type: application/json

{
  "client_name": "My AI Tool",
  "redirect_uris": ["http://localhost:3000/callback"],
  "grant_types": ["authorization_code"],
  "response_types": ["code"],
  "token_endpoint_auth_method": "none"
}

Redirect URIs must be either localhost (any port) or HTTPS.

Authorization Flow

  1. Generate a PKCE code verifier (43-128 character random string) and its S256 challenge
  2. Redirect the user to the authorization endpoint:
GET https://aeo.techshu.ai/api/mcp/oauth/authorize
  ?response_type=code
  &client_id=mcp_YOUR_CLIENT_ID
  &redirect_uri=http://localhost:3000/callback
  &code_challenge=BASE64URL_S256_HASH
  &code_challenge_method=S256
  &scope=mcp:tools mcp:resources mcp:prompts
  1. User logs in, sees the consent screen, picks their organization and role cap, and approves
  2. User is redirected to your redirect_uri with ?code=AUTH_CODE

Token Exchange

Exchange the authorization code for tokens:

POST https://aeo.techshu.ai/api/mcp/oauth/token
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code
&code=AUTH_CODE
&client_id=mcp_YOUR_CLIENT_ID
&redirect_uri=http://localhost:3000/callback
&code_verifier=YOUR_ORIGINAL_VERIFIER

Response:

{
  "access_token": "oat_...",
  "token_type": "bearer",
  "expires_in": 3600,
  "refresh_token": "ort_...",
  "scope": "mcp:tools mcp:resources mcp:prompts"
}

Refresh Tokens

When the access token expires, use the refresh token to get a new one:

POST https://aeo.techshu.ai/api/mcp/oauth/token
Content-Type: application/x-www-form-urlencoded

grant_type=refresh_token
&refresh_token=ort_YOUR_REFRESH_TOKEN
&client_id=mcp_YOUR_CLIENT_ID

Token Revocation

Revoke an access token or refresh token (RFC 7009):

POST https://aeo.techshu.ai/api/mcp/oauth/revoke
Content-Type: application/x-www-form-urlencoded

token=oat_OR_ort_TOKEN

Always returns HTTP 200, regardless of whether the token was valid.

OAuth Scopes

ScopeWhat It Grants
mcp:toolsAccess to all 120 MCP tools
mcp:resourcesAccess to all 11 MCP resources
mcp:promptsAccess to all 6 MCP prompt templates

All three scopes are granted by default if no scope is specified.


Compatibility

PlatformAuth MethodsStatus
Claude DesktopBearer token, OAuthSupported
Claude Code (CLI)Bearer tokenSupported
ChatGPT (developer mode)OAuthSupported
OpenAI Codex (CLI + IDE + desktop)OAuth (recommended), Bearer tokenSupported
CursorBearer tokenSupported (all customer tools)
WindsurfBearer tokenSupported
VS Code + CopilotBearer token, OAuthSupported (v1.99+)
Google GeminiBearer token, OAuthSupported (SDK-level)
Amazon Q DeveloperBearer tokenSupported
OpenAI Agents SDKBearer tokenSupported
Anthropic APIBearer tokenSupported
MCP API Reference — AEO Optima