AthenaHQ
REMOTE · API.ATHENAHQ.AI
Track how AI assistants mention, cite, and rank your brand and competitors in AI search.
Available components
Last scanned (10 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 →
add_brand_facts ~216
Add brand facts to a website's Knowledge Base in bulk (1-50 per call). Each fact runs the full ingestion pipeline (deduplication, approval gates, pillar routing); there is no way to force-approve. Returns one outcome per fact (approved | pending | duplicate; extensible) with the created fact id and the pillar it was filed under. Facts without a pillar_id are routed automatically and may land unfiled. A fact similar to facts already in the Knowledge Base is not added: its outcome is duplicate and lists them under matches, and the response carries a match_token. To resolve, call again with those facts, the match_token, one decision per listed match (approve, optionally with new text, or delete) and save_submitted (true adds the facts as written, false only applies the decisions).
| Name | Type | Req | Description |
|---|---|---|---|
| decisions | array | – | – |
| facts | array | yes | – |
| match_token | string | – | – |
| save_submitted | boolean | – | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| match_token | string | – | – |
| outcomes | array | – | – |
| resolved | object | – | – |
No examples provided.
add_competitors ~182
Start tracking competitors on a website, 1 to 25 per call, under the same rules as the Competitors page. Each competitor needs a name and its website url, or no_website: true for a brand with no website of its own; identifiers and additional_urls are optional. Returns one result per competitor, in order: added, already_tracked (the website already tracks that url; nothing changes), or rejected with the reason (a url on the website's own domains, an invalid url, or the limit of 500 competitors per website). New AI responses count mentions of an added competitor right away. Past responses are reanalyzed 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 |
|---|---|---|---|
| competitors | array | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| results | array | – | – |
No examples provided.
add_content ~254
Add an article that is already written (for example, one drafted in this conversation) to the website's Content Hub as an editable draft. Same as pasting it into the Content Hub's blank editor: no AI model runs and no content credits are spent. Use create_content instead when Athena should research and write the piece. body is the full article in Markdown and is stored as given, except that link and image destinations with an unsafe scheme (javascript:, data:) become #. The item is created with type manual at stage generated, and the body is recorded as version 1, so get_content_draft, edit_content, revise_content and get_content_versions work on it right away. Pass title, or it is taken from the body's first heading (else its first line). sheet_id must be a tab from get_content_hub_sheets: a sheet-type tab keeps the item, a view-type tab or no sheet_id puts it in the shared pool. The item is not published. Once it is live on the site, call publish_content with its URL to start citation tracking.
| Name | Type | Req | Description |
|---|---|---|---|
| body | string | – | – |
| sheet_id | – | – | – |
| title | string | – | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| content_id | string | – | – |
| sheet_id | – | – | – |
| title | string | – | – |
| unsafe_links_removed | integer | – | – |
| version_number | – | – | – |
No examples provided.
approve_brief ~99
Approve a content brief and start writing the article from it. Only valid while the piece is at status generated_brief. The article is generated from the brief exactly as it currently stands, including any revisions made with revise_brief or edits made in the app. Consumes content credits; poll get_content_status afterwards, then read the result with get_content_draft.
| Name | Type | Req | Description |
|---|---|---|---|
| content_id | string | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| content_id | string | – | – |
| status | string | – | – |
No examples provided.
check_public_ai_access Check AI crawler access ~87
Check HTTP responses to AI crawler user agents and robots.txt permissions for a public website. No AthenaHQ account required. Search, retrieval and training are separate. Requests originate from AthenaHQ, not verified crawler IPs. Unknown responses are inconclusive; this does not measure visibility or guarantee indexing, citations or real crawler access. Use nullable evidence and diagnostics.
| Name | Type | Req | Description |
|---|---|---|---|
| domain | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| checkedAt | string | yes | – |
| diagnostics | object | yes | – |
| domain | string | yes | – |
| evidence | object | yes | – |
| log | string | yes | – |
No examples provided.
create_content ~452
Generate an article or content brief in AthenaHQ. Fetches source URLs, sends source material to external AI providers, and consumes content credits. Obtain user approval before calling. Does not publish to a website or CMS. For draft mode, auto_approve defaults to true; set false to generate only a brief and wait for approve_brief. Poll get_content_status using each returned content_ids value. Slice mode returns slice_titles and an empty content_ids array; generated items appear in list_content. To save an already-written article without generation or credit use, call add_content.
| Name | Type | Req | Description |
|---|---|---|---|
| auto_approve | boolean | – | Draft mode only. Defaults to true, which continues from brief generation to article generation. Set false to pause at generated_brief until approve_brief is called. |
| brand_kit_id | string | – | – |
| content_format_type | string | – | – |
| custom_instructions | string | – | – |
| fact_review | object | – | – |
| kb_mode | string | – | – |
| mode | string | yes | draft: generate a brief and optionally an article from tracked prompts. snipe: draft an article using a competitor URL as input. optimize: improve an existing page for AI search. slice: turn one sour… |
| pdf_file_name_or_r2_key | string | – | – |
| pinned_claim_ids | array | – | – |
| prompt_ids | array | – | Existing tracked prompt UUIDs, up to 100. Required and nonempty for draft; omit for slice. Use IDs from the website's tracked prompt list; never invent them. |
| rec_id | string | – | – |
| rec_kind | string | – | – |
| scrape_additional_links | boolean | – | – |
| selected_topic_ids | array | – | – |
| sheet_id | – | – | – |
| title | string | – | Article title. Required for draft, snipe, and optimize modes. |
| url | string | – | Source page URL. Required for snipe, optimize, and slice modes. A URL without a protocol, such as example.com/article, is accepted. |
| use_content_memories | boolean | – | – |
| use_kb_internal_links | boolean | – | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| content_ids | array | – | – |
| slice_titles | array | – | – |
| status | string | – | – |
No examples provided.
create_location ~45
Create a location for a website
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | yes | – |
| location | string | yes | – |
| prompt_ids | array | – | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | – | – |
| id | string | – | – |
| location | string | – | – |
No examples provided.
create_pillar ~85
Create a Knowledge Base pillar (a subject area that groups brand facts) from a name and optional description. Get-or-create semantics: if a pillar with the same name already exists, it is returned with created: false instead of failing, so retries are idempotent.
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | – | – |
| name | string | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| created | boolean | – | – |
| pillar | object | – | – |
No examples provided.
create_prompt_tag ~90
Create a prompt tag on a website, or return the existing tag when its name matches case-insensitively. Trims surrounding whitespace and rejects reserved prompt-type names. Returns the tag ID and whether it was created. Use the returned ID to assign the tag to prompts; creating a tag does not assign it to any prompts.
| Name | Type | Req | Description |
|---|---|---|---|
| tag | string | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| created | boolean | – | – |
| success | boolean | – | – |
| tag | string | – | – |
| tag_id | string | – | – |
No examples provided.
create_prompts ~40
Create one or more prompts on a website
| Name | Type | Req | Description |
|---|---|---|---|
| prompts | array | yes | – |
| source | string | – | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| count | number | – | – |
| prompt_ids | array | – | – |
| success | boolean | – | – |
No examples provided.
create_saved_view ~367
Create a saved view (filter preset) for a website. Saved views appear in the dashboard filter bar for every member of the website. filters is an object keyed by filter field key, each value shaped {"id": "<unique string>", "field": "<same field key>", "operator": "is_any_of", "values": [...]}. Common field keys: "models" (slugs like "chatgpt", "perplexity", "google_ai_overview"), "competitors", "prompts", "personas", "locations", "promptTags", "attributes" (arrays of UUIDs from the matching list tools), "countries", "sourceTag". "promptTags" also accepts the builtin tokens "type:high_intent" (branded prompts) and "type:discovery" (non-branded) alongside tag UUIDs. "sourceTag" values are the builtin categories "owned", "competitor", "partner", "third_party" or custom source tag UUIDs, not display labels; custom source tag ids appear on existing saved views (list the website's saved views to find them). When unsure, list the website's saved views and mirror their filter shapes. icon, when set, must be a supported Remix icon name (e.g. "RiStarLine"); invalid names are rejected with the full list. When talking to the user about a view or its filters, use the dashboard names (Branded / Non-branded prompts, Owned / Competitor / Partner / Third party sources), never internal tokens, field keys, operator strings, or icon identifiers.
| Name | Type | Req | Description |
|---|---|---|---|
| filters | object | yes | – |
| icon | – | – | – |
| name | string | yes | – |
| olympus_layout | object | – | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| created_at | string|null | – | – |
| created_by | – | – | – |
| creator_has_access | boolean|null | – | – |
| filters | object | – | – |
| icon | string|null | – | – |
| id | string | – | – |
| name | string | – | – |
| olympus_layout | – | – | – |
| updated_at | string|null | – | – |
| user_id | string|null | – | – |
| website_id | string | – | – |
No examples provided.
create_topic ~46
Create a topic on a website (returns the existing topic when the name is already taken)
| Name | Type | Req | Description |
|---|---|---|---|
| description | – | – | – |
| name | string | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| created | boolean | – | – |
| description | string|null | – | – |
| id | string | – | – |
| name | string | – | – |
No examples provided.
delete_brand_facts ~92
Permanently delete 1-50 brand facts from a website's Knowledge Base. There is no undo. Ids that do not exist on the website are reported in not_found_ids rather than failing the call, so retries are idempotent. Requires an admin; on OAuth connections the signed-in user must have the admin role.
| Name | Type | Req | Description |
|---|---|---|---|
| fact_ids | array | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| deleted_count | integer | – | – |
| not_found_ids | array | – | – |
| success | boolean | – | – |
No examples provided.
delete_content ~52
Delete a content row. Destructive: physical row delete, no undo. Powers delete-and-retry. Bulk delete is out of scope.
| Name | Type | Req | Description |
|---|---|---|---|
| content_id | string | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| success | boolean | – | – |
No examples provided.
delete_location ~31
Delete a location from a website
| Name | Type | Req | Description |
|---|---|---|---|
| location_id | string | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| location | string | – | – |
| success | boolean | – | – |
No examples provided.
delete_pillars ~113
Permanently delete 1-20 Knowledge Base pillars and every fact filed under them. Facts are deleted, not unfiled; there is no undo. Ids that do not exist on the website are reported in not_found_ids rather than failing the call, so retries are idempotent; ids in failed_ids are untouched and safe to retry. Requires an admin; on OAuth connections the signed-in user must have the admin role.
| Name | Type | Req | Description |
|---|---|---|---|
| pillar_ids | array | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| deleted_pillars | array | – | – |
| failed_ids | array | – | – |
| not_found_ids | array | – | – |
| success | boolean | – | – |
No examples provided.
delete_prompt ~36
Delete a prompt (soft when responses exist, hard otherwise)
| Name | Type | Req | Description |
|---|---|---|---|
| prompt_id | string | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| soft_deleted | boolean | – | – |
| success | boolean | – | – |
No examples provided.
delete_topic ~46
Delete a topic (soft delete; optionally also delete its prompts)
| Name | Type | Req | Description |
|---|---|---|---|
| delete_prompts | string | – | – |
| topic_id | string | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| deleted_prompt_count | integer | – | – |
| name | string | – | – |
| success | boolean | – | – |
No examples provided.
draft_outreach_message ~228
Draft a pitch email to the author of a cited page and save it as the page's Outreach draft, replacing any previous draft. Uses the website's team-wide Outreach custom instructions, the saved author name, and the sender's name. Costs 0.1 credits per draft written (billed in whole credits every 10 drafts); free when the page cannot be read. Show the draft to the user before they send it; nothing is sent.
| Name | Type | Req | Description |
|---|---|---|---|
| sender_name | string | – | Name to sign the email with. Defaults to the signed-in user's profile name; required for API-key sessions that should sign with a name. |
| url | string | yes | Cited page URL, e.g. "example.com/blog/best-tools". A contact already saved under this exact URL (for example one the Outreach page saved for a query variant its URL rules list separately) is used fi… |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| contact | object | – | – |
| created | boolean | – | True when this call created the page's contact. |
No examples provided.
edit_content ~217
Apply exact find-and-replace edits to a content draft's article body. Deterministic, no AI model involved: your replacement text lands verbatim (use revise_content when you want an AI rewrite from an instruction). Each edit's find text must match the current body exactly once; zero or multiple matches fail the whole call and nothing is saved, so extend the find text until it is unique. Edits apply in order, later ones see earlier results, and the batch is recorded as one new version, recoverable via get_content_versions / restore_content_version. Pass expected_version_number from get_content_draft to fail with a conflict when a new version was recorded after your read (a revision, edit, or restore). An app autosave changes the body without recording a version; that drift is caught by the anchors themselves, since a moved or vanished find text fails the call.
| Name | Type | Req | Description |
|---|---|---|---|
| content_id | string | yes | – |
| edits | array | yes | – |
| expected_version_number | integer | – | – |
| 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.
find_more_prompt_discovery ~213
Find more prompts for a finished Discover run: start the next round of its series with the same sources, effort level, country, language and custom instructions. The round skips every question the series already suggested and reads evidence earlier rounds did not use, so its prompts add to the same list. Invoke only after the user asks for more prompts from an existing run, and confirm with them first: each round runs the same paid research as a new run. A series takes one round at a time and at most two after the first run, and ends early after a round that found fewer than ten new prompts or nothing new to read; the tool then refuses with the reason. Returns the new round's run ID; poll the discovery history tool with it. Prompts are not added to tracking automatically. Requires prompt-management permission and the series' source entitlements.
| Name | Type | Req | Description |
|---|---|---|---|
| run_id | string | yes | A finished Discover run, or any finished round of its series, to continue. |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| run_id | string | – | – |
| version | string | – | – |
No examples provided.
find_outreach_author ~208
Find who wrote a cited page and how to reach them, then save it to the page's Outreach contact. Reads the page's byline, the addresses the page publishes, and Hunter.io; when no author is found it returns the site's contact address and contact page instead. Every email comes with its source. Costs 0.1 credits when an author is found (billed in whole credits every 10 lookups); free otherwise. Overwrites the saved author fields. Obtain user confirmation before running it over many pages.
| Name | Type | Req | Description |
|---|---|---|---|
| url | string | yes | Cited page URL, e.g. "example.com/blog/best-tools". A contact already saved under this exact URL (for example one the Outreach page saved for a query variant its URL rules list separately) is used fi… |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| author_found | boolean | – | – |
| contact | object | – | – |
| created | boolean | – | True when this call created the page's contact. |
No examples provided.
get_ai_search_value ~55
AI Search Value for a website: topic-market value, captured value range, headroom, coverage, value-weighted AI share of voice, per-topic detail, and modeled attributed contribution.
| Name | Type | Req | Description |
|---|---|---|---|
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| assumptions_version | string|null | yes | – |
| captured | object | yes | – |
| computed_at | string|null | yes | – |
| contribution | object | yes | – |
| forecast | – | yes | – |
| has_computed_valuations | boolean | yes | – |
| headroom | object | yes | – |
| is_stale_value | boolean | yes | – |
| market | object | yes | – |
| measured_responses | number | yes | – |
| merge_suggestions | array | yes | – |
| topics | array | yes | – |
No examples provided.
get_attribute_metrics ~196
Get cumulative brand trait (attribute) metrics: for each brand-perception keyword (e.g. 'Affordable', 'Slow Support'), how many AI responses mentioned it across the date range, and the percentage. `positive` selects the observation direction and defaults to true when omitted. `total_responses` is the denominator: responses in the date range that mention the brand AND had attribute extraction run on them. It is NOT every response for the website — responses that never mention the brand are excluded, and Athena samples which responses get extraction, so un-analyzed ones are excluded too. Compute rates from the returned `percentage` / `total_responses` rather than against a response count from another endpoint. Attributes nobody mentioned come back with response_count 0. Use get_competitor_attribute_metrics for the same breakdown per competitor.
| Name | Type | Req | Description |
|---|---|---|---|
| filters | object | yes | – |
| positive | boolean | – | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| data | array | yes | – |
No examples provided.
get_attribute_observations ~429
Get individual brand trait (attribute) observations: each row is one AI response describing one entity (the brand or a competitor) with one brand trait, including the response excerpt as `text_span`. `score` runs from -1 to 1 and its sign always matches `positive`; its magnitude (0.1 to 1.0) is how strongly the wording praises or criticizes. `score` is null when the observation was not scored (extracted before scoring existed, or no valid value was recorded); for direction only, use `score ?? (positive ? 1 : -1)`. Omit `positive` for both directions. `sort: "intensity"` (the default) returns the strongest observations first with unscored ones last; `sort: "recent"` returns the newest first. Narrow with entity_ids and attribute_ids (from get_attributes). Paginate with page_num and page_size; a page can hold fewer than page_size rows when an excerpt is no longer available, so use `has_more` to decide whether to fetch the next page. Use get_attribute_metrics for how often each trait is mentioned.
| Name | Type | Req | Description |
|---|---|---|---|
| attribute_ids | array | – | Attribute UUIDs to filter to (from get_attributes), as an array even for one id. Omit for every active attribute. |
| entity_ids | array | – | Entity UUIDs to filter to, as an array even for one id: the website_id for the brand itself, competitor ids from get_competitors for competitors. Omit for every entity. |
| filters | object | yes | – |
| page_num | integer | – | Zero-indexed page number. Defaults to 0. |
| page_size | integer | – | Rows per page, 1 to 100. Defaults to 40. |
| positive | boolean | – | true for favorable observations only, false for critical ones only. Omit for both directions. |
| sort | string | – | "intensity" (default): strongest first, unscored last, then newest. "recent": newest first. |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| data | array | yes | – |
| has_more | boolean | yes | – |
| notice | string | – | – |
| page_num | integer | yes | – |
| page_size | integer | yes | – |
No examples provided.
get_attribute_time_series ~185
Get the daily trend for ONE brand trait (attribute), brand and competitors side by side — how mentions of a keyword like 'Affordable' moved over time. Requires an attribute_id: call get_attributes first to discover ids. `positive` selects the observation direction and defaults to true when omitted. Days with no data are returned as zeros, so the series is gap-free and chartable. Denominators are per-side, not the day's whole response set: brand_percentage divides by that day's responses that mention the brand (and had attribute extraction run), and competitor_percentage by responses that mention the tracked competitors. brand_total and competitor_total return those denominators explicitly. Competitor figures aggregate all tracked competitors unless competitor_ids narrows them.
| Name | Type | Req | Description |
|---|---|---|---|
| attribute_id | string | yes | – |
| filters | object | yes | – |
| positive | boolean | – | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| data | array | yes | – |
No examples provided.
get_attributes ~112
List the brand traits (called attributes in the API) tracked for a website: brand-perception keywords such as 'Affordable' or 'Slow Support'. Athena extracts these from AI model responses. Brand traits are direction-neutral; `positive` selects the directional series and defaults to true when omitted. Use this to discover attribute ids, then get_attribute_metrics for how often each is mentioned, or get_attribute_time_series for one attribute's trend over time.
| Name | Type | Req | Description |
|---|---|---|---|
| positive | boolean | – | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| attributes | array | yes | – |
No examples provided.
get_brand_facts ~145
List a website's brand facts from the Knowledge Base, newest first, with offset paging. By default excludes facts generated by Oracle analysis; pass include_oracle=true to include them. Filters: pillar, review status (default approved), source type, and unfiled=true for facts not under any published pillar (unfiled and pillar_id are mutually exclusive).
| Name | Type | Req | Description |
|---|---|---|---|
| include_oracle | string | – | – |
| limit | string | – | – |
| offset | string | – | – |
| pillar_id | string | – | – |
| source_type | string | – | – |
| status | string | – | – |
| unfiled | string | – | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| facts | array | – | – |
| total | integer | – | – |
No examples provided.
get_citation_rate_cumulative ~43
Get cumulative citation rate — average citation rate 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_citation_rate_time_series ~49
Get citation rate over time — how often AI models cite (link to) the website, 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_competitor_attribute_metrics ~187
Get brand trait (attribute) metrics per tracked competitor: for each competitor and each brand-perception keyword (e.g. 'Affordable'), how many AI responses mentioned that keyword for that competitor, and the percentage. Use with get_attribute_metrics to compare the brand against competitors. `total_responses` is per-competitor: responses in the date range that mention THAT competitor and had attribute extraction run on them. Each competitor therefore has its own denominator, and none of them is the website's total response count. `positive` selects the observation direction and defaults to true when omitted. Returns one row per competitor per attribute, so results can be large — filter with competitor_ids. Competitors with no responses in the date range are omitted entirely rather than returned with zeros.
| Name | Type | Req | Description |
|---|---|---|---|
| filters | object | yes | – |
| positive | boolean | – | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| data | array | yes | – |
No examples provided.
get_competitors ~25
List competitors tracked for a website
| Name | Type | Req | Description |
|---|---|---|---|
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| competitors | array | yes | – |
No examples provided.
get_content_citation_prompts ~184
For a single tracked content item, list every prompt whose AI responses cited it — with citations, citation %, and estimated impressions. Use after get_tracked_content to drill into which prompts a given URL is appearing for. This is CITED-BY, measured over the requested date range, not the targeting the page was written for: an empty prompts array means no AI response cited this URL in that window, which is expected for new or never-cited pages and is not missing data. For the prompts a page was written to target, read `prompts` on get_content_detail (or prompt_ids on list_content) — those come from the content record itself and do not depend on any citation having happened.
| Name | Type | Req | Description |
|---|---|---|---|
| content_id | string | yes | – |
| filters | object | yes | – |
| mentioned | boolean | – | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| content_id | string | yes | – |
| content_normalized_url | string|null | yes | – |
| content_url | string|null | yes | – |
| prompts | array | yes | – |
No examples provided.
get_content_detail ~358
Fetch the full detail of a single tracked content item — its brief and body text (drafts, optimize rewrites, snipes, authored and scraped pages), plus status, cited source URLs, and links. Use after get_tracked_content to read the actual text behind a content_id. A status of generated_brief means the brief is ready while the article is still being written. Pages registered via track_content_urls return a null body and null status until their page text is fetched from the app — a null body on an external page means not fetched yet, not missing content; citation tracking does not need the body. `prompts` lists the prompts this page was WRITTEN FOR (the same ids create_content takes), newest-linked last, capped at 100 with the true size in `prompts_total`. When prompts_total exceeds 100 the rest are not currently readable through any tool — report the total, do not imply the list is complete. Entries carry status active, paused or deleted: a deleted prompt is still part of what the page was written for and still shows in the Content Hub, but get_prompts will not list it, so use the text returned here. An empty array means the page has no prompt targeting, which is normal for imported or externally tracked pages. That is a different question from get_content_citation_prompts, which lists prompts whose AI responses CITED the page. To see the reworded variants actually asked of the models for these prompts, pass their ids to get_responses (each row carries base_prompt plus the variation as prompt) or query the responses cube via query_rows on the prompt_variation dimension.
| Name | Type | Req | Description |
|---|---|---|---|
| content_id | string | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| body | string|null | yes | – |
| brief | string|null | yes | – |
| brief_cited_urls | – | yes | – |
| brief_internal_links | – | yes | – |
| cited_urls | – | yes | – |
| content_id | string | yes | – |
| created_at | string | yes | – |
| facebook_post | string|null | yes | – |
| instagram_post | string|null | yes | – |
| internal_links | – | yes | – |
| linkedin_post | string|null | yes | – |
| mark_as_done_time | string|null | yes | – |
| meta_description | string|null | yes | – |
| normalized_url | string|null | yes | – |
| optimize_summary | – | yes | – |
| prompts | array | yes | – |
| prompts_total | integer | yes | – |
| reddit_post | string|null | yes | – |
| sheet_id | string|null | yes | – |
| status | – | yes | – |
| title | string|null | yes | – |
| topic_name | string|null | yes | – |
| type | string|null | yes | – |
| updated_at | string | yes | – |
| url | string|null | yes | – |
| x_post | string|null | yes | – |
No examples provided.
get_content_draft ~118
Read the current draft text of a content item — the article body as it stands right now, including every revision applied so far. Use this before revise_content to see what you are changing, and after it to confirm the result. A status of generated_brief means the brief is ready while the article is still being written, so body may still be empty. For the full record (cited urls, links, social posts) use get_content_detail instead.
| Name | Type | Req | Description |
|---|---|---|---|
| content_id | string | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| body | string|null | – | – |
| brief | string|null | – | – |
| content_id | string | – | – |
| latest_version_number | – | – | – |
| meta_description | string|null | – | – |
| status | string|null | – | – |
| title | string|null | – | – |
No examples provided.
get_content_hub_sheets ~85
List the Content Hub tabs/sheets configured for a website. Use to discover available tabs (e.g. 1st-party content, 3rd-party placements, Reddit) before calling get_tracked_content with a specific sheet_id (metrics; excludes in-flight pipeline items) or list_content (every item including unpublished drafts).
| Name | Type | Req | Description |
|---|---|---|---|
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| sheets | array | yes | – |
No examples provided.
get_content_status ~150
Get the normalized pipeline status (running | succeeded | failed) for one content row, plus the raw stage behind it. Read-only. Poll once per contentId returned by create_content (content.pipeline.start). A stage of generated_brief with status running means the brief is ready and waiting — for a non-auto-approve draft it stays there until approve_brief is called, so do not treat running as always in progress. Not meaningful for tracked pages (track_content_urls / external rows): they have no generation pipeline and report running with a null stage forever — read them via get_tracked_content or get_content_detail instead.
| Name | Type | Req | Description |
|---|---|---|---|
| content_id | string | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| stage | – | – | – |
| status | string | – | – |
No examples provided.
get_content_version ~72
Read the full text of one saved version of a content item. Use it to compare two passes (fetch both and diff them yourself) or to check what an earlier version said before restoring it.
| Name | Type | Req | Description |
|---|---|---|---|
| content_id | string | yes | – |
| version_id | string | yes | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| body | string|null | – | – |
| brief | string|null | – | – |
| change_type | string|null | – | – |
| created_at | string | – | – |
| label | string|null | – | – |
| meta_description | string|null | – | – |
| version_id | string | – | – |
| version_number | integer | – | – |
No examples provided.
get_content_versions ~99
List the saved versions of a content item, newest first. Each entry carries its version number, label, how it was produced, and who made it. Use it to see how a draft evolved, then get_content_version to read a specific one, or restore_content_version to go back to it.
| Name | Type | Req | Description |
|---|---|---|---|
| content_id | string | yes | – |
| limit | integer | – | – |
| offset | integer | – | – |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| total_count | integer | – | – |
| versions | array | – | – |
No examples provided.
get_credit_usage ~258
Read recorded organization credit consumption: total, hourly (24h) or daily trend, and charged website/group/organization pools. Use for spending trends and biggest charged pools; the credit-balance tools read current balances. For 'this month' or a specific spike, supply explicit UTC window boundaries; 30d is rolling, not a calendar month. State the returned interval. A group pool is not an originating website. The breakdown may exclude unattributed usage or be capped by the billing provider; totalCreditsUsed is authoritative, not the sum of displayed entities. Negative credits are refunds. Entities are paginated: continue with window and nextOffset while hasMore. Use credit-usage events to inspect recorded actions. Requires organization billing access on a signed-in connection, or a global organization API key. Website-scoped keys are not supported. Read-only.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | – |
| offset | integer | – | – |
| range | string | – | – |
| website_id | string | yes | – |
| window | object | – | Explicit UTC interval within recorded history, ending no later than now. For the current month or today, use the current UTC time as endAtUtc, not the next calendar boundary. Reuse both returned boun… |
| Name | Type | Req | Description |
|---|---|---|---|
| breakdown_credits_used | number | – | – |
| breakdown_note | string | – | – |
| buckets | array | – | – |
| entities | array | – | – |
| has_more | boolean | – | – |
| next_offset | number | – | – |
| total_credits_used | number | – | – |
| window | object | – | – |
No examples provided.
get_credit_usage_events ~272
Read a page of recorded credit charges/refunds and action labels for the organization, optionally filtered by originatingWebsiteId. Use to inspect a usage spike or charges behind a total. Use credit-usage totals for complete period totals. Supply explicit UTC window for calendar months. Continue with returned window, originatingWebsiteId, and nextOffset while hasMore; never compute the next offset from returned row count. Limit bounds underlying operations, each may split into several charged-pool rows. One page is not a complete action breakdown. 'Not recorded' means unknown historical action/site attribution, never infer it. Unknown raw action tags are preserved. Negative credits are refunds. Requires organization billing access on a signed-in connection, or a global organization API key. Website-scoped keys are not supported. Read-only.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | – |
| offset | integer | – | – |
| originating_website_id | string | – | Optional originating website in this organization; this is different from the charged group pool. |
| range | string | – | – |
| website_id | string | yes | – |
| window | object | – | Explicit UTC interval within recorded history, ending no later than now. For the current month or today, use the current UTC time as endAtUtc, not the next calendar boundary. Reuse both returned boun… |
| Name | Type | Req | Description |
|---|---|---|---|
| attribution_note | string | – | – |
| events | array | – | – |
| has_more | boolean | – | – |
| limit | number | – | – |
| next_offset | number | – | – |
| offset | number | – | – |
| originating_website_id | string|null | – | – |
| window | object | – | – |
No examples provided.
get_credits_organization ~18
Get credit balance for the organization
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| total | object | yes | – |
No examples provided.
get_credits_website ~27
Get credit balance for a specific website
| Name | Type | Req | Description |
|---|---|---|---|
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| credits | object | yes | – |
No examples provided.
get_date_range ~94
Get the earliest and latest response dates for a website
| Name | Type | Req | Description |
|---|---|---|---|
| prompt_status | string | – | – |
| schedule_id | – | – | One schedule: "default" or a custom/archived schedule UUID. Omit for Default, which includes all pre-cutover history and ad hoc runs. The retired "manual" token is accepted as an alias of "default".… |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| max_date | string|null | yes | – |
| min_date | string|null | yes | – |
No examples provided.
get_group_detail ~28
Fetch a single group by id with its member websites.
| Name | Type | Req | Description |
|---|---|---|---|
| group_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| group | object | yes | – |
No examples provided.
get_group_saved_views ~35
List group-level saved views (filter presets) shared across the websites in a group
| Name | Type | Req | Description |
|---|---|---|---|
| group_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| group_saved_views | array | yes | – |
No examples provided.
get_groups ~65
List all groups in the organization (global API key only)
| Name | Type | Req | Description |
|---|---|---|---|
| external_id | string | – | Partner API keys only. Filter by the partner-issued external id mapped to a group. Non-partner API keys passing this field receive 403. Omit unless you are a partner integration. |
| Name | Type | Req | Description |
|---|---|---|---|
| groups | array | yes | – |
No examples provided.
get_identifiers ~128
Read the identifiers of the website's brand, or of one competitor: the names, aliases and domains Athena looks for in AI responses to count a mention. default_identifiers (the name and domain) are always matched and cannot be removed; identifiers lists every other value, as the Competitors page shows them. case_sensitive tells whether matching respects letter case. Read this before update_identifiers. Read-only.
| Name | Type | Req | Description |
|---|---|---|---|
| competitor_id | string | – | The competitor to read or edit, from get_competitors. Omit it for the website's own brand. |
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| case_sensitive | boolean | – | – |
| default_identifiers | array | – | – |
| entity | object | – | – |
| identifiers | array | – | – |
No examples provided.
get_locations ~25
List geo-locations configured for a website
| Name | Type | Req | Description |
|---|---|---|---|
| website_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| locations | array | yes | – |
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.