Tools
MCP tools available on the FullVision server
The FullVision MCP mirrors the API: reports, entities, audiences and experiments, plus data-health tools. 32 tools in total. There is no raw SQL and no schema exploration — you ask for a report, not a query. See Setup to connect.
Use this page when you want to know what your AI agent can actually reach, or when it calls the wrong tool and you want to name the right one for it.
Reports
These answer "where does the money come from?" — by page, channel, search keyword, paid campaign, email campaign or form.
One tool per report. Each has a group form (omit the addressing key → ranked
list) and a single form (pass the key → one entity's deep-dive). fields
trims the response blocks; it never widens one.
| Tool | Description |
|---|---|
page-report | Full per-page report — traffic, engagement, first-touch and assisted attribution, revenue, and product events. page_url_scope pins the marketing or product host. |
channel-report | Traffic plus attributed new/returning customers and cash per channel bucket. Omit channel for all 9 buckets ranked; pass one for its sources, top landing pages and outcomes. |
keyword-report | Attributed revenue plus Search Console metrics (clicks, impressions, CTR, position) with striking-distance and content-gap flags per query. Synced GSC data, not live. |
ad-report | Spend-ranked paid-campaign leaderboard with full- and fair-window metrics, campaign LTV/CAC/ROAS (Google-only), and product events. level = campaign / ad_group / ad / keyword. |
email-report | Reach revenue plus causal (bought-in-session / influenced) revenue and the sends → clicks funnel per campaign. Reach metrics overlap across campaigns — never sum them. |
form-report | Starts → submits and completion rate, reach plus causal revenue, and (single form) the captured-submissions list. Submissions contain what people typed into your forms — treat them as personal data. |
Amounts are integer cents in each row's currency. Never sum across currencies.
Entities
These answer "who?" rather than "how much?". People and journeys return personal data — names, email addresses, event timelines — so an agent should quote them, not dump them.
| Tool | Description |
|---|---|
visitors | Audience profile: device / browser / country splits, active-hours heatmap, new-vs-returning, engagement top-line. Group-only. |
people | Find people by identifier (q: email / cus_… / person id) or by criteria (first-touch channel, plan, paid…). Returns person rows plus a lifetime-revenue summary — never timelines; follow journey_id to journeys. Rows are PII. |
journeys | The event-by-event timeline for one person (journey_id or q) or a cohort — the only surface that returns timelines. Two date axes: from/to is the event window, created_from/created_to is cohort membership. Rows are PII. |
Audiences
Build a segment as a criteria tree, check it, then activate it. The loop is build → compile → revise → commit, then attach a destination.
compile_audience_criteria answers a rejected tree with HTTP 200 and
{ "valid": false, "errors": [...] }, not a 4xx. Read the body, not the
status code.
attach_audience_destination starts real delivery. The scheduler uploads
the audience's members to the live ad account on its next tick — there is no
preview and no dry run.
| Tool | Description |
|---|---|
list_audiences | Every audience in the workspace: id, name, member count, refresh cadence, last refresh time and error. Archived audiences excluded. |
create_audience | Create an audience from a criteria_json tree. Names are unique per workspace (409 duplicate_name). Nothing is delivered until a destination is attached. |
get_audience | One audience in full, including its criteria tree, snapshot ids and emailable count. |
update_audience | Patch name, description, refresh cadence or the criteria tree. Replacing the tree invalidates the current snapshot — attached destinations then see a full delta. |
delete_audience | Archive an audience (soft delete). It stops refreshing and its destinations stop receiving members. No un-archive on this surface. |
compile_audience_criteria | Validate a tree and estimate its size without creating anything. is_estimate: true with hit_limit: true means the count query timed out — the tree is valid, the number is unknown. |
attach_audience_destination | Attach Google Ads Customer Match, Meta Custom Audience, LinkedIn DMP segment, or a webhook. Ad-platform targets require consent_attested: true and a ready platform connection (409 connection_not_ready). |
list_audience_destinations | The destinations attached to an audience, with per-platform sync state (match_status, list_size, last_synced_at). |
The criteria grammar is documented at
Criteria DSL; the create_audience and
compile_audience_criteria tool descriptions carry the same grammar inline, so
your agent has it without reading the docs.
Data health
| Tool | Description |
|---|---|
check_data_health | Call BEFORE trusting any number. Runs the three coverage checks (identity reconciliation, checkout-cookie coverage, server-event-cookie coverage) against fixed thresholds and returns a verdict: green = trust the numbers; amber = they are biased low by roughly the coverage gap; red = abort revenue-based decisions. |
login-funnel | Login pageview → identify or signup in 30 minutes, same visitor_id. OAuth-safe: do not quote bounce on a login URL. from_path is required (path prefixes, each starting with /). Unlinked API signups with no visitor_id never convert. |
get_replay | Dashboard URL of a sampled session recording, if one exists and has not expired. Pass a session_id from a $dead_click / $rageclick / login-funnel drop-off. 10% of product-host sessions are recorded; missing means unsampled or expired (7 days), not a tracking outage. |
Experiments
Run the full A/B test loop: define metrics, create and start an edge
experiment, read results, stop, and record the verdict. Experiment metrics
are reusable, role-free measurement definitions — an experiment assigns each
one as a goal ("move this") or a guardrail ("don't hurt this") when it
references the metric's id. The decision journal (hypothesis at create,
verdict via record_experiment_decision) is the cross-test memory: consult
list_experiments before designing a new test.
| Tool | Description |
|---|---|
list_experiments | Every experiment in the workspace — status, page under test, variations, dates, plus the journal (hypothesis, decision, learnings). The experiment memory; always read it first. |
list_experiment_metrics | The workspace's reusable metrics. Check before creating — "signup conversion" usually already exists. |
create_experiment_metric | Define a metric once: type binomial (converted yes/no) or mean (numeric per exposed visitor), source events or stripe, a numerator (what counts), and an attribution window_config. |
create_experiment | Create a draft edge experiment. Control arm stays bare (serves the canonical page); every other arm needs a deployed variant url. hypothesis is required — it's the journal entry. Weights sum to 1.0; duration_days (default 7) auto-stops the test at the deadline. |
check_experiment_power | Feasibility gate — call BEFORE create_experiment. Reports feasible, detectable_lift, required_days, daily_exposures from live data. feasible: false means the test cannot conclude in a reasonable window; rescope it rather than launching anyway. |
get_experiment_results | Compute a fresh snapshot and return per-variation sample size, conversion, uplift, CI, chance-to-win and p-value per goal metric, plus health checks (srm_p < 0.001 = broken split). Don't stop early on a good p-value — the stop rule is the planned end date. |
update_experiment | Patch an experiment. Everything is editable while it is a draft; once running only name, hypothesis and duration_days, and duration_days may only be extended. |
start_experiment | Draft → running; visitors see variants within ~60s. Deploy the variant page first. 409 page_conflict if another running experiment claims the page. |
pause_experiment | Running → paused within ~60s; the experiment stays alive and resumable via start_experiment. Use this, not stop_experiment, for a temporary halt — stopped is terminal. Paused days still count against duration_days. |
stop_experiment | Running → stopped (terminal, no resume) within ~60s. Normally the deadline auto-stops; stop manually only to kill a harmful test. |
delete_experiment | Delete an experiment and its journal permanently. A running experiment is refused (409 experiment_running) — deleting is not an early stop. Stop it, read the results, record the decision, then delete. |
record_experiment_decision | Record the verdict on a stopped experiment (409 otherwise): shipped_variant (+ decision_variant naming the winner), kept_control, or inconclusive, plus free-text learnings for future test designers. Re-recording overwrites. |
