MCP server
Getting started with the aeomcp MCP server
Connect to the host you were given — production and staging are separate
deployments on separate domains, and this page ships inside the server image,
so it is the same text in both. The path is always /mcp (Streamable HTTP)
on whichever host you are pointed at:
claude mcp add aeomcp --transport http https://<your-aeomcp-host>/mcp
If you are unsure which host that is, the server tells you: fetch
/.well-known/oauth-protected-resource on it and read the resource field.
That document is public and needs no credential — it is the same value this
deployment validates tokens against, so it is authoritative in a way a
documentation page cannot be.
Authenticating
The credential most people use is a personal access token (apt_…),
created in the studio at /o/<org>/connect ("Connect MCP"): pick your
assistant and up to five client workspaces, and the page shows the exact
claude mcp add … --header "Authorization: Bearer apt_…" command or config
block for it, once. What it can change depends on your role (see
authentication.md). Send it as Authorization: Bearer apt_…. An API key (awk_…, Settings →
API keys, explicit scopes) is the credential for agents, CI and servers.
Interactive OAuth sign-in is supported by the server but is not enabled on
every deployment. Check before relying on it: if
/.well-known/oauth-protected-resource lists an authorization_servers
member, OAuth is available and your MCP host will discover the flow from
there. If that member is absent, this deployment is API-key-only — an
absent member is a deliberate "not advertised here" rather than an oversight
(see authentication.md).
First calls
Start with get_account_context: it returns your organization, role,
permitted workspaces, plan, scopes and feature flags.
The tools you see are exactly the tools your role, plan and scopes allow —
nothing is advertised that you cannot call, so tools/list is itself an
answer about your permissions. describe_capabilities shows the full
picture: every tool this server knows about, which ones your token can call
right now, and the tier and scope each one needs.
Every analytical tool takes the same window argument (start_date, end_date,
engines, filters) and returns the same columnar envelope: columns, rows,
row_count, and a trace_id you can quote to support.
window.location_id narrows to one market location (ids come from
list_market_locations); omit it for every answer, with a location-tracked
prompt's cities averaged so the prompt counts once.
Every tool also accepts an optional context (one sentence on your goal;
logged, never required) and, on list and report tools, fields (the subset
of columns you want back, in the tool's order). See reports, templates
and peec-to-aeomcp.
list_prompts, get_prompt, export_prompts, list_prompt_candidates,
get_answer and get_answers_report carry three more columns —
monthly_volume, volume_keyword, volume_as_of: the Google search demand
of the keyword linked to each prompt. This is how often people search Google
for that keyword, not how often AI engines are asked the prompt, and it is
null (never 0) when nothing is linked or measured.
get_prompt also returns geo_local and by_location — for a
location-tracked prompt, each location's answered chats and own-brand
visibility over the window (empty for any other prompt).
Creating and updating brands, prompts, topics, tags and classifications
goes through a separate, bulk-only contract — dry_run to preview,
idempotency_key to retry safely — covered in writes. The same page
covers configuring a workspace (its collection schedule, daily watchlist,
brand profile and topics) and starting a collection round on demand, both
of which agents can do directly.
Tools also exist for run/collection status, plan capacity and usage,
agency portfolio views (across the workspaces a plan grants), and member
and MCP-connection reads — see tools.md for the full catalog.
get_run's warnings column groups a run's warnings as
{code, engine, count, sample} (e.g. geo_units_summary: how many location
runs could not be verified), and get_plan_and_usage carries
local_tracking_contexts / daily_local_tracking_contexts rows — the 10%
local-tracking allowance and its use.
Engines
window.engines names public engine names: chatgpt,
google_ai_mode (Google AI Mode), google_ai_overview (Google AI Overview —
opt-in per workspace, collects only where Google shows an overview; queries
with none come back answered: false), gemini. google_ai is
also accepted and means both Google engines (google_ai_mode and
google_ai_overview) together.
Every envelope's provenance.engine_ids maps each public engine name in
your query to the internal id(s) it resolved to (support/trace_id
lookups use these). Most names resolve to one id (a plain string); google_ai
resolves to an array of both — provenance.engine_ids.google_ai is now
["google-0", "google-aio-0"] (previously a single id string). If your
client assumed a single string for every key, handle the array case for
google_ai specifically.
The Google AI Mode relabel (what used to be google_ai_overview is now
google_ai_mode) and the new AI Overview channel are described in
release-notes-google-ai-overview — read it if your client stores engine
names or parses provenance.engine_ids.