The AI Hub is a Model Context Protocol (MCP) server built into the platform. MCP is an open standard from Anthropic that lets AI clients like Claude Desktop, Cursor, and ChatGPT safely call tools on external systems. The AI Hub turns your live review data, Google Business Profile performance numbers, and agency-only Local Search Grid scans into tools any MCP-compatible client can use.
This guide walks through creating a connection, understanding the tool catalog, controlling what tokens can and cannot see, reading the audit log, and working with rate limits. Everything here is scoped per token, per organisation, and per location, so you can confidently point an AI client at your data.
What the AI Hub is
The AI Hub is an HTTP endpoint that speaks JSON-RPC 2.0 and implements the 2025-06-18 Model Context Protocol specification. Compatible AI clients connect with a bearer token, discover the available tools through a standard handshake, and start running them.
Unlike a CSV export or a screenshot paste, the AI runs actual queries against the live database on your behalf. Ask "summarise my reviews from the last 30 days grouped by source", or "create a Local Search Grid scan for this dentist and re-run it every Monday at 9am", and the AI picks the right tool, builds the parameters, runs it, and reads the structured response back.
- MCP 2025-06-18 spec compliant with structuredContent result shape
- Single endpoint at
/api/mcpon your white-label domain - Bearer token authentication with scoped abilities
- Read-only by default, with a separate opt-in for write tools
- Per-organisation and per-location access enforced on every call
- PII redacted by default on private feedback and contact tools
- Google Business Profile metrics and search query terms exposed alongside reviews
- Agency-only Local Search Grid suite (gated on agency ownership) for the deep SEO surface
- Every tool call recorded in a per-agency audit log
Who can use the AI Hub
The AI Hub is available to any user with the api.access permission whose plan has the AI Hub feature enabled. Agency owners always have it; team members get it through their role.
Each connection you create is a Sanctum personal access token scoped to one named AI client. You can have as many connections as you need, and revoke any of them independently without affecting the others.
- Agency owners have access by default
- Team members need the
api.accessandapi.mcppermissions in their role - Agency customers get it when you switch
AI Hubto Enabled on their custom plan. It is a separate plan toggle from API access - Each connection is its own token with its own scope
- Revoking a connection invalidates it immediately
Supported AI clients
Any MCP-compatible client works. The configuration format is the same across all of them. The setup UI generates a ready-to-paste config snippet automatically using your custom domain.
- Claude Desktop (Anthropic)
- Claude Code (Anthropic)
- Cursor IDE
- VS Code with Copilot Chat
- ChatGPT custom connectors
- Any custom client that speaks MCP over HTTP
The generated snippet uses mcp-remote, a small stdio-to-HTTP bridge npm package. This is the most reliable option for desktop clients today because Claude Desktop's direct URL-based config still has some rough edges.
Creating your first connection
Open the dashboard, go to Resources -> Developer -> AI Hub (or Platform -> AI & Automation -> API & Webhooks, on the AI Hub tab), and click Create connection. Give it a descriptive name like "Claude Desktop" so you can tell your connections apart later.
Checkboxes control what the token can reach, all off by default: Allow write access (advanced) for drafting responses, tagging and preparing posts; Allow access to contact details (PII) so the AI can unlock names, emails and phone numbers; for agency owners only, Include Local Search Grid access (agency only) and Allow managing SMS providers (agency only); and Include Publishing, shown to users who may view posts, which adds the Google Business Profile post tools. Tick the ones you need before clicking Create connection: abilities are baked into the token and cannot be changed afterwards.
Agency owners also get Limit to these customers while Publishing is available. Search and pick customers, and the connection reaches only them; leave it empty to reach every customer. A connection limited to customers works only with AI assistants, not with the REST API. Its customers cannot be changed later. To change them, revoke the connection and create a new one. It cannot be combined with Allow managing SMS providers (agency only): SMS providers belong to the whole agency.
- Token is shown once at creation time, then never again
- Copy the generated
mcpServersconfig snippet and paste it into your AI client - Restart your AI client after saving the config
- Ask a natural-language question to trigger the first tool call
Config snippet for Claude Desktop
The AI Hub screen generates a ready-to-paste snippet using your domain and token. For reference, it looks like this:
- Paste the
mcpServersblock into your client config file - For Claude Desktop:
Settings -> Developer -> Edit Config - For Cursor:
Settings -> MCPand paste the same shape - Save, restart, done
The full tool catalog
The server groups tools by purpose and risk level. The AI client automatically sees only the tools your token is allowed to call, which keeps its mental map accurate and prevents it from wasting calls on denied requests. Customer tokens never see the agency-only Local Search Grid tools, even if they have write access enabled.
Read tools, Read with PII tools, GBP read tools, agency-only Sales Intelligence tools, agency-only Local Search Grid tools (the deepest surface, including creating and scheduling scans), and Write tools that always hold for human approval. Together they cover every meaningful question a reputation operator might ask.
Connections created with Include Publishing also get the eighteen Publishing tools: seven that read posts, photos and settings, and eleven that prepare posts for a person to approve.
Agency owners' connections created with Allow managing SMS providers (agency only) also get the fourteen SMS provider tools: five that read the agency's providers, provider types, numbers and assigned organisations, and, with write access, nine that set up, change or delete providers, assign them to organisations, manage SignalHouse 10DLC registrations, send a test message and change the text added to every campaign SMS.
| Tool | Group | What it does |
|---|---|---|
list_reviews | Read | Filter reviews by source, date, rating, sentiment, response status, verified flag, and full-text search. Paginated. |
get_review | Read | Fetch a single review by ID with reply, tags, auto-respond history, and language. |
list_organizations | Read | List accessible organisations with review count and average rating. Pass organization_id for detail including locations. |
list_locations | Read | List accessible locations with per-location review count and average rating. |
get_metrics | Read | Aggregate review metrics. Group by day, week, month, location, organisation, source, rating, sentiment. Period comparison supported. |
list_campaigns | Read | Review-request campaigns with paused state, schedule, location, and full funnel (invited, opened, clicked, reviewed, redirected, testimonials, private feedback, unsubscribed, bounced) plus open, click, redirect, conversion, unsubscribe, and bounce rates. |
get_ai_insights | Read | Retrieve pre-computed AI analysis (themes, sentiment shifts, recommendations) for an organisation or location. |
list_private_feedback | Read with PII | List private feedback submissions. Names, emails, and phones redacted unless include_pii is passed. |
list_contacts | Read with PII | List review-request contacts with subscription state, latest status, and per-contact engagement counters (invites, opens, clicks, redirects, testimonials, private feedback, bounces, unsubscribes). PII redacted by default. |
get_contact_activity | Read with PII | Full timeline for one contact: every invite, open, click, video play, redirect, testimonial, private feedback, unsubscribe, bounce, and spam complaint, with the campaign, channel, step, rating, message, and source attached. |
list_auto_respond_rules | Read with PII | List configured auto-respond rules with rating range, sources, delay, approval requirement, and AI usage. Requires the reviews.auto_respond permission on the token owner. |
list_gbp_metrics | GBP read | Aggregated Google Business Profile impressions (search, maps, desktop, mobile), call clicks, website clicks, and direction requests for one location over a date range. Includes the previous period totals so trend deltas come back in one call. |
list_gbp_search_terms | GBP read | Monthly search query terms shoppers used to find a location, with their impression counts. Below-threshold rows are flagged so AI clients can surface them without leaving gaps. |
list_sales_intelligence_leads | Sales Intelligence (agency only) | Paginated prospect leads, newest first. Self-serve leads from your public report form by default; pass include_outbound to add outbound prospects. Filter by date range, business name, and pipeline status. |
get_sales_intelligence_lead | Sales Intelligence (agency only) | One lead in full by UUID: business profile, contact details, opportunity score, pipeline status, and the latest report link. Read only. |
list_scans | LSG (agency only) | Paginated metadata for every Local Search Grid scan, newest first. Filter by schedule, completion state, recency, or free-text. |
get_scan | LSG (agency only) | One scan with its per-pin results for a snapshot. top_n (0-20, default 5) caps the SERP list per pin so the response stays bounded on large grids. |
get_scan_data_points | LSG (agency only) | Paginated per-pin data with lat, lng, target_rank, and the top-N competitors (place_id, name, rank) at each pin. The right tool for rank-tracker integrations and pin-layer heatmaps. |
list_scan_snapshots | LSG (agency only) | Aggregated rank distribution and visibility score for every snapshot. One row per snapshot. |
get_scan_insights | LSG (agency only) | Summary stats, long-range trends, snapshot-over-snapshot deltas, geographic quadrant strength, top competitors, and rule-based recommendations. |
create_scan | LSG (agency only) | Create a brand-new scan, generate the hex-ring pin grid server-side, and queue the first snapshot. |
run_scan | LSG (agency only) | Snap a fresh snapshot using the saved grid, keywords, and distance. Fires scan-completed or scan-failed when done. |
schedule_scan | LSG (agency only) | Enable or disable a recurring schedule with day-of-week and time-of-day control. Solves the "rankings differ during business hours" problem. |
draft_review_response | Write | Draft a response to a review. Always held for agency approval. Never auto-sent. |
tag_reviews | Write | Attach or detach tags on up to 50 reviews per call. |
list_publishing_locations | Publishing | Locations you can publish for: profile ready, channel health with the fix, Autopilot state, approval rule, usage this month. |
get_publishing_settings | Publishing | One section of a location's settings (facts, instructions, autopilot, schedule, photos), with where each value comes from. |
get_post_requirements | Publishing | What a post of a kind needs at a location: limits, buttons, photo rules, link handling. |
list_posts | Publishing | Posts filtered by location, status, kind, origin, dates, waiting for approval or needing attention. |
get_post | Publishing | One post with its deliveries, failures and fixes, checks, available actions and a dashboard link. |
list_media_assets | Publishing | Library photos filtered by location, status, folder, Autopilot pool, unused, missing a description or photo location, each with its photo location. |
get_publishing_activity | Publishing | Published, waiting, scheduled and failed posts over a period, with Autopilot runs and usage. |
enable_publishing_channel | Publishing (prepare) | Turn publishing on for up to 50 locations with a ready profile. Posts nothing. |
update_publishing_settings | Publishing (prepare) | Facts (unconfirmed until a person confirms), instructions, schedule, time zone, languages, photo location. Never approvers or the approval rule. |
set_autopilot_status | Publishing (prepare) | Pause Autopilot, or start it where a person approves every post, the time zone is confirmed and an AI provider is connected. |
draft_post | Publishing (prepare) | Save a post draft from the assistant's own text. Never publishes. |
generate_post | Publishing (prepare) | Ask the account's AI writer for a draft. Counts toward the location's AI drafts limit. |
update_post | Publishing (prepare) | Edit a draft, a waiting post, a scheduled post or one that failed. Any edit goes back for approval. |
request_post_approval | Publishing (prepare) | Send up to 20 posts to their approvers by email. |
reschedule_post | Publishing (prepare) | Change when a post goes out, never to within the next hour. |
cancel_post | Publishing (prepare) | Cancel a post before it publishes. |
add_media_from_url | Publishing (prepare) | Add a photo to the library from a public HTTPS link, with a description. Says whether it will be geotagged. |
update_media_asset | Publishing (prepare) | Change a photo's title, description, alt text, folder, Autopilot pools or photo location. |
list_sms_providers | SMS providers (agency only) | The agency's SMS providers: type, default, ready to send, status, sender and how many organisations each sends for. Credentials masked. |
get_sms_provider | SMS providers (agency only) | One provider's status and what it still needs, such as a Twilio number, a toll-free verification or a SignalHouse registration step. |
list_sms_provider_types | SMS providers (agency only) | The provider types that can be set up and the exact credentials, sender and settings fields each one takes. |
list_sms_provider_organizations | SMS providers (agency only) | The organisations a provider sends for, with the sender each one uses instead of the provider's own. |
list_sms_provider_numbers | SMS providers (agency only) | Twilio: the account's SMS-capable numbers with toll-free verification status. SignalHouse: owned numbers and numbers available to register. |
create_sms_provider | SMS providers (agency only) | Set up a provider. The connection is checked with the provider before anything is saved. Credentials are never returned. |
update_sms_provider | SMS providers (agency only) | Change a provider. Sent fields are merged over the saved ones and checked again; a refused change saves nothing. |
delete_sms_provider | SMS providers (agency only) | Delete a provider with confirm: true. Its organisations then use the default provider. |
set_default_sms_provider | SMS providers (agency only) | Make a ready provider the agency's default. |
assign_sms_provider | SMS providers (agency only) | Choose which provider sends an organisation's texts, optionally with the organisation's own sender. |
unassign_sms_provider | SMS providers (agency only) | Remove an organisation from a provider; its texts then use the default provider. |
manage_signalhouse_registration | SMS providers (agency only) | Register SignalHouse for US 10DLC, appeal a rejected campaign, retry, change the number or restart. Fees go to your own SignalHouse account. |
send_test_sms | SMS providers (agency only) | Send one real test text to a number the person gave, at most five a minute, never to a blocked number. |
update_sms_settings | SMS providers (agency only) | Change the text added after the review link in every campaign SMS. |
The Local Search Grid tools (list_scans, get_scan, get_scan_data_points, list_scan_snapshots, get_scan_insights, create_scan, run_scan, schedule_scan) and the Sales Intelligence tools (list_sales_intelligence_leads, get_sales_intelligence_lead) are hidden from customer tokens entirely. Only agency-owner tokens see them in tools/list and can call them, and a connection limited to chosen customers does not see them either. The fourteen SMS provider tools show only on agency-owner connections created with Allow managing SMS providers (agency only). In all there are 57 tools.
Google Business Profile tools
Two tools expose Google Business Profile performance data for any location the caller can already see in the dashboard. These are customer-accessible: as long as the token has reviews:read (the existing review scope) and the user can open the location in the UI, they can pull the metrics.
list_gbp_metrics aggregates impressions, calls, direction requests, and website clicks for a date range and adds the previous-period totals to the same response, so the AI does not have to make a second call to compute trend deltas. list_gbp_search_terms returns the search query terms shoppers used to find the location, with monthly impression counts and a below_threshold flag for the terms Google masks for very-low-volume keywords.
Profile views and Photo views are no longer available from the Google Performance API and are not returned. Impressions, calls, direction requests, website clicks, and search query terms are still available.
- Scope: any user with
reviews:readand access to the location - Date range: up to 540 days per call
- Trend deltas: previous period totals included in the same response
- Search terms: monthly granularity, with masked terms surfaced explicitly
Local Search Grid tools (agency only)
The Local Search Grid surface gives AI clients the same control the dashboard gives you: list scans, drill into a single snapshot, browse the full snapshot timeline, pull the deep insights the report renders, create new scans on the fly, re-run them, and configure a recurring schedule.
Two things gate the Local Search Grid tools: the calling user must be the agency owner, AND the token must have been created with Include Local Search Grid access (agency only) ticked. Miss the checkbox and the tools stay hidden even for an owner. Create a new connection with it enabled. A customer with their own API token never sees these tools in the catalog, and any direct call attempt returns an access_denied JSON-RPC error.
The schedule_scan tool is the one most agencies reach for. Local rankings shift during business hours, so monthly rank tracking only tells the truth if it lands inside that window. Schedule a scan with frequency: monthly, scheduled_days: [1, 2, 3, 4, 5], scheduled_from: "09:00", scheduled_to: "17:00", and a timezone of your choice, and the platform fires a snapshot inside that window every month, automatically. Subscribe to the scan-completed webhook in Platform -> AI & Automation -> API & Webhooks to drop the result into your reporting stack.
- Visibility: agency-owner tokens created with the
Include Local Search Grid access (agency only)checkbox ticked - Read tools: list_scans, get_scan, get_scan_data_points (paginated per-pin), list_scan_snapshots, get_scan_insights
- Write tools: create_scan, run_scan, schedule_scan (all require
mcp:writes) - Webhooks:
scan-completedandscan-failedfor downstream automation - Schedule cadence: cron worker ticks every 15 minutes
Permissions and scope enforcement
Every tool checks three things on every call. First, does the token hold the required Sanctum abilities (for example mcp:access, or mcp:writes for write tools). Second, does the token's owner have the required semantic permission (for example reviews.view or reviews.respond). Third, is the requested organisation or location inside the owner's access scope.
All three checks must pass. If any fails, the call is refused and recorded in the audit log as denied. Most tools return a JSON-RPC error with a specific code. The Publishing and SMS provider tools return the refusal as a tool result with isError set, carrying a code, a plain message and a fix that names the tool or setting to use instead, so the assistant can recover in the same conversation. The AI client can choose to surface this, retry with different parameters, or give up gracefully.
The Local Search Grid tools layer two more checks on top: the calling user must be the agency owner, AND the token must have been created with Include Local Search Grid access (agency only) ticked. Miss the checkbox and the tools stay hidden even for an owner, so create a new connection with it enabled. Customer tokens never see these tools in tools/list, and direct call attempts return access_denied.
mcp:accessis required for every toolmcp:writesis required fordraft_review_responseandtag_reviews;create_scan,run_scanandschedule_scanneedmcp:writesANDlocal-search-grid:run(write access plus the Local Search Grid checkbox)reviews.piiis required to unlock PII withinclude_pii: true- The Publishing read tools need
publishing:read; the eleven Publishing prepare tools needmcp:writes,publishing:readandpublishing:write(theInclude PublishingandAllow write access (advanced)boxes) - The SMS provider read tools need
sms-providers:read; the ones that change anything, andsend_test_sms, also needmcp:writesandsms-providers:manage(theAllow managing SMS providers (agency only)andAllow write access (advanced)boxes). Tenant ownership is required for all fourteen - Tenant ownership is required for
list_sales_intelligence_leadsandget_sales_intelligence_lead - Tenant ownership is required for every
list_scans,get_scan,get_scan_data_points,list_scan_snapshots,get_scan_insights,create_scan,run_scan, andschedule_scancall - Organisation and location scope always enforced, no override
Controlling PII exposure
The AI Hub treats PII (names, emails, phone numbers) as opt-in data. By default, list_private_feedback, list_contacts, and get_contact_activity return the same structure but with those fields stripped. This is the case even for agency owner tokens, so a read-only analyst token truly cannot send PII to an AI provider.
To unlock PII, two conditions must both hold on every call: the token was created with Allow access to contact details (PII) ticked, and the caller passes include_pii: true. Only agency owners, and team members whose role includes contacts.view, can tick that box: a token can never widen what its owner can already see.
- Redacted by default on every call
- Both
reviews.piipermission andinclude_pii: truerequired to unlock - Redactor runs server-side; PII never leaves the server unless both conditions pass
- Create separate tokens for PII work so revoking is targeted
Write tools and the approval queue
A small set of tools can modify data. All of them require mcp:writes on the token, and none of them bypass the existing moderation or scheduling pipelines.
When the AI calls draft_review_response, the resulting draft enters the Auto-Respond approval queue with status approval_requested and send_at set to null. It does not reach the review platform until a human opens the approval queue and clicks approve. If a matching Auto-Respond rule exists for the review's organisation or location, the rule's approval email fires so the reviewer gets notified the same way every other pending response is. If no matching rule exists, a minimal "MCP Drafts" rule is created automatically (with use_ai off and require_approval on) to carry the draft.
tag_reviews attaches or detaches tags on up to 50 reviews per call. Tagging is a soft, reversible operation, but it still requires write access. The flag sentinel tag is reserved and cannot be used through the tool.
The Publishing tools prepare posts and can set or move a post's time, but never approve or publish. A post an assistant drafts or edits waits for a person to approve that exact version, in Posts or from the approval email link. Prepare tools need Allow write access (advanced) and Include Publishing on the connection, and the user's own Publishing permissions at the location.
The agency-only SMS provider tools change the agency's SMS setup directly, as the SMS page does: they set up, change or delete providers, assign them to organisations, manage SignalHouse registrations and change the text added to every campaign SMS. No SMS provider tool sends a campaign message; send_test_sms sends one real test text to the number the person gives, at most five a minute and never to a blocked number. API keys given to these tools also pass through your AI provider; they are saved encrypted, never shown back, and replaced with [redacted] in the audit log.
The agency-only create_scan, run_scan, and schedule_scan tools require both mcp:writes on the token and agency ownership for the calling user. create_scan and run_scan queue background work (no instant-publish risk; the cron worker and webhooks handle delivery). schedule_scan only writes the recurrence configuration; the first scheduled snapshot still lands inside the configured day-of-week and time-of-day window.
Reading the audit log
Every tool call writes a row to the mcp_tool_calls table inside your agency account. The row captures the caller, token, tool name, redacted parameters, duration, response size, row count returned, and result status. Tokens, emails, and phone numbers in the parameters are stripped before storage so the log itself does not become a PII surface.
Open the AI Hub dashboard to browse the log. You can filter by date range, tool name, and result status (ok, denied, error). The dashboard also shows a per-tool breakdown, a call-volume chart, and the recent activity for every connected client.
Rows older than 90 days are pruned automatically by a daily background job, so the audit table stays bounded even on busy accounts.
- One row per tool call, captured asynchronously through a queue so it never blocks the call
- Redacted parameters only, never raw tokens or PII
- Correlation IDs let you group all tool calls from a single AI prompt
- 90-day retention, pruned automatically
Rate limits
Two stacked rate limits protect the server. 120 calls per minute per token, and 600 calls per minute across the entire workspace. Both limits apply simultaneously. Hitting either returns HTTP 429 with a Retry-After header and a JSON-RPC error body so the AI client can back off and retry cleanly.
In practice, a single Claude conversation usually fires 5 to 15 tool calls per question, so even a team of several analysts working against the same workspace will not touch these limits.
Correlation IDs for tracing
AI clients that support it can pass an X-Correlation-Id header. The server echoes it back on the response and stores it in the audit log. That makes it trivial to group all of the tool calls a single AI prompt generated, which is the fastest way to debug "why did Claude give that answer".
The header accepts any string up to 64 characters. If no header is sent, the server proceeds without one and the audit row's correlation_id is null.
White-label behaviour
The MCP endpoint always resolves on your own white-label domain, for example https://app.your-agency.com/api/mcp. The serverInfo.name returned during the MCP initialize handshake uses your agency company name. The AI Hub screen, the audit log dashboard, the API documentation, and the generated config snippet all use your agency branding.
Nothing in the MCP protocol exchange mentions EmbedMyReviews. The setup is identical for agency customers on white-label domains.
Troubleshooting
| Symptom | Likely cause and fix |
|---|---|
| Claude says "no tools available" | The client has not completed the initialize handshake. Restart the client; MCP servers are only discovered at startup. |
| All calls return "Authentication required" | Token was revoked, or the config snippet has the wrong token. Regenerate the connection in the dashboard and paste the fresh snippet. |
| "Your token is missing the required permission: reviews.respond" | Read-only token tried to call a write tool. Create a new connection with "Allow write access" ticked, or keep using the read-only token. |
| "Your token is missing the required permission: reviews.pii" | Token was created without PII access and the AI asked for include_pii: true. Create a new connection specifically scoped for PII work. |
| HTTP 429 with Retry-After | Rate limit hit. The AI client will usually back off automatically. Wait the number of seconds in the header and retry. |
| Tool returns "Unknown parameter" | The AI client sent a parameter name the tool does not accept (for example from instead of date_from). The error message lists the valid parameter names. |
| Draft response never reaches Google | Correct behaviour. Open the Auto-Respond approvals queue in the dashboard; the draft is there waiting for human approval. |
Local Search Grid tools missing from tools/list | Either the calling user is not the agency owner, or the token was created without Include Local Search Grid access (agency only) ticked. Recreate the connection under the agency-owner account with the checkbox enabled. |
SMS provider tools missing from tools/list | The calling user is not the agency owner, the connection is limited to chosen customers, or it was created without Allow managing SMS providers (agency only) ticked. The tools that change anything also need Allow write access (advanced). Create a new connection with the boxes you need. |
create_scan returns "provider_not_configured" | You have not connected DataForSEO and Google Maps credentials yet. Open Local Search Grid to wire them up, then retry. |
create_scan returns "missing_coords" | The address could not be geocoded. Either supply lat and lng directly, pass a clearer address, or verify your Google Maps API key is still valid. |
schedule_scan returns "invalid_schedule_window" | scheduled_from was not earlier than scheduled_to. The window is interpreted in the supplied timezone, so make sure you have not flipped the values. |
list_gbp_metrics returns "location_access_denied" | The token's user cannot open that location in the dashboard. Either pick a location they can see, or grant the role wider location access. |