Tools Reference
The tools documented for the ThriveStack MCP Server, with parameters and what each one does.
This page documents 54 tools of the ThriveStack MCP Server, and its one prompt. They cover your brands and brand kit, AI-search visibility and citations, the AI answers and sources behind each tracked prompt, probe runs, the sources AI answers draw on, your site’s crawl and indexing health, page traffic and Google search performance, traffic attribution, AI crawler visits, AI revenue, the content audit, prompt research, and content recommendations.
53 of the 54 tools are read-only. The only tool that changes anything is save_content_recommendations, which saves recommendations to your brand as suggested items for your team. It cannot approve, dismiss, assign or delete anything, and your AI client asks you to confirm before it runs.
None of these tools take a project_id or similar tenant parameter. Your product and environment are resolved automatically from how you authenticated (OAuth session or Personal Access Token) — see Setup.
Your AI assistant calls these automatically based on your questions. The server also provides one prompt, ai_visibility_analyst, a ready-made content-strategy analysis — see Prompts. It does not expose any MCP resources.
Response format
There is no single universal response envelope — each tool returns the JSON shape natural to its own data. The visibility and recommendation tools return structured report objects, and check_connection returns a small fixed object.
Tools whose description says they return a “clear empty” or “no-data” result are designed to return an empty-but-valid result rather than an error when there’s nothing yet (for example, a domain that hasn’t been probed). Treat that as “nothing here yet”, not a failure. Large results are paged or capped; the tools that page accept page and page_size (or limit and offset).
Brands & Account
get_accessible_brands
Lists the brands (products) the signed-in ThriveStack account can access, with name and domain for each. These are the brands the account can switch between, and the domains the other tools accept. The result is the same whether you connect with OAuth or a personal access token.
No input parameters required.
get_brand_information
Returns the saved brand profile for a domain, as captured during AI Visibility setup and any later edits: description, value offering, industry, HQ country, business model, products and services, brand identity, customer segments, target markets, tracked competitors, tracked topics, language, monitored AI engines, buyer-intent mix, and setup progress (last_completed_step, user_edited).
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Domain to fetch the brand profile for, e.g. acme.com |
get_ai_visibility_setup_status
Whether AI Visibility setup is finished for a brand (configured) and whether its trial has expired (trial_expired). Use it to tell a brand that has not been onboarded yet, or whose trial has ended, apart from one that simply has no data.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Brand domain, e.g. acme.com |
get_brand_kit
The brand kit saved for a domain, which guides how generated content should sound: voice (tone sliders such as formal to casual, author persona, sounds-like and not-like examples), rules (dos and don’ts) and naming (official brand name and aliases), plus version and updated_at.
Good to know
- If no kit has been saved yet, the tool returns
saved=falsewith an empty kit. That is not an error; it means the brand kit has not been set up for the domain. - The brand kit holds voice, rules and naming only. It does not include logos, colours or fonts.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Domain to fetch the brand kit for, e.g. acme.com |
Visibility & Citations
get_domain_report
Returns the visibility report for a brand's most recent completed AI-visibility probe run: overall visibility and average position, competitor and mentioned brands, broken down by topic and by tracked question, with per-AI-model detail. Use it to answer how visible a brand is and who appears alongside it.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Domain to fetch the visibility report for |
page | number | No | Page number of the question list, 1-indexed (default 1) |
page_size | number | No | Questions per page (default 15, max 50) |
topic | string | No | Only this topic, exactly as listed in topic_names (case-insensitive) |
get_prompt_metrics
A filterable visibility report over a date window: visibility, average rank and share of voice per tracked question, per topic and overall, with totals. Slice by AI engine, country and brand, and choose active or archived questions. Use it for questions like “our visibility on Perplexity in the US over the last 30 days”.
Good to know
sov(share of voice) for a question is its share of the mentions across all tracked questions, not just its own answers. For the share within one prompt’s answers, useget_prompt_top_brands.get_domain_reportcovers only the latest run, unfiltered. To compare one AI engine or country with the overall figure, make two calls: one withenginesorcountriesset and one without.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Brand domain, e.g. acme.com |
brand | string | No | Only count answers that mention this brand domain, e.g. a competitor. The metrics stay the brand’s own. |
countries | string[] | No | Only answers from these countries, as ISO-3166 alpha-2 codes, e.g. US, GB |
end_date | string | No | End of the window, YYYY-MM-DD, inclusive |
engines | string[] | No | Only answers from these AI engines, e.g. chatgpt, perplexity, gemini, google-ai-overview, google-ai-mode, copilot, grok |
exclude_customer | boolean | No | Leave the brand itself out of share-of-voice totals |
start_date | string | No | Start of the window, YYYY-MM-DD |
status | string | No | Which tracked questions to include (default active). One of: active, archived. |
get_domain_prompts
Lists the tracked buyer questions (prompts) generated for a brand's domain, grouped by topic. Use it to see or review what is being tracked; it contains no visibility results (get_domain_report has those). The domain must have completed brand setup; otherwise the tool returns an explanatory error message.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Domain to fetch prompts for |
page | number | No | Page number, 1-indexed (default 1) |
page_size | number | No | Prompts per page (default 50, max 200) |
status | string | No | Which prompts to list: active (default, tracked) | suggested | archived. One of: active, suggested, archived. |
topic | string | No | Only this topic, exactly as listed in topic_names (case-insensitive) |
list_domain_topics
Lists a brand’s prompt topics: selected topics, which have tracked (active) prompts, with how many prompts each holds, and suggested topics that are not selected yet, with their kind and how many suggested prompts they hold. Use it to answer which topics are tracked and which are only suggested. The prompts inside each topic are listed by get_domain_prompts.
Good to know
- A topic that has both tracked and suggested prompts is listed once, as selected.
- If the brand has no topics yet, the tool returns
has_data=falsewith a message. That is not an error.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Brand domain, e.g. acme.com |
status | string | No | selected, suggested (suggested but not selected) or all (default). One of: selected, suggested, all. |
get_citation_probe_data
Returns the raw citation evidence from a brand's most recent completed AI-visibility probe run: every tracked buyer question, one record per question and AI engine.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Domain to fetch citation probe evidence for |
limit | number | No | Max records per page (default 20, max 25) |
offset | number | No | Records to skip (default 0); use next_offset from the previous page |
topic | string | No | Only records for this topic, exactly as listed in topics (case-insensitive) |
get_competitor_visibility
Weekly AI-search visibility % (and average rank, where available) for a domain's own brand alongside its tracked competitor brands, side by side — matching the product's AI Visibility > Competitors page. If competitor_domains isn't provided, the domain's saved tracked-competitor list is used automatically.
Good to know
- The
latestsnapshot ranks every brand by its most recent week’s visibility and gives each brand’smentionsandshare_of_voice: its mentions in AI answers as a fraction of all mentions across the returned brands. That is the same measure asget_prompt_metricsand the Competitors page. share_of_voice_basisismentions, orvisibilityfor older weeks recorded before mention counts existed.- If the domain has no tracked competitors and none are passed, or there is no history yet for the window, the tool returns a clear no-data result rather than an error.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Domain to fetch competitor visibility for |
competitor_domains | string[] | No | Optional list of competitor domains to compare against, overriding the domain's saved tracked-competitor list. The domain itself is always included automatically. |
end_date | string | No | End of the window, YYYY-MM-DD, inclusive |
start_date | string | No | Start of the window, YYYY-MM-DD |
weeks | number | No | Number of weeks of history to return (default 8, clamped 1-52) |
get_competitor_metrics
Latest-snapshot visibility, share of voice and average rank for the competitor brands you name, measured in the brand’s own tracked AI answers.
Good to know
- Competitors with no mentions in the latest snapshot come back as zeros.
- The week-by-week trend is in
get_competitor_visibility. The brand’s saved competitor list is inget_brand_information.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Brand domain, e.g. acme.com |
competitor_domains | string[] | Yes | Competitor domains to report on, e.g. from the competitors field of get_brand_information |
get_engine_visibility_trend
Daily AI-search visibility % for a domain's own brand, split by AI engine (ChatGPT, Perplexity, Gemini, ...), with average rank per engine where available. Each point is one day: 'values' maps engine id to visibility %, 'avg_ranks' maps engine id to average position (lower is better). Days appear only when a probe ran, so gaps between dates are normal.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Brand domain, e.g. acme.com |
end_date | string | No | Window end, YYYY-MM-DD (inclusive). Omit for no upper bound. |
start_date | string | No | Window start, YYYY-MM-DD (inclusive). Omit for no lower bound. |
Prompt Drilldown
These tools show the detail behind one tracked prompt: the prompt itself, the AI answers recorded for it, the sources and brands those answers used, and how its visibility moved. Take the prompt_id from get_domain_prompts.
get_domain_prompt
Returns the detail of one tracked prompt (buyer question) for a brand’s domain. It contains no visibility results; get_domain_report has those.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Domain the prompt belongs to |
prompt_id | string | Yes | Prompt id, from get_domain_prompts |
get_prompt_chats
The AI answers recorded for one tracked prompt, newest first: one chat per AI engine, country and run. Each chat has engine, model, country_code, probed_at, visibility, avg_rank, our_citations and total_citations, the full answer_text, the brands named (name, domain, rank, is_customer) and the citations used (title, domain, uri).
Answers are long, so chats come in small pages (default 5, max 10): total, page and next_page say where you are. get_prompt_chat returns one chat by id.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Domain the prompt belongs to |
prompt_id | string | Yes | Prompt id, from get_domain_prompts |
end_date | string | No | Window end, YYYY-MM-DD (inclusive). Omit for no upper bound. |
page | number | No | Page number, 1-indexed (default 1) |
page_size | number | No | Chats per page (default 5, max 10) |
start_date | string | No | Window start, YYYY-MM-DD (inclusive). Omit for no lower bound. |
get_prompt_chat
One recorded AI answer: the engine, model and country, the full answer_text, the brands named (name, domain, rank, is_customer) and the citations used (title, domain, uri), with visibility, avg_rank and citation counts.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Domain the answer belongs to |
result_id | string | Yes | Chat id: result_id from get_citation_probe_data or id from get_prompt_chats |
get_prompt_sources
The sources AI answers used for one tracked prompt, ranked by retrievals: cited domains (default) or individual URLs. Each row has retrievals, and for URLs the uri and title, chats_used and citations. Returns the top rows only (default 25, max 100); total_retrievals is the full count.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Domain the prompt belongs to |
prompt_id | string | Yes | Prompt id, from get_domain_prompts |
end_date | string | No | Window end, YYYY-MM-DD (inclusive). Omit for no upper bound. |
grain | string | No | Rank cited domains (default) or individual cited URLs. One of: domain, url. |
limit | number | No | Max rows (default 25, max 100) |
start_date | string | No | Window start, YYYY-MM-DD (inclusive). Omit for no lower bound. |
get_prompt_top_brands
The brands AI answers name for one tracked prompt, ranked: each with rank, name, domain, visibility, share of voice (sov) and average position, plus total_responses behind them.
Good to know
sovhere is the brand’s share of the mentions in this prompt’s answers only, so it can be much higher than thesovof the same prompt inget_prompt_metrics, which is a share of the mentions across all tracked prompts.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Domain the prompt belongs to |
prompt_id | string | Yes | Prompt id, from get_domain_prompts |
end_date | string | No | Window end, YYYY-MM-DD (inclusive). Omit for no upper bound. |
start_date | string | No | Window start, YYYY-MM-DD (inclusive). Omit for no lower bound. |
get_prompt_visibility_trend
One tracked prompt’s visibility over time: the percent of its AI answers that name the brand, as a series of points (date, visibility) by day (default), week or month.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Domain the prompt belongs to |
prompt_id | string | Yes | Prompt id, from get_domain_prompts |
end_date | string | No | Window end, YYYY-MM-DD (inclusive). Omit for no upper bound. |
granularity | string | No | Point spacing: day (default), week or month. One of: day, week, month. |
start_date | string | No | Window start, YYYY-MM-DD (inclusive). Omit for no lower bound. |
Probe Runs
A probe run is the scheduled pass that asks every tracked question across the AI engines. These tools show a run’s status, one engine’s full answer, and when the next run is due.
get_probe_run
Status of one AI-visibility probe run: status, progress, start and finish times, and per-topic results where the run has them. Omit run_id for the brand’s latest run.
Use it to check whether a run is still in progress before reading reports such as get_domain_report.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Brand domain, e.g. acme.com |
run_id | string | No | Probe run id, e.g. run_id from get_domain_report or get_citation_probe_data. Omit for the latest run. |
get_probe_result
One AI engine’s full answer to one tracked question: the answer text, the brands it named with their rank, its citations, and the engine and country.
Use it to read exactly what an engine said, for example to explain why the brand was not mentioned. Get the result_id from get_citation_probe_data.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Brand domain, e.g. acme.com |
result_id | string | Yes | Answer id: result_id from get_citation_probe_data |
get_probe_schedule
The brand’s probe and site-audit schedules: cadence, last and next run, and answers remaining.
Use it to explain why data looks stale, or when it will next refresh. It returns a not-found error if the brand has no schedule.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Brand domain, e.g. acme.com |
Sources & Pages
get_url_report
Per-URL retrieval and citation metrics for every source URL AI answers drew on for a domain’s tracked questions: which specific pages are retrieved and cited, and how often, with each URL’s type, domain type and source class (owned, earned or other cited). It lists source URLs from any site that AI answers cited, not only the brand’s own pages.
Good to know
- Without a date window it covers the most recent completed probe run. Source metrics are computed after a run finishes; until then the tool returns
has_run=true, urls_computed=falserather than an empty list. Withstart_date/end_dateit covers every run in the window. retrievalsis how many answers cited the URL, andretrieved_pctis the percent of all answers that cited it.citation_rateis the average number of times the URL was cited per answer that cited it. It is 1.0 or more and is not a percentage.- Default sort is
retrievals, highest first.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Domain to fetch the URL report for |
brand_logic | string | No | Whether a source must match any (or, default) or all (and) of brands. One of: or, and. |
brands | string[] | No | Only sources whose answers mention these brand domains |
dir | string | No | Sort direction (default desc). One of: asc, desc. |
domain_types | string[] | No | Only sources with any of these domain types |
end_date | string | No | End of the window, YYYY-MM-DD, inclusive |
min_brands | number | No | Only sources whose answers mention at least this many brands |
page | number | No | Page number, 1-indexed (default 1) |
page_size | number | No | Page size (default 25, max 100) |
search | string | No | Filter by substring match against URL, title, domain, URL type, or domain type |
sort | string | No | Sort column (default retrievals). One of: retrievals, retrieved_pct, retrieval_rate, citation_rate, mentions, self_mentioned, url, domain, url_type, domain_type, source_class. |
source_class | string | No | Only sources of this class: owned (the brand's own site), earned (third-party coverage of the brand) or other_cited. One of: owned, earned, other_cited. |
source_subtype | string | No | Narrow source_class to one subtype |
start_date | string | No | Start of the window, YYYY-MM-DD |
url_types | string[] | No | Only sources with any of these URL types |
get_cited_domains
Per-domain retrieval and citation metrics for every website AI answers drew on for a brand’s tracked questions, with each domain’s type and source class (owned, earned or other cited). It is the domain-level twin of get_url_report and behaves the same way.
Good to know
- Without a date window it covers the latest completed run, and says so if that run’s source metrics are not computed yet (
urls_computed=false). Withstart_dateandend_dateit covers every run in the window. retrievalscounts every citation of the domain.retrieved_pctis the percent of all answers that cited it at least once.retrieval_rateis its citations per answer across all answers.citation_rateis its average number of citations per answer that cited it. It is 1.0 or more and is not a percentage.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Brand domain, e.g. acme.com |
brand_logic | string | No | Whether a source must match any (or, default) or all (and) of brands |
brands | string[] | No | Only sources whose answers mention these brand domains |
dir | string | No | Sort direction (default desc). One of: asc, desc. |
domain_types | string[] | No | Only sources with any of these domain types |
end_date | string | No | End of the window, YYYY-MM-DD, inclusive |
min_brands | number | No | Only sources whose answers mention at least this many brands |
page | number | No | Page number, 1-indexed (default 1) |
page_size | number | No | Page size (default 25, max 100) |
search | string | No | Filter by substring match against URL, title, domain, URL type, or domain type |
sort | string | No | Sort column (default retrievals). One of: retrievals, retrieved_pct, retrieval_rate, citation_rate, mentions, self_mentioned, url, domain, url_type, domain_type, source_class. |
source_class | string | No | Only sources of this class: owned (the brand's own site), earned (third-party coverage of the brand) or other_cited |
source_subtype | string | No | Narrow source_class to one subtype |
start_date | string | No | Start of the window, YYYY-MM-DD |
url_types | string[] | No | Only sources with any of these URL types |
get_source_mix_summary
Where AI answers about a domain's prompts get their information, summarised over a date window — matching the panels above the product's AI Visibility > Domains and URLs tables.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Brand domain, e.g. acme.com |
end_date | string | No | Window end, YYYY-MM-DD (inclusive). Omit for no upper bound. |
grain | string | No | Summarise cited domains (default) or individual cited URLs One of: domain, url. |
source_class | string | No | Only count sources of this class in movers and type_shares One of: owned, earned, other_cited. |
source_subtype | string | No | With source_class: only that domain type, using a subtype value exactly as returned in source_mix (e.g. Editorial) |
start_date | string | No | Window start, YYYY-MM-DD (inclusive). Omit for no lower bound. |
top | number | No | How many movers to return (default 20, max 100) |
get_source_trend
How often the most-used sources were retrieved by AI answers over time, for a domain's prompts — the product's 'Source retrievals over time' chart on AI Visibility > Domains and URLs. Returns 'labels' (one per day, week or month) and 'series' (one per source, 'values' aligned to labels).
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Brand domain, e.g. acme.com |
end_date | string | No | Window end, YYYY-MM-DD (inclusive). Omit for no upper bound. |
grain | string | No | Trend cited domains (default) or individual cited URLs One of: domain, url. |
granularity | string | No | Bucket size (default day) One of: day, week, month. |
start_date | string | No | Window start, YYYY-MM-DD (inclusive). Omit for no lower bound. |
get_competitor_source_mix
For the domain's brand and each competitor, the share of AI-answer source retrievals that come from the brand's own site (owned), from third-party pages mentioning it (earned) and from everything else (other), measured across the domain's tracked prompts. Values are whole-number percentages that sum to 100 per brand (all three 0 means no retrievals).
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Brand domain, e.g. acme.com |
competitor_domains | string[] | No | Competitor domains to compare, overriding the saved tracked-competitor list. The brand itself is always included. |
end_date | string | No | Window end, YYYY-MM-DD (inclusive). Omit for no upper bound. |
start_date | string | No | Window start, YYYY-MM-DD (inclusive). Omit for no lower bound. |
get_source_run_days
The days on which a brand’s prompts were run and their cited sources recorded: first_run_day, last_run_day, total_runs and every day in run_days. Use it to choose a start_date and end_date that contain data before calling get_source_mix_summary, get_source_trend or get_competitor_source_mix, or to explain why one of them came back empty.
Good to know
- If no run has recorded sources yet, the tool returns
has_data=falsewith a message. That is not an error.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Brand domain, e.g. acme.com |
grain | string | No | Run days with cited domains (default) or cited URLs. One of: domain, url. |
Site & Crawl Health
list_urls
Paged table of the brand's URLs (brand from your token), one row per URL that the brand's Search Console sync knows about: sitemap URLs plus any pages added by hand. Each row combines four sources: Google indexing (indexState, coverageDetail, crawlAllowed, lastCrawlTime), AI-crawler reach (crawlHits and crawlBots), the content audit (contentStatus, seoScore, entityScore, only for audited pages) and AI citations (cited, citedPromptCount, and citedBy, up to 10 of the citing prompts, newest first, each with probed_at). Filters are ANDed; a comma list inside one filter means any of.
Good to know
crawlHitsandcrawlBotscount requests made by AI crawlers such as GPTBot and ClaudeBot. They are not human visits. Human visits come fromget_page_traffic.- The list is empty until Search Console is connected and has synced.
get_search_console_statusshows the connection. - The response includes
columns, which says which sources are set up (indexed,crawled,content). When one isfalse, its fields are absent because the source is not set up. That is different from a value of zero. totalcounts every matching row. Page through them withpageandpage_size.- Pages that AI answers cite on any site, not only the brand's own, are covered by
get_url_report.
This tool takes no domain parameter. It always reads the brand your token belongs to.
| Parameter | Type | Required | Description |
|---|---|---|---|
ai_crawled | string | No | yes = fetched by at least one AI crawler; no = never. One of: yes, no. |
cited | string | No | yes = AI answers cited this URL in a tracked prompt; no = never cited. One of: yes, no. |
content_status | string[] | No | Only URLs in any of these content-audit states: not_configured (not in the content report), queued (in the report, not scored yet), complete (scored), failed |
google_crawled | string | No | yes = Google has a last crawl time for the URL; no = not crawled yet. One of: yes, no. |
in_content_report | string | No | yes = the URL is in the content audit report. One of: yes, no. |
index_state | string[] | No | Only URLs in any of these Google index states. Values: indexed, not_indexed, excluded, error, pending. |
order | string | No | Sort order (default asc); used only with sort_by. One of: asc, desc. |
page | number | No | Page number, 1-indexed (default 1) |
page_size | number | No | Page size (default 25, max 100) |
search | string | No | Substring match on URL or coverage detail |
sort_by | string | No | Sort column (default: server order). 'crawled' sorts by AI-crawler hit count. One of: indexState, crawled, googleCrawled, contentStatus, seoScore, entityScore, lastCrawlTime, updatedAt. |
get_url_details
Details for one URL of the brand on your token. Today this is the Google Search Console view: index state, coverage detail, whether crawling is allowed, last Google crawl, plus the raw URL Inspection result under 'raw' (verdict, robots/canonical/mobile details as Google returned them).
| Parameter | Type | Required | Description |
|---|---|---|---|
url | string | Yes | Full page URL exactly as listed by list_urls |
get_url_funnel
URL funnel for the brand on your token, as on the AI Visibility > URLs page: sitemap URLs → crawled by Google → indexed by Google, plus an aiReach band (sitemap URLs an AI crawler actually fetched vs. not).
No input parameters required.
get_search_console_status
Google Search Console connection and sync state for the brand on your token: whether it's connected, the selected property, the brand's configured domain and whether the property matches it, the connected Google account, last poll time, the sync schedule (last/next run, cadence, tier) and any in-flight sync run (queued | running | paused, with resumesAt when paused).
No input parameters required.
get_technical_recommendations
Technical AI-crawlability and on-page/entity-signal recommendations for a domain's most recent completed audit — matching the product's AI Visibility > Technical group (Crawl Insights, Content & SEO, Entity Signals tabs). Distinct from get_owned_content_recommendations/get_earned_content_recommendations, which are citation-gap content ideas, not technical checks.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Domain to fetch technical recommendations for |
include_explanations | boolean | No | Also return what_this_checks, the fixed explanation of each check, which is the same on every page and makes the result much longer (default false) |
page | number | No | Page number of the audited pages, 1-indexed (default 1); ignored with page_url |
page_size | number | No | Audited pages per page (default 2, max 20); ignored with page_url |
page_url | string | No | Scope page_recommendations to a single page URL. Omit to get every audited page's recommendations. |
status | string | No | Filter both sections to items with this check status: PASS | WARN | FAIL |
workflow | string | No | Filter both sections to items in this workflow state: suggested | todo | done |
Traffic & Search Performance
These tools show how much real traffic each page gets and how it performs in Google, next to the AI-crawler and citation data above. Together with list_urls they give a page-by-page view of a site, which is what a content calendar needs.
Matching pages across tools. get_page_traffic and get_search_performance identify a page by its normalised path: host, query string and trailing slash removed, lower-case. A page therefore has the same key in both, and you can join them on it.
No data is not zero. Each tool says in meta whether its source is connected. If it is not, the tool has no data to report, which is different from a page with zero visits or zero clicks.
get_page_traffic
Human visits per page from the connected Google Analytics, across every channel, not only AI-referred ones. For each landing page it returns:
- sessions in the window, split into organic search, direct, AI referral and other (paid and email visits are included in these);
- key events (conversions);
- the last day with sessions in the window;
first_seen, the oldest day Google Analytics shows sessions for the page. This is a lower bound on when the page went live, because history starts when the connection first synced.
A session counts on the page it started on, so this is not a page-view count. Defaults to the last 28 days. Results are sorted and paged on the server, with totals over the whole filtered set.
Good to know
- Totals can sit a few percent below
get_traffic_attribution_overview. That report reads Google Analytics by channel and day, while this one reads it by landing page, so the two do not match exactly. metasays whether Google Analytics is connected (configured=falsemeans there is no data to report, not zero visits), whether it is still syncing, and how many sessions had no landing page or were grouped into Google's “(other)” row. When that happens, the page list is incomplete.- Crawler hits from Cloudflare, Vercel or WordPress are AI-bot requests and are not part of these visits.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Brand domain, e.g. acme.com |
end_date | string | No | End of the window, YYYY-MM-DD, inclusive |
page | number | No | Page number, 1-indexed (default 1) |
page_size | number | No | Rows per page (default 25, max 200) |
property_id | string | No | Only this Google Analytics property, as listed in properties of a previous response. Omit to sum all connected properties. |
search | string | No | Only pages whose path contains this text, case-insensitive |
sort_by | string | No | Sort column (default sessions). One of: sessions, organic_sessions, direct_sessions, ai_sessions, other_sessions, key_events, last_seen, page. |
sort_dir | string | No | Sort direction (default desc, or asc when sorting by page). One of: asc, desc. |
start_date | string | No | Start of the window, YYYY-MM-DD. Give it with end_date; omit both for the last 28 days. |
get_search_performance
Google Search Console clicks and impressions per page for the brand on your token. For each page it returns clicks, impressions, CTR (a decimal, so 0.0123 means 1.23%) and average position (1 is the top of the results, weighted by impressions), summed over the window, plus totals over the whole filtered set. example_url shows one full URL for the page.
Defaults to the last 28 days ending two days ago, because Search Console runs about two days behind. Results are sorted and paged on the server.
Good to know
- The data comes from a daily sync.
metasays whether Search Console is connected (configured=falsemeans there is no data, not zero clicks), whether the first sync is still running (syncing), the oldest and newest day held (data_from,data_through), and warns when your window reaches outside them. - Only pages that Google showed in its results have a row. A page with no row was not shown in the window.
get_search_console_statusshows the connection and sync state.
This tool takes no domain parameter. It always reads the brand your token belongs to.
| Parameter | Type | Required | Description |
|---|---|---|---|
end_date | string | No | End of the window, YYYY-MM-DD, inclusive |
page | number | No | Page number, 1-indexed (default 1) |
page_size | number | No | Rows per page (default 25, max 200) |
search | string | No | Only pages whose path contains this text, case-insensitive |
sort_by | string | No | Sort column (default clicks). One of: clicks, impressions, ctr, position, page. |
sort_dir | string | No | Sort direction (default desc; asc for position and page). One of: asc, desc. |
start_date | string | No | Start of the window, YYYY-MM-DD. Give it with end_date; omit both for the last 28 days ending two days ago. |
get_attribution_health
A plain-language health check of the data behind the attribution dashboards, in one call. Read-only.
- Sources. For Google Analytics, Cloudflare, Vercel, WordPress and revenue, it reports whether the source is connected, still syncing, working or needs attention, with when it last synced and a short reason.
- AI crawler tracking. It reports whether the add-on is on, how much of it is used, and whether a crawler visit has been confirmed.
- Overall.
overallis one of working, setting_up, needs_attention, not_connected or unknown (when the sources could not be read).attentionlists what needs a look, as plain sentences. - Coverage.
coveragesays what each source can tell you. Google Analytics is the only source of human visits. Cloudflare, Vercel and WordPress report AI bot requests only, so a connected crawler source never means visit data. Coverage is explanation only; it does not changeattentionoroverall.
If one part cannot be read, its entry carries an error message and the others still report.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Brand domain, e.g. acme.com |
get_traffic_attribution_overview
Traffic Attribution over time: visits from direct, organic, AI referral links (ai_utm) and AI citations (ai_citation), AI crawler hits, revenue and all other channels, per day, week or month, with totals for the window and for the equal-length window before it.
Good to know
- Defaults to the last 180 days. Give
start_dateandend_datetogether, for at most 400 days. The bucket width follows the window length unless you setgranularity. - A
nullvalue means it could not be measured, which is different from zero. Each series reports its status, source and first data date. metacarriesconfigured,no_data,data_stale,history, the revenue currency and the connected Google Analytics properties.property_idnarrows the Google Analytics series to one property; without it they are summed.- Rows are whole buckets counted back from
end_date, so a partial first bucket is counted in the totals but not in the rows.rows_notesays when this happens and which days. - The direct, organic and AI referral visit series come from Google Analytics. Crawler hits are requests made by AI bots, not visits.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Brand domain, e.g. acme.com |
end_date | string | No | End of the window, YYYY-MM-DD, inclusive |
granularity | string | No | Bucket width. Omit to pick it from the window length (day up to 45 days, week up to 120, month beyond) |
property_id | string | No | Only this Google Analytics property, as listed in meta.properties of a previous response. Omit to sum all connected properties |
start_date | string | No | Start of the window, YYYY-MM-DD |
get_traffic_attribution_sources
Connection state of every data source behind Traffic Attribution: Google Analytics, Cloudflare, Vercel, WordPress and revenue.
Good to know
- Each source returns a state (
not_connected,syncing,connectedorneeds_attention), what it is connected to, the last sync time, how many days of history it holds, and a short reason while it is syncing or needs attention. - A source can also carry an
issue:error(the latest delivery failed),quiet(still connected, but nothing has arrived for two days or more, which a site with no visitors also causes),stale(the newest data is older than expected) ordisconnected(the connection was removed on the provider’s side, so nothing is arriving). needs_attentioncovers stale data, a delivery error, a disconnected source, a missing base currency, or a source that could not be read. A source that is not connected is not an error; it simply has no data in the traffic overview.- Cloudflare, Vercel and WordPress feed the AI crawler hits only. Human visits come from Google Analytics. For a one-call summary see
get_attribution_health.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Brand domain, e.g. acme.com |
AI Crawlers
These tools report requests made by AI bots and agents, such as GPTBot and ClaudeBot. They are not human visits; human visits come from Google Analytics (see get_page_traffic and get_traffic_attribution_overview).
They need the AI crawler add-on and crawler tracking. While the add-on is off, the data tools answer addon_required.
get_agent_visit_addon
Whether the AI crawler add-on is switched on for the brand and how much of it has been used.
Good to know
- Returns
enabled(the AI crawler dashboard is unlocked), the billing frequency, trial and period dates, usage for the current period (events used, allowed and included, overage blocks, estimated overage cost in cents, and whether the period is a free trial) and the plan terms (platform fee, events included and block price, in cents). - Read-only: it does not switch the add-on on or off, and it does not return a payment link.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Brand domain, e.g. acme.com |
get_agent_visit_recommendations
Crawl-health fixes found from the brand’s AI crawler visits, such as pages that AI bots reach with errors.
Good to know
- Each recommendation has a title, rationale, ordered steps, a priority, an effort estimate and a suggested owner role, how many bot hits and URLs it affects over the analysed window, and its status (
suggested,todo,doneordismissed). - Filter by
status, or omit it for all. Needs the AI crawler add-on and crawler tracking; the response isaddon_requiredwhile the add-on is off.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Brand domain, e.g. acme.com |
status | string | No | Only recommendations with this status. Omit for all. One of: suggested, todo, done, dismissed. |
get_ai_crawl_summary
AI crawler and agent visits to the brand’s site: total hits, active bots, failure rate, the top bot, top folders and pages, visits per day, and splits by platform (the AI company, such as OpenAI), bot type and response status code.
Good to know
- Defaults to the last 30 days. Filter by platform, bot type or bot.
- The daily series covers only the five busiest bots.
top_botslists every bot, so the daily series can add up to less thantotal_hits. platformstakes the AI company (OpenAI, Anthropic, Perplexity, Google), not the connector (Cloudflare, Vercel) that reports the visits.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Brand domain, e.g. acme.com |
bot_types | string[] | No | Only these bot types, as named in the crawler summary |
bots | string[] | No | Only these bots, for example GPTBot or ClaudeBot |
end_date | string | No | End of the window, YYYY-MM-DD, inclusive. Omit for today |
platforms | string[] | No | Only visits by bots of these AI platforms, as named in by_platform of the crawler summary, for example OpenAI, Anthropic, Perplexity or Google. These are the AI companies, not the connector (Cloudflare, Vercel) that reports the visits |
start_date | string | No | Start of the window, YYYY-MM-DD. Omit for 30 days before the end |
get_ai_crawl_urls
The pages AI crawlers fetch: per URL, the hits, folder, status group (for example 2xx or 4xx) and the platform split, most-hit first. It uses the same window and filters as the crawler summary.
Good to know
- Returns the first
limitrows (default 100, at most 500) and says how many exist in total, so a long list does not arrive all at once. - The Vercel middleware connector cannot see the real response status and records every request as 200, so status groups are not meaningful for it.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Brand domain, e.g. acme.com |
bot_types | string[] | No | Only these bot types, as named in the crawler summary |
bots | string[] | No | Only these bots, for example GPTBot or ClaudeBot |
end_date | string | No | End of the window, YYYY-MM-DD, inclusive. Omit for today |
limit | number | No | Most rows to return (default 100, at most 500) |
platforms | string[] | No | Only visits by bots of these AI platforms, as named in by_platform of the crawler summary, for example OpenAI, Anthropic, Perplexity or Google. These are the AI companies, not the connector (Cloudflare, Vercel) that reports the visits |
start_date | string | No | Start of the window, YYYY-MM-DD. Omit for 30 days before the end |
AI Revenue
Sessions, conversions and revenue that come from AI sources, from the brand’s connected Google Analytics. A null value means it could not be measured, which is different from zero. property_id narrows a result to one Google Analytics property; otherwise they are summed.
get_ai_revenue_summary
The headline numbers of AI revenue attribution over a window: sessions from AI sources, conversions and revenue, and revenue per session for AI traffic against organic search, each with its change against the previous period of the same length.
Good to know
- Defaults to the last 30 days.
metasays whether revenue is derived from conversions and a deal value, whether the sample is too small to trust, whether the window has no data, the newest data day and whether the sync is behind, and whether revenue attribution is set up at all.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Brand domain, e.g. acme.com |
attribution_scope | string | No | session credits the AI source of each session (default); firsttouch credits the AI source that first brought the visitor |
end_date | string | No | End of the window, YYYY-MM-DD, inclusive |
property_id | string | No | Only this Google Analytics property, as listed in meta.properties of the traffic overview. Omit to sum all connected properties |
start_date | string | No | Start of the window, YYYY-MM-DD. Omit both dates for the last 30 days |
get_ai_revenue_trend
AI revenue attribution over time: sessions, conversions or revenue per bucket for AI sources, organic search and direct, plus a breakdown of the AI sources.
Good to know
metricpicks what is plotted, andgranularityis week (starting Monday) or day. Defaults to the last 30 days by week.- The three series are always present and zero-filled. A
nulltotal means it could not be measured.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Brand domain, e.g. acme.com |
attribution_scope | string | No | session credits the AI source of each session (default); firsttouch credits the AI source that first brought the visitor |
end_date | string | No | End of the window, YYYY-MM-DD, inclusive |
granularity | string | No | Bucket width (default week; weeks start on Monday) |
metric | string | No | What to plot (default sessions). One of: sessions, conversions, revenue. |
property_id | string | No | Only this Google Analytics property, as listed in meta.properties of the traffic overview. Omit to sum all connected properties |
start_date | string | No | Start of the window, YYYY-MM-DD. Omit both dates for the last 30 days |
get_ai_revenue_pages
The landing pages that receive AI-referred traffic: per page, AI sessions, conversions, conversion rate, revenue, revenue per session and how often AI answers cite the page, with the AI vendors behind it.
Good to know
- Paged and sorted on the server. Filter by page type or AI vendor. Totals cover the whole filtered set, not only the page returned.
- Each row says whether its revenue is native, modeled or absent, and
citationscan benullwhen the citation data is unavailable. - Only pages that received AI-referred sessions are listed, and the session counts are AI sessions, not total visits to the page. Sessions with no landing page are left out (
meta.pages_excluded_unattributed), so totals can be lower thanget_ai_revenue_summary. - Days follow
meta.time_zone, which can differ from the UTC days of the traffic tools.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Brand domain, e.g. acme.com |
attribution_scope | string | No | session credits the AI source of each session (default); firsttouch credits the AI source that first brought the visitor |
end_date | string | No | End of the window, YYYY-MM-DD, inclusive |
page | number | No | Page number, starting at 1 |
page_size | number | No | Rows per page (default 25, at most 200) |
page_type | string | No | Only pages of this type, for example pricing or comparison |
property_id | string | No | Only this Google Analytics property, as listed in meta.properties of the traffic overview. Omit to sum all connected properties |
sort_by | string | No | Column to sort by (default revenue). citations sorts only within the returned page. One of: revenue, sessions, conversions, cvr, value_per_session, citations. |
sort_dir | string | No | Sort direction (default desc). One of: asc, desc. |
start_date | string | No | Start of the window, YYYY-MM-DD. Omit both dates for the last 30 days |
vendor | string | No | Only traffic from this AI vendor, for example chatgpt or perplexity |
Content Audit
These tools show which pages are tracked for the content audit, how many page audits your plan allows and how many are used, and which sitemap pages you could add.
get_content_audit_summary
Content audit status for a brand’s domain: how many pages are audited, queued and active, the plan’s page-audit limit (page_audits_purchased), how many are used (page_audits_consumed) and pages_remaining (limit minus used). Each page row has its SEO and AEO scores, pending actions by priority, last audit time and whether AI answers cite it. It also returns sitemap_status and coverage_warnings when present.
Good to know
pages_remainingis absent when the plan figures are unavailable.- Page rows come in pages:
total,returnedandnext_pagesay where you are. - Set
include_sitemapto also list sitemap and AI-cited pages that are not in the report (in_report=false). Those pages are not counted in any total.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Domain to fetch the content audit summary for |
include_sitemap | boolean | No | Also list sitemap and AI-cited pages not in the report (default false) |
page | number | No | Page number of the page rows, 1-indexed (default 1) |
page_size | number | No | Page rows per page (default 25, max 50) |
list_content_audit_pages
The pages tracked for a brand’s content audit: url, label and source (auto = picked by the system, user = added by the team). Pages come in batches: total, returned and next_page say where you are. Scores and action counts are in get_content_audit_summary.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Domain to list content audit pages for |
page | number | No | Page number, 1-indexed (default 1) |
page_size | number | No | Pages per batch (default 25, max 100) |
list_content_audit_sitemap_urls
Sitemap URLs found for a brand’s domain that can be added to the content audit: has_sitemap, the sitemap url, url_count and the urls themselves. urls_capped is true when the stored list was cut short. URLs come in pages: total, returned and next_page say where you are.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Domain to list sitemap URLs for |
page | number | No | Page number, 1-indexed (default 1) |
page_size | number | No | URLs per page (default 100, max 500) |
Prompt Research
list_prompt_research
Lists a brand's prompt research sessions: each is a run that discovers the questions buyers ask AI about the brand's category, from which the user picks prompts to track.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Brand domain whose prompt research to list, e.g. acme.com |
page | number | No | Page number, 1-indexed (default 1) |
page_size | number | No | Sessions per page (default 100, max 200) |
get_prompt_research
Returns one prompt research session's researched prompts and personas. Each prompt has prompt_text, topic, persona, branding (branded or non-branded), intent (informational, commercial or transactional), country, language, recommended and tracked. Prompts are grouped either by topic or by persona. Get the id from list_prompt_research.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Brand domain the research belongs to, e.g. acme.com |
group_by | string | No | How to group prompts: topic (default) or persona |
id | string | Yes | Research id from list_prompt_research |
page | number | No | Page number of the prompts, 1-indexed (default 1) |
page_size | number | No | Prompts per page (default 100, max 200) |
tracked_only | boolean | No | If true, return only prompts already tracked |
Recommendations
get_owned_content_recommendations
Lists content recommendations for the brand's own site (channel_type onsite): content to publish on your blog or site to close the AI-citation gaps found in probing. Each item includes severity_tier, gap_score, our_citations and total_citations, and competitors_winning as evidence.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Domain to fetch owned content recommendations for |
channel | string | No | Filter by channel, e.g. Blog |
limit | number | No | Max results per page (default 25, max 100) |
offset | number | No | Results to skip (default 0) |
priority | string | No | Filter by priority: HIGH | MED | LOW |
status | string | No | Filter by status: suggested | todo | approved | dismissed (default: all active statuses, dismissed excluded) |
get_earned_content_recommendations
Lists content recommendations for earned, third-party media (channel_type earned): ideas for getting cited on sites such as Reddit, G2 or other reference and editorial domains.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Domain to fetch earned content recommendations for |
channel | string | No | Filter by channel, e.g. Reddit, G2 |
limit | number | No | Max results per page (default 25, max 100) |
offset | number | No | Results to skip (default 0) |
priority | string | No | Filter by priority: HIGH | MED | LOW |
status | string | No | Filter by status: suggested | todo | approved | dismissed (default: all active statuses, dismissed excluded) |
Drafting & Saving
generate_content_outline
Generates a content outline (structure only, not finished copy) for one owned-media content recommendation: headings, an answer-first opening summary, FAQ questions, and suggested schema markup types. The outline is generated on request and nothing is saved; calling it again produces a new one.
| Parameter | Type | Required | Description |
|---|---|---|---|
content_type | string | Yes | Owned-media content type — one of: Homepage, Domain, Product, Comparison, Article, Educational, Blog, Guide, How-to, Documentation, Listicle, Wiki |
title | string | Yes | The content recommendation's title to outline (e.g. from get_owned_content_recommendations) |
save_content_recommendations
Saves content recommendations (owned and/or earned) to the brand's recommendations list as 'suggested' items for the team to act on. This is the only tool that writes data, and it is deliberately narrow: it creates new 'suggested' items or refreshes ones still 'suggested'.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Brand domain the recommendations are for |
recommendations | object[] | Yes | Recommendations to save (max 30) |
probe_run_id | string | No | The probe run the evidence came from (run_id from get_citation_probe_data). Omit to use the latest run with results. |
Diagnostics
check_connection
Confirms the ThriveStack connection is working and your sign-in was accepted. Returns the server time.
No input parameters required.
Changes over time
New tools are added from time to time, and we update this page when they go live. See the Changelog for every tool added or changed since v1, with dates.