> ## Documentation Index
> Fetch the complete documentation index at: https://docs.reputably.net/llms.txt
> Use this file to discover all available pages before exploring further.

# MCP tool reference

> Every tool the Reputably MCP server exposes, with its parameters.

These are the tools an assistant sees once it connects to
`https://app.reputably.net/api/mcp`. The surface is **read plus safe writes**: it can read
your data and generate drafts. It cannot send anything to an external platform,
and it cannot trigger a sync. See [What agents cannot do](/guides/limits).

<Info>
  Tool descriptions here are the exact strings the model reads at runtime, generated
  from the server catalog. If a tool is missing from this page it does not exist.
</Info>

## The 35 tools

| Tool                                                        | Access | What it does                                |
| ----------------------------------------------------------- | ------ | ------------------------------------------- |
| [`list_workspaces`](#list_workspaces)                       | Read   | List workspaces                             |
| [`list_businesses`](#list_businesses)                       | Read   | List businesses                             |
| [`get_business`](#get_business)                             | Read   | Get business                                |
| [`get_business_usage`](#get_business_usage)                 | Read   | Get business usage                          |
| [`list_reviews`](#list_reviews)                             | Read   | List reviews                                |
| [`list_mentions`](#list_mentions)                           | Read   | List brand mentions                         |
| [`list_leads`](#list_leads)                                 | Read   | List leads                                  |
| [`list_brand_trackers`](#list_brand_trackers)               | Read   | List brand trackers                         |
| [`competitor_leaderboard`](#competitor_leaderboard)         | Read   | Competitor leaderboard                      |
| [`list_visibility_trackers`](#list_visibility_trackers)     | Read   | List AI-visibility trackers                 |
| [`get_visibility_summary`](#get_visibility_summary)         | Read   | Get AI-visibility summary                   |
| [`list_visibility_prompts`](#list_visibility_prompts)       | Read   | List AI-visibility prompts                  |
| [`get_prompt_performance`](#get_prompt_performance)         | Read   | Get AI-visibility prompt performance        |
| [`get_fanout_stats`](#get_fanout_stats)                     | Read   | Get AI-visibility fan-out (retrieval) stats |
| [`get_visibility_sources`](#get_visibility_sources)         | Read   | Get AI-visibility sources                   |
| [`get_visibility_countries`](#get_visibility_countries)     | Read   | List AI-visibility countries                |
| [`list_ai_traffic_sites`](#list_ai_traffic_sites)           | Read   | List AI-traffic sites                       |
| [`get_ai_traffic_summary`](#get_ai_traffic_summary)         | Read   | Get AI-traffic summary                      |
| [`list_posts`](#list_posts)                                 | Read   | List GBP posts                              |
| [`list_prospect_audits`](#list_prospect_audits)             | Read   | List prospect audits                        |
| [`list_reports`](#list_reports)                             | Read   | List reports                                |
| [`download_report_csv`](#download_report_csv)               | Read   | Download report CSV                         |
| [`get_active_syncs`](#get_active_syncs)                     | Read   | Get active syncs                            |
| [`get_mention_counts`](#get_mention_counts)                 | Read   | Get mention counts                          |
| [`list_my_notifications`](#list_my_notifications)           | Read   | List notifications                          |
| [`mark_leads_seen`](#mark_leads_seen)                       | Write  | Mark leads as seen                          |
| [`query_records`](#query_records)                           | Read   | Query records                               |
| [`generate_ai_insights`](#generate_ai_insights)             | Write  | Generate AI insights                        |
| [`draft_mention_reply`](#draft_mention_reply)               | Write  | Draft a mention reply                       |
| [`draft_review_reply`](#draft_review_reply)                 | Write  | Draft a review reply                        |
| [`suggest_visibility_prompts`](#suggest_visibility_prompts) | Write  | Suggest AI-visibility prompts               |
| [`generate_post_draft`](#generate_post_draft)               | Write  | Generate a GBP post draft                   |
| [`generate_report`](#generate_report)                       | Write  | Generate a report                           |
| [`propose_tracking_setup`](#propose_tracking_setup)         | Write  | Propose tracking setup                      |
| [`apply_tracking_setup`](#apply_tracking_setup)             | Write  | Apply tracking setup                        |

## list\_workspaces

**List workspaces** — Read-only. It never changes anything in your account.

The workspaces on this account — an agency keeps each client in its own. Pass an id to any other tool's workspace\_id to read that workspace instead of the default one. Omitting workspace\_id everywhere reads the home workspace, which on an agency account is often NOT where the live businesses are: if list\_businesses looks empty, check here before reporting that the account has none.

Ids from one workspace do not resolve in another — pass business ids from list\_businesses run against the SAME workspace, or you will get an empty result rather than an error.

With platform (super-admin) access this lists every agency's workspaces, each row carries businesses \{active, prospects, total}, and the top-level businesses field sums them over every workspace (not just this page). Answer "how many businesses are live across all accounts" from that total in one call — do not add up list\_businesses per workspace. active is exactly what list\_businesses returns with is\_active:true; total includes prospect audits.

<ParamField body="limit" type="integer" default="100" />

<ParamField body="skip" type="integer" default="0">
  Rows to skip — page 2 of a 50-row page is skip:50.
</ParamField>

## list\_businesses

**List businesses** — Read-only. It never changes anything in your account.

List the business locations in ONE workspace — the home workspace unless workspace\_id is given. Optionally filter to active or prospect locations. Sorted by business name, A→Z. To count businesses across every workspace, do not call this once per workspace: with platform access, list\_workspaces already carries per-workspace counts and a total.

<ParamField body="is_active" type="boolean">
  Only active (billed) locations.
</ParamField>

<ParamField body="is_prospect" type="boolean">
  Only prospect/unconverted locations.
</ParamField>

<ParamField body="limit" type="integer" default="100" />

<ParamField body="skip" type="integer" default="0">
  Rows to skip — page 2 of a 50-row page is skip:50.
</ParamField>

<ParamField body="workspace_id" type="string">
  Which workspace to read. Accepts the id, name or slug from list\_workspaces. Defaults to the account's home workspace. Ids do not cross workspaces — pass a business or tracker id you read in THIS workspace, or the result is empty rather than an error.
</ParamField>

## get\_business

**Get business** — Read-only. It never changes anything in your account.

Fetch a single business location by id, including its AI insights and integration ids.

<ParamField body="business_location_id" type="string">
  The business location id (required). From list\_businesses.
</ParamField>

<ParamField body="location_id" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="locationId" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="workspace_id" type="string">
  Which workspace to read. Accepts the id, name or slug from list\_workspaces. Defaults to the account's home workspace. Ids do not cross workspaces — pass a business or tracker id you read in THIS workspace, or the result is empty rather than an error.
</ParamField>

## get\_business\_usage

**Get business usage** — Read-only. It never changes anything in your account.

Current billing-period usage and limits for a location.

<ParamField body="business_location_id" type="string">
  The business location id (required). From list\_businesses.
</ParamField>

<ParamField body="location_id" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="locationId" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="workspace_id" type="string">
  Which workspace to read. Accepts the id, name or slug from list\_workspaces. Defaults to the account's home workspace. Ids do not cross workspaces — pass a business or tracker id you read in THIS workspace, or the result is empty rather than an error.
</ParamField>

## list\_reviews

**List reviews** — Read-only. It never changes anything in your account.

List reviews for a business location. Filter by needs\_response or star rating. Sorted newest-WRITTEN first (review\_created\_at — when the customer left the review), not by when we imported it. Those differ sharply on a freshly-imported account, where a whole back-catalogue arrives with one import timestamp.

<ParamField body="business_location_id" type="string">
  The business location id (required). From list\_businesses.
</ParamField>

<ParamField body="location_id" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="locationId" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="needs_response" type="boolean" />

<ParamField body="star_rating" type="integer" />

<ParamField body="days" type="integer">
  Only reviews written in the last N days. Omit for all time.
</ParamField>

<ParamField body="limit" type="integer" default="50" />

<ParamField body="skip" type="integer" default="0">
  Rows to skip — page 2 of a 50-row page is skip:50.
</ParamField>

<ParamField body="workspace_id" type="string">
  Which workspace to read. Accepts the id, name or slug from list\_workspaces. Defaults to the account's home workspace. Ids do not cross workspaces — pass a business or tracker id you read in THIS workspace, or the result is empty rather than an error.
</ParamField>

## list\_mentions

**List brand mentions** — Read-only. It never changes anything in your account.

The unified brand-mention feed across platforms (Reddit, Facebook groups, YouTube, X, web), with lead badges. Sorted by POST date, newest first — the same order and the same copy-paste de-duplication the Interactions feed shows in the app. Use sort:"found" for discovery order ("what turned up since I last looked"), which is a different question: a search can surface a years-old post today. Scoped to ACTIVE business locations, like the feed — mentions belonging to a deactivated location are not returned.

<ParamField body="business_location_id" type="string">
  The business location id. From list\_businesses.
</ParamField>

<ParamField body="location_id" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="locationId" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="tracker_id" type="string">
  Restrict to one brand/topic tracker.
</ParamField>

<ParamField body="platform" type="string">
  reddit | facebook | youtube | twitter | web. Omit for all.
</ParamField>

<ParamField body="sentiment" type="positive | neutral | negative" />

<ParamField body="search" type="string">
  Substring match over text, author, title, subreddit.
</ParamField>

<ParamField body="days" type="integer">
  Only mentions from the last N days. Omit for all time.
</ParamField>

<ParamField body="sort" type="newest | found | oldest | engagement | reach | priority" default="newest">
  newest = post date (default). found = when we discovered it.
</ParamField>

<ParamField body="archived" type="boolean">
  Return archived mentions instead of live ones.
</ParamField>

<ParamField body="page" type="integer" default="1">
  1-based page number.
</ParamField>

<ParamField body="limit" type="integer" default="50">
  Page size.
</ParamField>

<ParamField body="workspace_id" type="string">
  Which workspace to read. Accepts the id, name or slug from list\_workspaces. Defaults to the account's home workspace. Ids do not cross workspaces — pass a business or tracker id you read in THIS workspace, or the result is empty rather than an error.
</ParamField>

## list\_leads

**List leads** — Read-only. It never changes anything in your account.

Sales leads detected from brand mentions. Each row carries the post text, the intent reasoning, post\_url (the public thread where the human posts a reply) and reputably\_url (the lead in the Reputably dashboard). Use draft\_mention\_reply with the mention\_id to draft a reply the human can copy and post at post\_url.

Sorted by POST date, newest first — the same order the Leads board shows by default. That is deliberately NOT discovery order: a search can turn up a genuine post from 2023 today, so "newest lead" and "newest post" are different questions. Use sort:"found" for "what came in since I last looked", or sort:"intent" for the strongest buying signal first. Posts we could not date carry undated:true and rank below every dated one.

<ParamField body="stage" type="string">
  Filter by lead stage (e.g. new, contacted, won, lost).
</ParamField>

<ParamField body="business_location_id" type="string">
  The business location id. From list\_businesses.
</ParamField>

<ParamField body="location_id" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="locationId" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="sort" type="newest | found | intent" default="newest">
  newest = the mention's post date (default). found = when we detected the lead. intent = LLM intent score, strongest first.
</ParamField>

<ParamField body="include_archived" type="boolean" />

<ParamField body="days" type="integer">
  Only leads whose post is from the last N days. Leads whose post date we could never establish are KEPT — an unknown date is not evidence of an old post.
</ParamField>

<ParamField body="limit" type="integer" default="50" />

<ParamField body="skip" type="integer" default="0">
  Rows to skip — page 2 of a 50-row page is skip:50.
</ParamField>

<ParamField body="workspace_id" type="string">
  Which workspace to read. Accepts the id, name or slug from list\_workspaces. Defaults to the account's home workspace. Ids do not cross workspaces — pass a business or tracker id you read in THIS workspace, or the result is empty rather than an error.
</ParamField>

## list\_brand\_trackers

**List brand trackers** — Read-only. It never changes anything in your account.

Brand/topic trackers configured for the account. Sorted by tracker name, A→Z.

<ParamField body="business_location_id" type="string">
  The business location id. From list\_businesses.
</ParamField>

<ParamField body="location_id" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="locationId" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="limit" type="integer" default="100" />

<ParamField body="skip" type="integer" default="0">
  Rows to skip — page 2 of a 50-row page is skip:50.
</ParamField>

<ParamField body="workspace_id" type="string">
  Which workspace to read. Accepts the id, name or slug from list\_workspaces. Defaults to the account's home workspace. Ids do not cross workspaces — pass a business or tracker id you read in THIS workspace, or the result is empty rather than an error.
</ParamField>

## competitor\_leaderboard

**Competitor leaderboard** — Read-only. It never changes anything in your account.

Share-of-mention leaderboard comparing the brand to its competitors, built from the competitors named inside the tracker's mentions. Returns the top 15, ranked by mention count. Covers ALL TIME unless you pass days (or from/to).

<ParamField body="tracker_id" type="string">
  Brand tracker id (required). From list\_brand\_trackers.
</ParamField>

<ParamField body="trackerId" type="string">
  Deprecated alias for tracker\_id.
</ParamField>

<ParamField body="days" type="integer">
  Window: only mentions from the last N days. Omit for all time.
</ParamField>

<ParamField body="from" type="string">
  Window start, YYYY-MM-DD. Ignored if days is set.
</ParamField>

<ParamField body="to" type="string">
  Window end, YYYY-MM-DD.
</ParamField>

<ParamField body="workspace_id" type="string">
  Which workspace to read. Accepts the id, name or slug from list\_workspaces. Defaults to the account's home workspace. Ids do not cross workspaces — pass a business or tracker id you read in THIS workspace, or the result is empty rather than an error.
</ParamField>

## list\_visibility\_trackers

**List AI-visibility trackers** — Read-only. It never changes anything in your account.

AI-visibility trackers (how the brand shows up in LLM answers like ChatGPT/Gemini). Sorted by tracker name, A→Z. Each row carries its schedule and last-run state (run\_frequency\_hours, last\_run\_at, last\_run\_summary) so you can tell a tracker with no data from one that has simply not run yet.

<ParamField body="business_location_id" type="string">
  The business location id. From list\_businesses.
</ParamField>

<ParamField body="location_id" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="locationId" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="limit" type="integer" default="100" />

<ParamField body="skip" type="integer" default="0">
  Rows to skip — page 2 of a 50-row page is skip:50.
</ParamField>

<ParamField body="workspace_id" type="string">
  Which workspace to read. Accepts the id, name or slug from list\_workspaces. Defaults to the account's home workspace. Ids do not cross workspaces — pass a business or tracker id you read in THIS workspace, or the result is empty rather than an error.
</ParamField>

## get\_visibility\_summary

**Get AI-visibility summary** — Read-only. It never changes anything in your account.

Daily AI-visibility rollups for a tracker: visibility score, share of voice, average position. One row per day, most recent first. This is the ROLLUP — for "which prompts are we losing, and to whom", use get\_prompt\_performance.

<ParamField body="tracker_id" type="string" required>
  AI-visibility tracker id. From list\_visibility\_trackers.
</ParamField>

<ParamField body="limit" type="integer" default="30">
  Most recent N days.
</ParamField>

<ParamField body="workspace_id" type="string">
  Which workspace to read. Accepts the id, name or slug from list\_workspaces. Defaults to the account's home workspace. Ids do not cross workspaces — pass a business or tracker id you read in THIS workspace, or the result is empty rather than an error.
</ParamField>

## list\_visibility\_prompts

**List AI-visibility prompts** — Read-only. It never changes anything in your account.

The prompts tracked for an AI-visibility tracker, with how much answer data sits behind each one (run\_count, last\_run\_at, engines). Call this BEFORE get\_prompt\_performance: it is cheap, it gives you the prompt ids, and it is the only way to tell a prompt the brand never appears in from a prompt that has never been asked. Most-run first.

<ParamField body="tracker_id" type="string">
  From list\_visibility\_trackers.
</ParamField>

<ParamField body="business_location_id" type="string">
  The business location id. From list\_businesses.
</ParamField>

<ParamField body="location_id" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="locationId" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="include_inactive" type="boolean">
  Include paused prompts.
</ParamField>

<ParamField body="workspace_id" type="string">
  Which workspace to read. Accepts the id, name or slug from list\_workspaces. Defaults to the account's home workspace. Ids do not cross workspaces — pass a business or tracker id you read in THIS workspace, or the result is empty rather than an error.
</ParamField>

## get\_prompt\_performance

**Get AI-visibility prompt performance** — Read-only. It never changes anything in your account.

Per-prompt AI-visibility performance over a window: how often the brand appears in the answers, its average position, how sentiment breaks down, which competitors show up instead, and which competitor domains get cited. This is the "which prompts are we losing, and to whom" answer — prompts are returned WORST-performing first.

appearance\_rate is the percentage of ANSWERS in the window naming the brand, the same definition the AI Visibility screen uses, so the two reconcile.

top\_competitors\[].share is that same measure for a competitor — the percentage of answers naming it. It is NOT share of voice: shares do not sum to 100, because one answer can name several brands. Never report it as share of voice.

Answers are aggregated server-side and answer\_text is NOT returned by default — one prompt's answers would fill a context window. include\_answer\_text returns a small truncated sample.

evidence\_samples come from an optional field that is often left unwritten even when the brand IS present; treat its absence as no information, never as a lower-confidence mention.

<ParamField body="tracker_id" type="string">
  From list\_visibility\_trackers.
</ParamField>

<ParamField body="business_location_id" type="string">
  The business location id. From list\_businesses.
</ParamField>

<ParamField body="location_id" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="locationId" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="prompt_id" type="string">
  Restrict to a single prompt.
</ParamField>

<ParamField body="days" type="integer" default="30">
  Window length. Defaults to 30.
</ParamField>

<ParamField body="include_answer_text" type="boolean">
  Attach a small, truncated sample of raw answers. Off by default.
</ParamField>

<ParamField body="workspace_id" type="string">
  Which workspace to read. Accepts the id, name or slug from list\_workspaces. Defaults to the account's home workspace. Ids do not cross workspaces — pass a business or tracker id you read in THIS workspace, or the result is empty rather than an error.
</ParamField>

## get\_fanout\_stats

**Get AI-visibility fan-out (retrieval) stats** — Read-only. It never changes anything in your account.

The retrieval layer beneath citations: the web searches the AI engines actually ran to answer a tracker's prompts, the sites those searches surfaced, and which of those sites went on to be cited. queries\[] is the phrasing the engines really search — often not the prompt as written — and domains\[] carries retrieved and cited side by side, so a site the engine finds but declines to cite is visible here and nowhere else.

Read these before quoting a number:

1. Only ChatGPT and Claude disclose a trail; Gemini and the Google surfaces do not. runs counts every answer, runs\_with\_trail only the ones that disclosed — "no searches" from a quiet engine is missing data, not an engine that searched nothing.
2. Every figure here, cited counts included, is over runs\_with\_trail, so cited counts are SMALLER than get\_visibility\_sources, which counts over all answers. Name the denominator.
3. ChatGPT's page list is partial, so for chatgpt pages\_seen and brand\_retrieved are floors. Never say the brand was "never retrieved" on ChatGPT data alone.
4. funnel.brand\_retrieved is null when the tracker has no brand domain set — unknown, not zero.
   Check truncated.queries / truncated.domains and the notes array before treating a list as complete.

<ParamField body="tracker_id" type="string">
  From list\_visibility\_trackers.
</ParamField>

<ParamField body="business_location_id" type="string">
  The business location id. From list\_businesses.
</ParamField>

<ParamField body="location_id" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="locationId" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="days" type="integer" default="30">
  Window length. Defaults to 30.
</ParamField>

<ParamField body="engine" type="string">
  Restrict to one engine, e.g. chatgpt or claude. Omit for all.
</ParamField>

<ParamField body="prompt_id" type="string">
  Restrict to a single prompt.
</ParamField>

<ParamField body="variant_index" type="integer">
  With prompt\_id: one wording of it. 0 is the prompt as the user wrote it.
</ParamField>

<ParamField body="query_limit" type="integer" default="25">
  Top searches to return, most-run first.
</ParamField>

<ParamField body="domain_limit" type="integer" default="25">
  Top retrieved domains to return.
</ParamField>

<ParamField body="workspace_id" type="string">
  Which workspace to read. Accepts the id, name or slug from list\_workspaces. Defaults to the account's home workspace. Ids do not cross workspaces — pass a business or tracker id you read in THIS workspace, or the result is empty rather than an error.
</ParamField>

## get\_visibility\_sources

**Get AI-visibility sources** — Read-only. It never changes anything in your account.

Which websites the AI engines cite when answering a tracker's prompts — the Sources screen. Each domain is classified by type (UGC, Directory, Editorial, Reference, Institutional, Company, Corporate, Web), tagged with owner (you = the brand's own site, competitor = a rival's own site, third\_party = everything else), and carries how many answers cite it, cited\_in\_pct, and the specific pages cited on it. Most-used first.

Use it for "where do AI answers get their picture of this market from" and "which sites could we get listed on": actionable\_only=true is the list of placements a business can realistically win. A competitor-owned domain can never be earned — filter with owner=competitor to see which rivals get cited directly.

cited\_in\_pct is the percentage of ANSWERS citing the domain (the screen's "Used"); answers cite several domains, so it does not sum to 100. by\_type counts citations over the whole window and ignores the row filters. These counts span every answer, so they are larger than get\_fanout\_stats, which counts only answers that disclosed a retrieval trail. The window defaults to 30 days; the screen defaults to 7, so pass days:7 to match what a user is looking at.

<ParamField body="tracker_id" type="string">
  From list\_visibility\_trackers.
</ParamField>

<ParamField body="business_location_id" type="string">
  The business location id. From list\_businesses.
</ParamField>

<ParamField body="location_id" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="locationId" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="days" type="integer" default="30">
  Window length. Defaults to 30.
</ParamField>

<ParamField body="engine" type="string">
  Restrict to one engine, e.g. chatgpt, gemini or claude. Omit for all.
</ParamField>

<ParamField body="prompt_id" type="string">
  Restrict to a single prompt.
</ParamField>

<ParamField body="variant_index" type="integer">
  With prompt\_id: one wording of it. 0 is the prompt as the user wrote it.
</ParamField>

<ParamField body="type" type="UGC | Directory | Editorial | Reference | Institutional | Company | Corporate | Web">
  Only domains of this type.
</ParamField>

<ParamField body="owner" type="you | competitor | third_party">
  Only the brand's own sites, competitors' own sites, or everyone else.
</ParamField>

<ParamField body="actionable_only" type="boolean">
  Only types a business can get into: UGC, Directory, Editorial, Company, Web.
</ParamField>

<ParamField body="limit" type="integer" default="25">
  Domains per page.
</ParamField>

<ParamField body="skip" type="integer" default="0">
  Rows to skip — page 2 of a 50-row page is skip:50.
</ParamField>

<ParamField body="pages_per_domain" type="integer" default="3">
  Cited pages to list per domain, most-used first. pages\_total has the count.
</ParamField>

<ParamField body="workspace_id" type="string">
  Which workspace to read. Accepts the id, name or slug from list\_workspaces. Defaults to the account's home workspace. Ids do not cross workspaces — pass a business or tracker id you read in THIS workspace, or the result is empty rather than an error.
</ParamField>

## get\_visibility\_countries

**List AI-visibility countries** — Read-only. It never changes anything in your account.

The markets an AI-visibility tracker can be geo-targeted to. These are exact provider location names — a tracker will reject anything not on this list, so pick from here rather than composing a country name.

Takes no parameters.

## list\_ai\_traffic\_sites

**List AI-traffic sites** — Read-only. It never changes anything in your account.

Websites with an AI-traffic tracker installed. verified\_at and last\_seen\_at are what tell you whether a domain is actually reporting — a site that has never reported looks exactly like a site AI never visits, and only one of those is a traffic finding. The two capture paths are installed and verified SEPARATELY, so check them separately: crawler\_verified\_at/last\_crawler\_at cover the server-side half (the only one that can see GPTBot and friends, since AI crawlers do not execute JavaScript), and beacon\_verified\_at/last\_referral\_at cover the browser half (the only one that can see a human arriving from an AI answer). A site with one half installed will report zero for the other no matter how much of that traffic it gets.

<ParamField body="business_location_id" type="string">
  The business location id. From list\_businesses.
</ParamField>

<ParamField body="location_id" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="locationId" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="limit" type="integer" default="50" />

<ParamField body="workspace_id" type="string">
  Which workspace to read. Accepts the id, name or slug from list\_workspaces. Defaults to the account's home workspace. Ids do not cross workspaces — pass a business or tracker id you read in THIS workspace, or the result is empty rather than an error.
</ParamField>

## get\_ai\_traffic\_summary

**Get AI-traffic summary** — Read-only. It never changes anything in your account.

Daily AI-traffic rollups for a site: crawler hits broken down by agent and category, and AI referral visits by referrer. One row per day, most recent first.

TWO IMPORTANT CAVEATS, because both produce confident wrong answers:

1. Referral counts UNDER-REPORT Claude. A real click from Claude arrives with an empty referrer, so no referral row is written. by\_referrer showing no claude.com is NOT evidence that Claude sends no traffic — check by\_agent, which often shows verified Claude crawler hits on the very same day. Never report zero Claude referrals as a fact.
2. spoofed\_hits means something wore a crawler's user-agent from an IP outside that operator's published ranges — i.e. someone faking it. It is distinct from unchecked (no IP seen, or the operator publishes no ranges), which is crawler\_hits - verified\_hits - spoofed\_hits.

<ParamField body="site_id" type="string">
  From list\_ai\_traffic\_sites.
</ParamField>

<ParamField body="business_location_id" type="string">
  The business location id. From list\_businesses.
</ParamField>

<ParamField body="location_id" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="locationId" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="limit" type="integer" default="30">
  Most recent N days.
</ParamField>

<ParamField body="workspace_id" type="string">
  Which workspace to read. Accepts the id, name or slug from list\_workspaces. Defaults to the account's home workspace. Ids do not cross workspaces — pass a business or tracker id you read in THIS workspace, or the result is empty rather than an error.
</ParamField>

## list\_posts

**List GBP posts** — Read-only. It never changes anything in your account.

Google Business Profile posts (published, scheduled, draft).

<ParamField body="business_location_id" type="string">
  The business location id. From list\_businesses.
</ParamField>

<ParamField body="location_id" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="locationId" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="status" type="string">
  e.g. draft, scheduled, published, cancelled.
</ParamField>

<ParamField body="limit" type="integer" default="50" />

<ParamField body="workspace_id" type="string">
  Which workspace to read. Accepts the id, name or slug from list\_workspaces. Defaults to the account's home workspace. Ids do not cross workspaces — pass a business or tracker id you read in THIS workspace, or the result is empty rather than an error.
</ParamField>

## list\_prospect\_audits

**List prospect audits** — Read-only. It never changes anything in your account.

Prospect audits the agency has run — the acquisition workflow. Read-only: generating a new audit is not exposed here, because each one spends vendor credits against a monthly agency quota. Includes that quota state so you can say how many remain.

Takes no parameters.

## list\_reports

**List reports** — Read-only. It never changes anything in your account.

Generated reports for the account, most recently generated first. (Creation time IS the event here — a report is made, not discovered.)

<ParamField body="business_location_id" type="string">
  The business location id. From list\_businesses.
</ParamField>

<ParamField body="location_id" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="locationId" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="limit" type="integer" default="25" />

<ParamField body="skip" type="integer" default="0">
  Rows to skip — page 2 of a 50-row page is skip:50.
</ParamField>

<ParamField body="workspace_id" type="string">
  Which workspace to read. Accepts the id, name or slug from list\_workspaces. Defaults to the account's home workspace. Ids do not cross workspaces — pass a business or tracker id you read in THIS workspace, or the result is empty rather than an error.
</ParamField>

## download\_report\_csv

**Download report CSV** — Read-only. It never changes anything in your account.

Return the CSV export of a generated report as text. Truncated at 60000 characters — a large report would otherwise consume the whole context window. The response says so explicitly when it has been cut, so a truncated file is never mistaken for a complete one.

<ParamField body="report_id" type="string">
  Report id (required). From list\_reports.
</ParamField>

<ParamField body="reportId" type="string">
  Deprecated alias for report\_id.
</ParamField>

<ParamField body="workspace_id" type="string">
  Which workspace to read. Accepts the id, name or slug from list\_workspaces. Defaults to the account's home workspace. Ids do not cross workspaces — pass a business or tracker id you read in THIS workspace, or the result is empty rather than an error.
</ParamField>

## get\_active\_syncs

**Get active syncs** — Read-only. It never changes anything in your account.

List in-progress sync/tracker jobs. Syncs run automatically on a schedule — use this to see whether one is currently refreshing the data. A non-empty result means counts and lists you read right now may be mid-refresh and will change shortly.

<ParamField body="workspace_id" type="string">
  Which workspace to read. Accepts the id, name or slug from list\_workspaces. Defaults to the account's home workspace. Ids do not cross workspaces — pass a business or tracker id you read in THIS workspace, or the result is empty rather than an error.
</ParamField>

## get\_mention\_counts

**Get mention counts** — Read-only. It never changes anything in your account.

Per-tracker counts of live (non-archived) mentions, bucketed by age. This is the dashboard's headline number, computed in one SQL pass — use it instead of listing mentions and counting them, which is expensive and goes silently wrong the moment the true count passes the page cap. `total` is all-time; a mention lands in a window on its post date, falling back to when we found it.

<ParamField body="windows" type="integer[]">
  Day windows to bucket into. Defaults to 1, 7, 30, 90, 365.
</ParamField>

<ParamField body="workspace_id" type="string">
  Which workspace to read. Accepts the id, name or slug from list\_workspaces. Defaults to the account's home workspace. Ids do not cross workspaces — pass a business or tracker id you read in THIS workspace, or the result is empty rather than an error.
</ParamField>

## list\_my\_notifications

**List notifications** — Read-only. It never changes anything in your account.

What this account is currently being alerted about — new leads, review alerts, finished syncs. Most recent first. Workspace-wide notifications plus any addressed to the signed-in user specifically.

<ParamField body="limit" type="integer" default="25" />

<ParamField body="workspace_id" type="string">
  Which workspace to read. Accepts the id, name or slug from list\_workspaces. Defaults to the account's home workspace. Ids do not cross workspaces — pass a business or tracker id you read in THIS workspace, or the result is empty rather than an error.
</ParamField>

## mark\_leads\_seen

**Mark leads as seen** — Write. It changes data in your account.

Mark specific leads as triaged, clearing their "new" badge for everyone in the account. Takes explicit lead ids — there is no mark-everything form. Already-seen leads keep their original timestamp, so re-running is safe. Use this after you have actually dealt with a lead, not merely read it, or you will hide it from the human.

<ParamField body="lead_ids" type="string[]" required>
  Lead ids from list\_leads.
</ParamField>

<ParamField body="workspace_id" type="string">
  Which workspace to read. Accepts the id, name or slug from list\_workspaces. Defaults to the account's home workspace. Ids do not cross workspaces — pass a business or tracker id you read in THIS workspace, or the result is empty rather than an error.
</ParamField>

## query\_records

**Query records** — Read-only. It never changes anything in your account.

Flexible read over an allow-listed set of entities. `query` is an equality filter object (e.g. \{"location\_id":"loc\_1"}) — equality only, no ranges or operators.

IMPORTANT: sort\_by on a field not listed below does NOT error. It silently returns rows in arbitrary order, which is indistinguishable from a correct answer. Sortable fields per entity:
Review: review\_created\_at, star\_rating, created\_date
Mention: posted\_at, synced\_at, google\_rank, created\_date
Lead: intent\_score, stage, created\_date
BusinessLocation: business\_name, created\_date
BrandTracker: tracker\_name, created\_date
VisibilityTracker: name, last\_run\_at, created\_date
VisibilityPrompt: text, created\_date
VisibilityDaily: date, created\_date
VisibilityRun: run\_date, run\_at, brand\_position, created\_date
Report: created\_date
Post: created\_date
AiTrafficDaily: date, crawler\_hits, referral\_visits, created\_date

Prefer the purpose-built tools where one exists — they apply the right ordering and the caveats that go with the data.

<ParamField body="entity" type="Review | Mention | Lead | BusinessLocation | BrandTracker | VisibilityTracker | VisibilityPrompt | VisibilityDaily | VisibilityRun | Report | Post | AiTrafficDaily" required />

<ParamField body="query" type="object">
  Equality filter, field → value.
</ParamField>

<ParamField body="sort_by" type="string">
  Field name; prefix with - for descending. Must be one of the fields listed in the description for this entity, or the order is arbitrary.
</ParamField>

<ParamField body="limit" type="integer" default="50" />

<ParamField body="skip" type="integer" default="0">
  Rows to skip — page 2 of a 50-row page is skip:50.
</ParamField>

<ParamField body="workspace_id" type="string">
  Which workspace to read. Accepts the id, name or slug from list\_workspaces. Defaults to the account's home workspace. Ids do not cross workspaces — pass a business or tracker id you read in THIS workspace, or the result is empty rather than an error.
</ParamField>

## generate\_ai\_insights

**Generate AI insights** — Write. It changes data in your account.

Run the LLM insight pass for a location (positive/negative themes, action items, review velocity). Persists the insights on the business.

<ParamField body="business_location_id" type="string">
  The business location id (required). From list\_businesses.
</ParamField>

<ParamField body="location_id" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="locationId" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="workspace_id" type="string">
  Which workspace to read. Accepts the id, name or slug from list\_workspaces. Defaults to the account's home workspace. Ids do not cross workspaces — pass a business or tracker id you read in THIS workspace, or the result is empty rather than an error.
</ParamField>

## draft\_mention\_reply

**Draft a mention reply** — Write. It changes data in your account.

Generate an AI-drafted reply to a brand mention and save it as the suggested reply. Does NOT post anything to the platform.

<ParamField body="mention_id" type="string" required />

<ParamField body="tone" type="string">
  e.g. friendly, professional, apologetic.
</ParamField>

<ParamField body="workspace_id" type="string">
  Which workspace to read. Accepts the id, name or slug from list\_workspaces. Defaults to the account's home workspace. Ids do not cross workspaces — pass a business or tracker id you read in THIS workspace, or the result is empty rather than an error.
</ParamField>

## draft\_review\_reply

**Draft a review reply** — Write. It changes data in your account.

Generate an AI-drafted reply to a review and return the text. Does NOT post the reply to Google/Facebook (posting requires a separate, gated action).

<ParamField body="review_id" type="string" required />

<ParamField body="tone" type="string">
  e.g. warm, professional, apologetic.
</ParamField>

<ParamField body="workspace_id" type="string">
  Which workspace to read. Accepts the id, name or slug from list\_workspaces. Defaults to the account's home workspace. Ids do not cross workspaces — pass a business or tracker id you read in THIS workspace, or the result is empty rather than an error.
</ParamField>

## suggest\_visibility\_prompts

**Suggest AI-visibility prompts** — Write. It changes data in your account.

Suggest prompts a customer might ask an LLM, for tracking brand visibility for a location.

<ParamField body="business_location_id" type="string">
  The business location id (required). From list\_businesses.
</ParamField>

<ParamField body="location_id" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="locationId" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="count" type="integer" />

<ParamField body="workspace_id" type="string">
  Which workspace to read. Accepts the id, name or slug from list\_workspaces. Defaults to the account's home workspace. Ids do not cross workspaces — pass a business or tracker id you read in THIS workspace, or the result is empty rather than an error.
</ParamField>

## generate\_post\_draft

**Generate a GBP post draft** — Write. It changes data in your account.

Generate a draft Google Business Profile post from an intent. Creates a draft only — it does NOT publish.

<ParamField body="business_location_id" type="string">
  The business location id (required). From list\_businesses.
</ParamField>

<ParamField body="location_id" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="locationId" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="intent" type="string" required>
  What the post should be about.
</ParamField>

<ParamField body="generate_image" type="boolean" />

<ParamField body="timezone" type="string" />

<ParamField body="workspace_id" type="string">
  Which workspace to read. Accepts the id, name or slug from list\_workspaces. Defaults to the account's home workspace. Ids do not cross workspaces — pass a business or tracker id you read in THIS workspace, or the result is empty rather than an error.
</ParamField>

## generate\_report

**Generate a report** — Write. It changes data in your account.

Queue a report render for a location. Returns immediately with a queued report; poll list\_reports for the finished PDF. Does NOT email the report to anyone.

<ParamField body="template" type="string" required>
  Report template name.
</ParamField>

<ParamField body="business_location_id" type="string">
  The business location id (required). From list\_businesses.
</ParamField>

<ParamField body="location_id" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="locationId" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="period_start" type="string">
  ISO date.
</ParamField>

<ParamField body="period_end" type="string">
  ISO date.
</ParamField>

<ParamField body="include_ai_visibility" type="boolean" />

<ParamField body="workspace_id" type="string">
  Which workspace to read. Accepts the id, name or slug from list\_workspaces. Defaults to the account's home workspace. Ids do not cross workspaces — pass a business or tracker id you read in THIS workspace, or the result is empty rather than an error.
</ParamField>

## propose\_tracking\_setup

**Propose tracking setup** — Write. It changes data in your account.

Analyze a business and propose its starter tracking config: 1 brand tracker + 2 topic trackers (one keyword each) and an AI-visibility tracker with up to 3 prompts. Proposes only — nothing is created. Review the proposal with the user, adjust to their feedback, then call apply\_tracking\_setup with the agreed config.

<ParamField body="business_location_id" type="string">
  The business location id (required). From list\_businesses.
</ParamField>

<ParamField body="location_id" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="locationId" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="workspace_id" type="string">
  Which workspace to read. Accepts the id, name or slug from list\_workspaces. Defaults to the account's home workspace. Ids do not cross workspaces — pass a business or tracker id you read in THIS workspace, or the result is empty rather than an error.
</ParamField>

## apply\_tracking\_setup

**Apply tracking setup** — Write. It changes data in your account.

Create the starter tracking config for a business: a brand tracker and topic trackers (one keyword each, max 3 trackers per business) plus the AI-visibility tracker with up to 3 prompts. Safe to re-run: keywords that already have a tracker are skipped, as is the visibility tracker if one exists. First syncs and the first visibility run start automatically within about a minute. Confirm the config with the user before calling.

<ParamField body="business_location_id" type="string">
  The business location id (required). From list\_businesses.
</ParamField>

<ParamField body="location_id" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="locationId" type="string">
  Deprecated alias for business\_location\_id.
</ParamField>

<ParamField body="brand_keyword" type="string">
  Exact brand term for the brand tracker (usually the business name).
</ParamField>

<ParamField body="topic_keywords" type="string[]">
  Service/topic phrases — one tracker per phrase.
</ParamField>

<ParamField body="visibility" type="object" />

<ParamField body="workspace_id" type="string">
  Which workspace to read. Accepts the id, name or slug from list\_workspaces. Defaults to the account's home workspace. Ids do not cross workspaces — pass a business or tracker id you read in THIS workspace, or the result is empty rather than an error.
</ParamField>
