AthenaHQ
REMOTE · API.ATHENAHQ.AI
Track how AI assistants mention, cite, and rank your brand and competitors in AI search.
Available components
Last scanned (11 hours ago)
Scores higher than 52% of remote servers
Reachable. Last reached 5 Nov 2026.
Category Marketing and SEO
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security63
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (add_brand_facts). See how to fix → View diagnostics → Fail
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability34
- 0% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Fail
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 19329 tokens (~169/item across 114 items; 113 tools + 1 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management63
- Stability check failed: schema churn in the 20 days we've observed: 4 tool removals, 0 breaking changes, 0 auth/transport breaks, 14 additions. See how to fix → Fail
Tool Coverage77
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 21% of tool parameters carry a description.Partial
- Structured output schemas are declared (99% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 10 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 114 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
- Supports UI / widget rendering.Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 4 Nov 26 +1
- “query_metrics” reworded the description of “compare” cosmetic
1 cosmetic change on this day. Switch on “Show cosmetic changes” to see it.
- 2 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 49 to 53.
- 30 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 39 to 43.
- 29 Oct 26 0
- New tool “remove_competitors”, which the server declares destructive security
- New tool “add_competitors” functional
- 28 Oct 26 +1
- New tool “list_api_keys” functional
- 26 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 26 to 29.
- 24 Oct 26 0
- Tool “query_metrics” rewrote its description, which is the text the model reads security
- Tool “query_rows” rewrote its description, which is the text the model reads security
- Schema quality: 144 → 169 ▼ functional
- “query_metrics” reworded the description of “from” cosmetic
- “query_rows” reworded the description of “from” cosmetic
- 23 Oct 26 +1
- Tool “start_prompt_discovery” rewrote its description, which is the text the model reads security
- New tool “find_more_prompt_discovery” functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Probed https://api.athenahq.ai/api/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=api.athenahq.ai | CN=YR1,O=Let's Encrypt,C=US | 29 Sept 2026 | 28 Dec 2026 | RSA 2048 | SHA256-RSA | 516d4f595351327c9abd9e2769a6d064ae1 |
| SANs: api.athenahq.ai | ||||||
| CN=YR1,O=Let's Encrypt,C=US (CA) | CN=Root YR,O=ISRG,C=US | 3 Sept 2025 | 2 Sept 2028 | RSA 2048 | SHA256-RSA | a20253f15f2691c05dc1ce13b9bcca4e |
| CN=Root YR,O=ISRG,C=US (CA) | CN=ISRG Root X1,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | RSA 4096 | SHA256-RSA | f24b6d17f9d9ad7cb1c9fea78782699f |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of api.athenahq.ai. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| ai. | present | 1814, 3799 | 8, 8 | Verified |
| athenahq.ai. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| strict-transport-security | max-age=63072000 |
| content-security-policy | default-src 'none'; frame-ancestors 'none'; base-uri 'none'; form-action 'none' |
| x-content-type-options | nosniff |
| x-frame-options | DENY |
| referrer-policy | no-referrer |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://api.athenahq.ai/api/mcp | Verified | 200 | |
| http (plaintext) | http://api.athenahq.ai/api/mcp | HTTPS enforced | 308 | https://api.athenahq.ai/api/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
get_mention_rate_cumulative ~67
Get cumulative mention rate — average mention rate for each competitor across the date range. mention_rate is absolute (share of all responses); relative_mention_rate is the share of responses mentioning any tracked brand.
| Name | Type | Req | Description |
|---|---|---|---|
| filters | object | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| data | object | yes | – |
No examples provided.
get_mention_rate_time_series ~74
Get mention rate over time — how often AI models mention the website by name, grouped by day. mention_rate is absolute (share of that day's responses); relative_mention_rate is the share of that day's responses mentioning any tracked brand.
| Name | Type | Req | Description |
|---|---|---|---|
| filters | object | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| data | array | yes | – |
No examples provided.
get_oracle_finding ~170
When grounding is present, use its complete team-confirmed statement and all supporting facts as joint evidence; the legacy fact ID/text are only a compatibility anchor. Load one Oracle finding in full: the flagged claim with its verified fact and prompt text, the run it came from, a ~2000-character response excerpt centered on the quoted claim, the cited-page evidence captured during the run (url, quote, snippet, scrape_hash), and its lineage: sibling findings sharing its lineage_id across runs, newest first. Use after get_oracle_findings to interrogate a specific finding. Returns a not-found error for an unknown finding id, and status 'no_access' if the brand does not have Oracle v2.
| Name | Type | Req | Description |
|---|---|---|---|
| finding_id | string | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| finding | – | yes | – |
| status | string | yes | – |
No examples provided.
get_oracle_findings ~482
When grounding is present, use its complete team-confirmed statement and all supporting facts as joint evidence; the legacy fact ID/text are only a compatibility anchor. List Oracle accuracy findings for a website: places where an AI response contradicted a verified brand fact (type 'inaccuracy' or 'kb_issue', with quote, claim, and reason) or where two knowledge-base facts conflict ('kb_duplicate' / 'kb_contradiction', pairing fact_text with related_fact_text). Findings from every status are included by default (pending, acknowledged, ignored, ...), each row carrying its status — pass the status filter for pending items only. Filters (run_id, fact_id, lineage_id, response_id, prompt_id, source_url, type, kind, severity, status) AND-compose; source_url matches evidence URLs exactly after normalization (protocol and trailing slash ignored). 'total' is the pre-limit count. 'latest_run' is the newest scan of any kind and is null only when the website has never been scanned, so latest_run plus empty findings means it scanned clean, while latest_run null means never scanned, not clean. Archived findings from before the current scanner ARE included: their run carries 'is_imported': true and keeps its original started_at, so an import can be the newest run — say the history is archived rather than calling it a current scan. 'has_imported_history' is true when any such archived run exists, and every finding row carries 'run_is_imported' so archival and current rows stay distinguishable in one list. Returns status 'no_access' if the brand does not have Oracle v2; that response carries the status alone, with no counts or findings.
| Name | Type | Req | Description |
|---|---|---|---|
| fact_id | string | – | – |
| kind | string | – | – |
| limit | integer | – | – |
| lineage_id | string | – | – |
| model | string | – | Filter to one AI model by product name (ChatGPT, Claude, Gemini, Perplexity, Copilot, Meta AI); raw identifiers also match exactly |
| prompt_id | string | – | – |
| response_id | string | – | – |
| run_id | string | – | – |
| severity | string | – | – |
| source_url | string | – | – |
| status | string | – | – |
| type | string | – | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| findings | array | – | – |
| has_imported_history | boolean | – | – |
| latest_run | – | – | – |
| notice | string | – | – |
| status | string | yes | – |
| total | integer | – | – |
No examples provided.
get_personas ~47
List personas configured for a website with per-persona prompt counts. Use it to resolve persona_id values returned by other tools to persona names and descriptions.
| Name | Type | Req | Description |
|---|---|---|---|
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| personas | array | yes | – |
No examples provided.
get_pillar_document ~53
Fetch a pillar's synthesized markdown document from the Knowledge Base. Returns document: null when the pillar exists but has no synthesized document yet.
| Name | Type | Req | Description |
|---|---|---|---|
| pillar_id | string | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| document | string|null | – | – |
| generated_at | string|null | – | – |
| name | string | – | – |
| pillar_id | string | – | – |
No examples provided.
get_pillars ~50
List a website's Knowledge Base pillars (excluding archived ones) with approved-fact counts, whether a synthesized document exists, and when each pillar was last researched.
| Name | Type | Req | Description |
|---|---|---|---|
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| pillars | array | – | – |
No examples provided.
get_pitch ~45
Get a pitch report by ID including competitors, prompts, attributes, top citing sources, and aggregate metrics (brand mentions, sentiment, response rate).
| Name | Type | Req | Description |
|---|---|---|---|
| pitch_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| attributes | array | yes | – |
| competitors | array | yes | – |
| metrics | object | yes | – |
| pitch | object | yes | – |
| prompts | array | yes | – |
| sources | array | yes | – |
No examples provided.
get_position_cumulative ~40
Get cumulative position — average ranking position for each competitor across the date range.
| Name | Type | Req | Description |
|---|---|---|---|
| filters | object | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| data | object | yes | – |
No examples provided.
get_position_distribution ~45
Get position distribution: share of responses where the brand ranks top/middle/bottom across the date range.
| Name | Type | Req | Description |
|---|---|---|---|
| filters | object | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| data | object | yes | – |
No examples provided.
get_position_time_series ~45
Get ranking position over time — average position of the website in AI model responses, grouped by day.
| Name | Type | Req | Description |
|---|---|---|---|
| filters | object | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| data | array | yes | – |
No examples provided.
get_prompt_discovery_runs ~134
Read Discover history and progress for a website, or supply the run ID returned by discovery launch to inspect one study. Distinguishes pending, running, completed, partial, failed and cancelled. limit bounds returned runs (default 10, maximum 20); has_more means older runs remain. This is read-only: it does not start research, monitor in the background or send notifications. Candidate results can be reviewed in the application's Discover page. Requires permission to view prompts; source visibility restrictions still apply.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | – |
| run_id | string | – | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| has_more | boolean | – | – |
| runs | array | – | – |
No examples provided.
get_prompt_schedules ~130
List the Default, custom and archived streaming schedules for a website. Use each row's selection value when filtering analytics or responses. Default includes all pre-cutover history and ad hoc runs; archived schedules retain results. To combine schedules, pass several selection values as an array in the schedule field of query_metrics and query_rows, or use a saved view that stores several schedules. Partner REST filters take one schedule. starts_on and ends_on bound a custom schedule's active period as UTC days (null means no bound); an active schedule outside its period does not run.
| Name | Type | Req | Description |
|---|---|---|---|
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| schedules | array | yes | – |
No examples provided.
get_prompt_tags ~44
List prompt tags for a website with per-tag prompt counts. Tag IDs can be used with the prompt_tags filter on the prompts endpoint.
| Name | Type | Req | Description |
|---|---|---|---|
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| prompt_tags | array | yes | – |
No examples provided.
get_prompts ~52
List prompts (search queries) tracked for a website
| Name | Type | Req | Description |
|---|---|---|---|
| prompt_tags | array | – | – |
| prompt_tags_operator | string | – | – |
| status | string | – | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| prompts | array | yes | – |
No examples provided.
get_response_detail ~43
Fetch a single LLM response by id with full sources, mentions, and rank details.
| Name | Type | Req | Description |
|---|---|---|---|
| response_id | string | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| response | object | yes | – |
No examples provided.
get_response_streaming_status ~57
Read the latest (or a specific) response-streaming run's whole-run state and response-queue progress. Only completed means downstream analysis has finished
| Name | Type | Req | Description |
|---|---|---|---|
| website_id | string | yes | – |
| workflow_id | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| config | object | yes | – |
| created_at | string|null | yes | – |
| finish_reason | – | yes | Why a "failed" or "cancelled" run ended: credits_exhausted (no credits remaining), credits_paused (credit allocation paused by the partner), subscription_inactive, organization_deleted, entitlement_u… |
| is_scheduled | boolean|null | yes | – |
| progress | object | yes | Response-queue completion only. These counts and percentage do not indicate downstream analysis readiness. |
| saved_response_progress | – | yes | Cached retained-response counts, separate from execution-queue progress. A missing completed_count_observed_at means the count is unmeasured, not zero. Initial fields preserve the last observed snaps… |
| state | string | yes | Whole-run state. Only "completed" means response collection and downstream analysis have finished; "running" can coexist with 100 percent response progress. |
| updated_at | string|null | yes | – |
| workflow_id | string|null | yes | – |
No examples provided.
get_responses ~243
Get LLM responses for a website. Shows how AI models answer queries, with sources, sentiment, and ranking data. Filter by whether a model used search queries or by text within those queries. For a variation-level export at volume, pair filters.variation_filter with include_response: false and compact_sources: true. That keeps the prompt, its variation, the model, the mentioned/cited flags and the cited domains while dropping the answer text, cutting each row to roughly a tenth of its size.
| Name | Type | Req | Description |
|---|---|---|---|
| compact_sources | boolean | – | Replace the per-source `sources` objects with `source_domains`, a deduped, sorted list of cited root domains. Defaults to false. Use when you need which domains were cited but not their exact URLs. |
| filters | object | yes | – |
| include_response | boolean | – | Include the full answer text on each row. Defaults to true. Set false to omit the `response` field entirely (the heaviest part of a row) when you only need which prompt/variation ran and how it score… |
| page_num | number | – | – |
| page_size | number | – | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| has_more | boolean | yes | – |
| notice | string | – | – |
| page_num | number | yes | – |
| page_size | number | yes | – |
| responses | array | yes | – |
| total | number | yes | – |
No examples provided.
get_saved_views ~28
List saved views (filter presets) for a website
| Name | Type | Req | Description |
|---|---|---|---|
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| saved_views | array | yes | – |
No examples provided.
get_seo_rankings ~61
Read saved Google organic rankings by explicit market and device alongside observed AI visibility. Includes recent history, missing-data reasons, freshness and committed provider budget. Does not trigger collection.
| Name | Type | Req | Description |
|---|---|---|---|
| property_id | string | – | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| billed_cost_usd | number | – | – |
| collection_enabled | boolean | – | – |
| committed_budget_usd | number | – | – |
| estimated_refresh_cost_usd | number | – | – |
| monthly_budget_usd | number | – | – |
| provider | string | – | – |
| refresh_cooldown_hours | number | – | – |
| requested_depth | number | – | – |
| rows | array | – | – |
| unknown_cost_jobs | integer | – | – |
No examples provided.
get_share_of_voice_cumulative ~66
Get cumulative share of voice — overall SOV for each competitor across the date range. Each entry also includes relative_mention_rate: the share of responses mentioning any tracked brand that mention this entity.
| Name | Type | Req | Description |
|---|---|---|---|
| filters | object | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| data | array | yes | – |
No examples provided.
get_share_of_voice_time_series ~71
Get share of voice over time — how often the website is mentioned vs competitors, grouped by day. Each entry also includes relative_mention_rate: the share of that day's responses mentioning any tracked brand that mention this entity.
| Name | Type | Req | Description |
|---|---|---|---|
| filters | object | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| data | array | yes | – |
No examples provided.
get_shopping_metrics ~153
Get the Shopping Insights dashboard for a website over a date range: how often the brand's products appear in AI shopping answers (product carousels) versus competitors, average position and price, the top own and competitor products, the competitor leaderboard, retailer (merchant) breakdown, rank distribution, price comparison, and a daily appearances trend. Rates are percentages 0-100; positions are 1-based (lower is better). Requires a paid plan.
| Name | Type | Req | Description |
|---|---|---|---|
| filters | object | yes | – |
| top_products_limit | integer | – | How many products to return in each of top_own_products and top_competitor_products, 1 to 50. Defaults to 10. |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| data | object | – | – |
No examples provided.
get_source_pages ~153
List individual cited URLs (pages) for a website with citation, mention, and impression metrics plus a per-URL daily sparkline. Each row is classified as owned / competitor / partner / third_party. Companion to get_sources (root-domain-level). Supports filters (date range, models, prompts, competitors, locations, personas), search, sort, and pagination.
| Name | Type | Req | Description |
|---|---|---|---|
| competitors_mentioned | string | – | – |
| filters | object | yes | – |
| mentioned | string | – | – |
| page_num | integer | – | – |
| page_size | integer | – | – |
| search | string|null | – | – |
| sort_direction | string | – | – |
| sort_field | string | – | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| notice | string | – | – |
| pages | array | yes | – |
| pagination | object | yes | – |
No examples provided.
get_sources ~144
List top cited sources (root domains) for a website with citation, mention, brand-mention, and impression metrics. Each row is classified as owned / competitor / partner / third_party. Supports filters (date range, models, prompts, competitors, locations, personas), sort, and pagination via page_num / page_size.
| Name | Type | Req | Description |
|---|---|---|---|
| competitors_mentioned | string | – | – |
| filters | object | yes | – |
| mentioned | string | – | – |
| page_num | integer | – | – |
| page_size | integer | – | – |
| search | string|null | – | – |
| sort_direction | string | – | – |
| sort_field | string | – | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| notice | string | – | – |
| pagination | object | yes | – |
| sources | array | yes | – |
No examples provided.
get_topics ~36
List topics (groupings of prompts) for a website, with the count of prompts in each
| Name | Type | Req | Description |
|---|---|---|---|
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| topics | array | yes | – |
No examples provided.
get_tracked_content ~250
List tracked content (1st-party drafts, imported pages, 3rd-party placements) with citation, mention, and impression metrics for the supplied date range and filters. Supports pagination via page_num / page_size and optional filtering by Content Hub sheet_id or content_type. A sheet_id of a view-type tab (see get_content_hub_sheets sheet_type) lists the shared main pool: content not filed in any sheet. In-flight pipeline items (drafts, briefs, running generations) never appear here; enumerate those with list_content. A returned item can still lack a url (pipeline finished but not published anywhere yet).
| Name | Type | Req | Description |
|---|---|---|---|
| content_type | string | – | – |
| filters | object | yes | – |
| mentioned | boolean | – | – |
| page_num | integer | – | – |
| page_size | integer | – | – |
| sheet_id | string | – | Content Hub tab to list (get_content_hub_sheets). A sheet-type tab lists its own content; a view-type tab, the default tab included, lists the shared main pool (content not filed in any sheet), witho… |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| content | array | yes | – |
| pagination | object | yes | – |
No examples provided.
get_user_by_email ~54
Look up a user by email address, scoped to the caller's organization. Returns 404 when the email does not belong to a member of the organization or of one of its websites.
| Name | Type | Req | Description |
|---|---|---|---|
| string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| user | object | yes | – |
No examples provided.
list_api_keys ~153
List the organization's API key metadata, including creator and creation date, oldest first. Includes revoked keys so polling can detect keys revoked between checks. Never returns secrets or hashes. Requires a global API key or an organization admin's MCP connection. For polling, keep since/until fixed while paging, overlap successive windows and deduplicate by id. This is an inventory, not a durable event log; deleted creator accounts remove their keys.
| Name | Type | Req | Description |
|---|---|---|---|
| page_num | integer | – | – |
| page_size | integer | – | – |
| since | string | – | Include keys created at or after this ISO 8601 timestamp. |
| until | string | – | Include keys created at or before this ISO 8601 timestamp. Keep fixed while paging. |
| Name | Type | Req | Description |
|---|---|---|---|
| api_keys | array | yes | – |
| pagination | object | yes | – |
No examples provided.
list_content ~470
Enumerate every content item in a website's Content Hub, published or not: in-flight drafts, briefs, snipes, optimize and slice runs, scheduled and failed items, plus tracked pages. Returns identity fields only (id, title, type, stage, sheet, URL, timestamps, target prompt ids), no metrics. Uncached and Postgres-backed, so an item created by create_content is listable immediately. Filter by sheet_id, content_type, stage, or prompt_id. stage is the raw pipeline workflow state, not a publication flag: null = no pipeline record (most tracked external / imported pages), and manual editor items carry 'generated'. Treat an item as published only when its stage is done (or it is an external / imported page) AND it has a url; done without a url is an unpublished orphan. A sheet_id of a view-type tab (see get_content_hub_sheets sheet_type) lists the shared main pool without the view's saved filters. Use get_tracked_content for citation and impression metrics on published content; use this tool to discover what exists. Each row carries prompt_ids: the prompts that item was WRITTEN FOR (what create_content was given), capped at 25 with the true size in prompt_count — resolve the ids to text with get_prompts rather than calling get_content_detail per row, and drill in with get_content_detail where prompt_count exceeds the ids returned (that read carries up to 100; associations past 100 are not currently readable). prompt_ids includes soft-deleted prompts, which get_prompts does NOT list — an id that fails to resolve there is a deleted prompt, and get_content_detail returns its text and status: "deleted". Empty prompt_ids means no targeting was recorded, which is normal for imported or externally tracked pages. This is not the same as being cited for a prompt — see get_content_citation_prompts for that. Filter by prompt_id for the reverse question: which content already targets a given prompt (coverage gaps).
| Name | Type | Req | Description |
|---|---|---|---|
| content_type | string | – | – |
| page_num | integer | – | – |
| page_size | integer | – | – |
| prompt_id | string | – | – |
| sheet_id | string | – | – |
| stage | string | – | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| content | array | yes | – |
| pagination | object | yes | – |
No examples provided.
list_outreach_contacts ~150
Read saved Outreach contacts: cited pages with their status, author, email and where the email came from, LinkedIn, contact page, and pitch draft. Only pages someone has triaged, enriched or drafted are listed; find other cited pages with the source-page analytics tools. Newest first; use offset for the next page. Read-only.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Contacts per page: 1 through 50, default 20. |
| offset | integer | – | – |
| statuses | array | – | Only contacts in these statuses. Omit for all. |
| url | string | – | Return only this page's contact. Omit to list all. |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| contacts | array | – | – |
| has_more | boolean | – | – |
| total | number | – | – |
No examples provided.
list_pitches ~29
List pitch workspace reports for the organization. Returns all non-deleted pitches with their status and metadata.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| pitches | array | yes | – |
No examples provided.
list_websites ~70
List every website accessible to the calling session. Works with any API key (global or scoped) and with MCP/OAuth sessions. Call with an empty argument object `{}`. Each item includes `baseCountry`, the country market the website targets: use it to tell same-brand websites for different countries apart.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| websites | array | yes | – |
No examples provided.
merge_pillars ~131
Merge 1-20 source pillars into a published target pillar: every fact on the sources (any review status) re-files onto the target, page links carry over keeping the stronger signal, and the source pillars are then deleted. The target must be a published pillar and must not appear among the sources. Unlike the other Knowledge Base writes, retries are strict: missing source ids are rejected rather than skipped, so re-read the pillars before retrying a failed merge.
| Name | Type | Req | Description |
|---|---|---|---|
| source_pillar_ids | array | yes | – |
| target_pillar_id | string | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| merged_pillars | array | – | – |
| moved_fact_count | integer | – | – |
| pillar | object | – | – |
| success | boolean | – | – |
No examples provided.
move_brand_facts ~110
File 1-50 brand facts under a published Knowledge Base pillar — works for unfiled facts and re-files facts from other pillars. Review status never changes, and only approved facts under a published pillar feed content generation, so moving is what puts approved facts to work. Missing ids are reported in not_found_ids rather than failing the call, so retries are idempotent.
| Name | Type | Req | Description |
|---|---|---|---|
| fact_ids | array | yes | – |
| pillar_id | string | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| moved_count | integer | – | – |
| not_found_ids | array | – | – |
| pillar | object | – | – |
| success | boolean | – | – |
| unchanged_ids | array | – | – |
No examples provided.
move_content ~233
Move one or more content items to a different Content Hub sheet, or back to the shared pool. Sheet assignment is organizational metadata only: a move never changes an item's stage, brief, body, versions, URL, or metrics, and the item stays fully readable and revisable. targetSheetId must be a "sheet"-type tab from the Content Hub sheets list — view-type tabs (e.g. All content) are computed filters, not assignable; pass null to unassign back to the shared pool they display. Batch is all-or-nothing: if any contentIds entry does not belong to the website, nothing moves. Custom-column values follow each item when the target has a matching column (same name and type; missing columns are auto-created); values whose column conflicts by type are dropped, and multi-select selections whose option is missing on the matched target column are removed — both counts are reported. Each moved item is returned with its previous and new sheet id so no follow-up read is needed.
| Name | Type | Req | Description |
|---|---|---|---|
| content_ids | array | yes | – |
| target_sheet_id | – | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| cells_dropped | integer | – | – |
| cells_transferred | integer | – | – |
| moved | array | – | – |
| option_values_dropped | integer | – | – |
| target_sheet_id | – | – | – |
| target_sheet_name | string | – | – |
No examples provided.
open_ai_access AI crawler access ~37
Open the AthenaHQ AI crawler access panel. Enter a public HTTPS domain to inspect crawler responses and robots.txt permissions without an AthenaHQ account.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
publish_content ~246
Record an already-published article's URL in AthenaHQ for citation and mention tracking. Does not upload or publish content to a website or CMS. Call only after the article is live. Sets the first publication time and moves the pipeline stage to done. A first publish requires a finished article (stage generated), with one exception: an optimize draft is created from a page that is already live and can be marked published while it waits at stage pending, as long as no Athena review is running on it. Briefs, still-generating or failed pieces, optimize drafts with a review in flight, and items with a scheduled CMS publish are rejected with the reason. Pass the exact public URL of the live page (a bare domain path like acme.com/blog/post is fine; the protocol is stripped on store). Calling it again on an already-published item (including external and imported pages, which are live by definition) updates the tracked URL only, keeping the original publish time. This is the only way to set a content URL over MCP; rename_content is deliberately title-only.
| Name | Type | Req | Description |
|---|---|---|---|
| content_id | string | yes | – |
| url | string | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| already_published | boolean | – | – |
| content_id | string | – | – |
| published_at | string|null | – | – |
| title | string|null | – | – |
| url | string | – | – |
No examples provided.
query_metrics ~2,137
Query aggregated metrics for brand performance, competitors, sources, citations, and response trends. Use query_rows for individual records. Mentions: from "response_mentions". Citations: from "citations". On either, where { is_website: true } selects the brand; { is_competitor: true } selects competitors; { entity_id: { eq: "<uuid>" } } selects one entity. Filter/group models by model_category (display names like "ChatGPT", "Claude"), never "model". Dimensions vary by cube; source_mentions has no prompt/model dimensions. Group by week (Monday start) or month wherever date groups. prompt_status is the paused flag (true = paused). Measures: count, count_distinct, avg, sum, min, max; per-measure where enables conditional aggregation. Use compare for two date ranges. When grouping by IDs, use alsoSelect for names: entity_id/entity_name, prompt_id/prompt_text, prompt_topic_id/topic_name (prompts uses topic_id). Cited pages mentioning competitors but not the brand: from "sources", where { source_mentions_entity: { hasSome: [competitorIds], hasNone: [brandId] } }. Also works on "source_mentions". Checks all stored page mentions per URL/website. Date/model on sources scope AI responses; extracted page content may be older than the live page. Content-hub attribution: on "sources", where { is_attributed_content: true }; by: ["content_id"], alsoSelect: ["content_title"]. Add content_type to by for type, or group by content_type alone. Read articles from "contents" via query_rows. Schedule: select one "default" or custom/archived UUID from the catalog, or an array of them to combine schedules. Omit for caller default (current page in Ask Athena); explicit schedule overrides it. Top-level prompt_schedule_kind/id equality filters remain supported but must not conflict with schedule. Historical provenance is independent of current prompt membership; website-level cubes are unaffected.
| Name | Type | Req | Description |
|---|---|---|---|
| alsoSelect | array | – | Label dimensions carried via any(). Must be determined by a by dim (cube's dependentDims). Example: entity_name when entity_id is in by. |
| by | array | – | GROUP BY dimensions. Omit for scalar result. |
| compare | object | – | Compare the same measures across two slices. Each base measure `m` expands to `m_<baseline.label>` and `m_<current.label>`; the result also gets `m_delta` (= current − baseline) and `m_pct_change` (=… |
| from | string | yes | Dataset to query. Cubes and their contracts: Each cube lists its selectable fields, then: filter-only (usable only in where), alsoSelect (name←id: group by the id, pass the name in alsoSelect), group… |
| having | – | – | HAVING filter (after grouping). References measure aliases and by dims. |
| limit | integer | – | Max rows to return. |
| measures | object | yes | Aggregate expressions keyed by output column name. Example: { total: { fn: 'count_distinct', of: 'response_id' } } |
| orderBy | array | – | ORDER BY. Measure aliases and by dims allowed. |
| schedule | – | – | One schedule from the catalog ("default" or a custom/archived UUID), or an array of them to combine their data. Omit to use the caller default. The retired "manual" token is accepted as a deprecated… |
| website_id | string | yes | The website to query. Must be a website your credentials can access. |
| where | – | – | WHERE filter (before grouping). |
| Name | Type | Req | Description |
|---|---|---|---|
| notice | string | – | – |
| rows | array | yes | – |
No examples provided.
query_rows ~1,743
Query individual analytics rows. Use for qualitative data like response text, specific identifiers, or individual mentions. Schedule selection: pass schedule: "default" or a custom/archived UUID from the schedule catalog, or an array of them to combine schedules. Omit to use the caller default (Ask Athena uses the current page selection). Explicit selection overrides that default. Existing top-level equality predicates on prompt_schedule_kind/id remain supported, but cannot conflict with schedule. Historical provenance does not change with current prompt membership. Website-level cubes are unaffected. Cubes (same set as query_metrics): attributes, citations, competitors, contents, prompts, response_mentions, responses, source_mentions, sources, topics, websites. Returns { rows, nextCursor, hasMore }. Pass nextCursor back as "after" to paginate. prompt_status is the prompt's paused flag (boolean, true = paused), not a status string. On the responses cube, content is hydrated from Postgres and can only be selected. Do not filter or sort by content. Use search_terms_in_responses for text frequency analysis. Use query_metrics for aggregates instead.
| Name | Type | Req | Description |
|---|---|---|---|
| after | object | – | Last row from previous page for keyset pagination. Must include values for all orderBy dims. |
| fields | array | yes | Columns to SELECT. |
| from | string | yes | Dataset to query. Cubes and their contracts: Each cube lists its selectable fields, then: filter-only (usable only in where), alsoSelect (name←id: group by the id, pass the name in alsoSelect), group… |
| limit | integer | – | Max rows to return. |
| orderBy | array | – | ORDER BY. If omitted, uses cube default order. |
| schedule | – | – | One schedule from the catalog ("default" or a custom/archived UUID), or an array of them to combine their data. Omit to use the caller default. The retired "manual" token is accepted as a deprecated… |
| website_id | string | yes | The website to query. Must be a website your credentials can access. |
| where | – | – | WHERE filter. |
| Name | Type | Req | Description |
|---|---|---|---|
| hasMore | boolean | yes | – |
| nextCursor | – | yes | – |
| notice | string | – | – |
| rows | array | yes | – |
No examples provided.
remove_competitors ~153
Stop tracking competitors on a website, 1 to 25 per call, by id from get_competitors, as the Competitors page's delete does. Returns one result per id, in order: removed, no_change (already removed), or not_found (not a competitor of this website). Past mentions and citations are kept, and a removed competitor can be restored on the Competitors page. Reanalyzing past responses happens only when someone runs the backfill on the Competitors page, which costs credits; this tool never starts it and costs no credits.
| Name | Type | Req | Description |
|---|---|---|---|
| competitor_ids | array | yes | The competitors to stop tracking, by id from get_competitors. |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| results | array | – | – |
No examples provided.
rename_content ~58
Rename a content row's title. URL editing is not supported — URL is the content asset's stable identity and cannot be changed here.
| Name | Type | Req | Description |
|---|---|---|---|
| content_id | string | yes | – |
| title | string | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| success | boolean | – | – |
No examples provided.
restore_content_version ~89
Bring an earlier version's text back as the current draft — use it when a later pass came out worse than an earlier one. Nothing is deleted: the restored text is appended as a new version on top of the history, so the passes in between remain readable and restorable.
| Name | Type | Req | Description |
|---|---|---|---|
| content_id | string | yes | – |
| version_id | string | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| body | string | – | – |
| content_id | string | – | – |
| restored_from_version_number | integer | – | – |
| version_id | string | – | – |
| version_number | integer | – | – |
No examples provided.
revise_brief ~172
Rewrite a content brief from a natural-language instruction (for example: 'add a section on pricing objections', 'cut the competitor comparison'). An AI model performs the rewrite server-side, so the result is generated text, not your literal wording. Records each pass as a version; iterate by calling it again, since each call starts from the current brief. Most useful while a piece waits at status generated_brief, where the brief still shapes what the article will say — call approve_brief once it reads right. It also works after the article exists, to correct the brief for a later regeneration; note that revising the brief does NOT rewrite an already-generated article, so use revise_content for that.
| Name | Type | Req | Description |
|---|---|---|---|
| content_id | string | yes | – |
| instruction | string | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| brief | string | – | – |
| content_id | string | – | – |
| version_id | string | – | – |
| version_number | integer | – | – |
No examples provided.
revise_content ~204
Rewrite an existing content draft from a natural-language instruction (for example: 'tighten the intro', 'add a section on pricing', 'remove the second half'). An AI model performs the rewrite server-side, so the result is generated text, not your literal wording; when you already have the exact replacement text, use edit_content instead. Applies the change to the whole article and records it as a new version, so earlier passes stay recoverable via get_content_versions / restore_content_version. Iterate by calling it again — each call starts from the current text, so no version id is needed. Use this instead of create_content to change a draft; it edits in place rather than generating a new piece. The returned body is always the complete replacement article, never just the edited passage; compare body_word_count with previous_body_word_count to confirm nothing unexpected was lost.
| Name | Type | Req | Description |
|---|---|---|---|
| content_id | string | yes | – |
| instruction | string | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| body | string | – | – |
| body_word_count | integer | – | – |
| content_id | string | – | – |
| previous_body_word_count | integer | – | – |
| version_id | string | – | – |
| version_number | integer | – | – |
No examples provided.
search_brand_facts ~89
Semantic search over a website's approved brand facts in the Knowledge Base. Reaches facts not filed under any pillar. Returns fact text with confidence, source URL and quote, and the published pillar it belongs to (null when unfiled).
| Name | Type | Req | Description |
|---|---|---|---|
| pillar_id | string | – | – |
| query | string | yes | – |
| top_k | string | – | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| facts | array | – | – |
No examples provided.
set_outreach_status ~157
Move cited pages to an Outreach pipeline status (New, Todo, In Progress, Done, Rejected), as the Outreach inbox and board do. Each change to an existing contact is recorded in its activity history. Pages without a contact get one at the new status, starting with no activity entries; "New" only resets existing contacts and creates none. "Rejected" removes pages from the active queue; "New" returns them to untriaged. Up to 100 pages per call. Obtain user confirmation before calling.
| Name | Type | Req | Description |
|---|---|---|---|
| status | string | yes | Pipeline status. "New" means untriaged; "Rejected" removes the page from the active queue. |
| urls | array | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| updated | number | – | – |
No examples provided.
set_prompt_tags ~99
Replace all tag assignments on an existing prompt. For additions or removals, read the prompt's current tags with get_prompts, resolve tag IDs with get_prompt_tags, and pass the full resulting set. Existing assignments omitted from tag_ids are removed; an empty array clears all assignments. Tag definitions and the prompt itself are preserved.
| Name | Type | Req | Description |
|---|---|---|---|
| prompt_id | string | yes | – |
| tag_ids | array | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| success | boolean | – | – |
| tag_ids | array | – | – |
No examples provided.
set_prompts_status ~43
Pause or unpause multiple prompts in one transaction
| Name | Type | Req | Description |
|---|---|---|---|
| prompt_ids | array | yes | – |
| status | string | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| changed_count | integer | – | – |
| message | string | – | – |
| success | boolean | – | – |
| unchanged_count | integer | – | – |
No examples provided.
source_tags__create ~264
Create a custom source tag with a name, URL patterns and optionally an icon and colour. Read the tag listing first: built-in tags already cover media, social, government, e-commerce, review sites, PR wires, academic and wiki sources, and a host they miss is better added to the built-in tag than given a new one. Obtain user confirmation before calling. MCP executes immediately after authorization; Athena AI chat presents an approval card. Patterns support hosts (example.com), subtrees (*.example.com), path sections (example.com/blog), exact pages (example.com/blog$) and query constraints. Up to 500 patterns. These are source tags, not prompt tags.
| Name | Type | Req | Description |
|---|---|---|---|
| color | string | – | Optional colour family: ochre, clay, brick, amber, olive, moss, teal, slate, ink, mauve or plum. Default ink. |
| icon | string | – | Optional icon key from the curated set (for example newspaper, capsule, hospital, graduation-cap, building). Omit for a letter badge. |
| name | string | yes | Custom tag name. Names of built-in tags (Media, Social, Government, …) and of Owned and Competitor are reserved. |
| patterns | array | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| analytics_refreshed | boolean | – | – |
| color | string | – | – |
| deletable | boolean | – | – |
| editable | boolean | – | – |
| icon | string|null | – | – |
| id | string | – | – |
| kind | string | – | – |
| name | string | – | – |
| patterns | array | – | – |
| removed_patterns | array | – | – |
| revision | string | – | – |
No examples provided.
How do I install the AthenaHQ MCP server?
AthenaHQ is a hosted endpoint at https://api.athenahq.ai/api/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · api.athenahq.ai
claude mcp add --transport http ai-athenahq-mcp 'https://api.athenahq.ai/api/mcp'
What is the AthenaHQ MCP server?
AthenaHQ is an MCP server listed in the public MCP registry as ai.athenahq/mcp. Track how AI assistants mention, cite, and rank your brand and competitors in AI search. This page covers its hosted endpoint (https://api.athenahq.ai/api/mcp).
Is the AthenaHQ MCP server safe to use?
AthenaHQ scores 66 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the AthenaHQ MCP server expose?
AthenaHQ exposes 113 tools: open_ai_access, check_public_ai_access, get_prompt_schedules, get_ai_search_value, get_prompts, and 108 more. Their descriptions and schemas cost roughly 19,324 tokens of context every time the server is loaded.
Does the AthenaHQ MCP server require authentication?
No. We connected to AthenaHQ without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the AthenaHQ MCP server still maintained?
AthenaHQ is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.