MCP server for web analytics
Check your traffic without leaving the editor. With the Nordva Launch MCP server connected, the agent that just shipped a landing page can tell you how many people came, where from, which pages they read and how many reached the signup, and compare it with the week before.
Things to ask
- How many people visited this week, and is that up on last week?
- Where did yesterday's visits come from?
- Is anyone on the site right now?
- Set up analytics on this site and add a goal to the signup button.
- Where do people drop off between the home page and the signup?
One call, start to finish
You type: “How was traffic this week compared with last week?” The agent calls get_analytics_summary with:
{
"period_days": 7
} Returned to the agent: Visits, page views, average time on page and goal completions for the last 7 days, with the same numbers for the 7 days before, so the agent can say up or down without a second call.
Tools and arguments
get_analytics_summary
Read-onlyWeb analytics: the headline numbers
| period_days | optional | number, 1–1,825 | Days back from now. Default 7. Free reads up to 30, Indie 365, Builder 730. Past 90 days, older days come from daily totals (from_rollups: true): visitors are then each day's visitors added up, breakdowns end in an "(other)" row, and filters are refused. |
| filters | optional | object | Show only matching traffic, e.g. {"country":"NO"} or {"channel":"social"} or {"path":"/pricing"}. Values as they appear in get_analytics_breakdown. |
| exclude_country | optional | array | Two-letter country codes to leave out of this answer only, e.g. ["NO","CH"]. Omit to use the project's saved list; [] counts every country. To change the saved list use update_analytics_settings. |
get_analytics_timeseries
Read-onlyWeb analytics: visits per day or hour
| period_days | optional | number, 1–1,825 | Days back from now. Default 7. Free reads up to 30, Indie 365, Builder 730. Past 90 days, older days come from daily totals (from_rollups: true): visitors are then each day's visitors added up, breakdowns end in an "(other)" row, and filters are refused. |
| bucket | optional | "day" | "hour" | |
| filters | optional | object | Show only matching traffic, e.g. {"country":"NO"} or {"channel":"social"} or {"path":"/pricing"}. Values as they appear in get_analytics_breakdown. |
| exclude_country | optional | array | Two-letter country codes to leave out of this answer only, e.g. ["NO","CH"]. Omit to use the project's saved list; [] counts every country. To change the saved list use update_analytics_settings. |
get_analytics_breakdown
Read-onlyWeb analytics: by source, page, place or device
| dimension | required | "channel" | "referrer" | "utm_source" | "utm_medium" | "utm_campaign" | "path" | "country" | "city" | "device" | "browser" | "os" | "event" | |
| period_days | optional | number, 1–1,825 | Days back from now. Default 7. Free reads up to 30, Indie 365, Builder 730. Past 90 days, older days come from daily totals (from_rollups: true): visitors are then each day's visitors added up, breakdowns end in an "(other)" row, and filters are refused. |
| limit | optional | number, 1–100 | |
| filters | optional | object | Show only matching traffic, e.g. {"country":"NO"} or {"channel":"social"} or {"path":"/pricing"}. Values as they appear in get_analytics_breakdown. |
| exclude_country | optional | array | Two-letter country codes to leave out of this answer only, e.g. ["NO","CH"]. Omit to use the project's saved list; [] counts every country. To change the saved list use update_analytics_settings. |
get_live_visitors
Read-onlyWeb analytics: right now
| exclude_country | optional | array | Two-letter country codes to leave out of this answer only, e.g. ["NO","CH"]. Omit to use the project's saved list; [] counts every country. To change the saved list use update_analytics_settings. |
list_visitors
Read-onlyWeb analytics: everyone who came, one row per visitor
| period_days | optional | number, 1–90 | Days back from now, up to 90 (raw events are kept 90 days). Free reads up to 30. |
| limit | optional | number, 1–200 | Default 50. |
| exclude_country | optional | array | Two-letter country codes to leave out of this answer only, e.g. ["NO","CH"]. Omit to use the project's saved list; [] counts every country. To change the saved list use update_analytics_settings. |
get_visitor
Read-onlyBuilderWeb analytics: one visitor's history
| visitor_id | required | string, max 40 | |
| period_days | optional | number, 1–90 | Days back from now, up to 90 (raw events are kept 90 days). Free reads up to 30. |
get_analytics_map
Read-onlyWeb analytics: where visits came from, as map points
| period_days | optional | number, 1–1,825 | Days back from now. Default 7. Free reads up to 30, Indie 365, Builder 730. Past 90 days, older days come from daily totals (from_rollups: true): visitors are then each day's visitors added up, breakdowns end in an "(other)" row, and filters are refused. |
| filters | optional | object | Show only matching traffic, e.g. {"country":"NO"} or {"channel":"social"} or {"path":"/pricing"}. Values as they appear in get_analytics_breakdown. |
| exclude_country | optional | array | Two-letter country codes to leave out of this answer only, e.g. ["NO","CH"]. Omit to use the project's saved list; [] counts every country. To change the saved list use update_analytics_settings. |
get_analytics_status
Read-onlyWeb analytics: is the script sending?
No arguments.
get_analytics_usage
Read-onlyWeb analytics: events this month against the plan
No arguments.
get_analytics_settings
Read-onlyWeb analytics: the snippet and the site's domains
No arguments.
update_analytics_settings
Web analytics: set the site's domains, tracking mode, or turn collection on/off
| domains | optional | array | |
| enabled | optional | boolean | |
| mode | optional | "auto" | "consent" | "cookies" | "cookieless" | Tracking mode. Only when the developer asks for a change. |
| signup_goal | optional | string | The goal that counts as a signup; null for the recognised names. |
| signin_goal | optional | string | The goal that counts as a sign-in; null for the recognised names. |
| excluded_countries | optional | array | Countries every read leaves out, e.g. ["NO","CH"]; [] for none. Only when the developer asks. |
export_analytics
Read-onlyWeb analytics: take the data out as CSV or JSON
| dataset | optional | "daily" | "visitors" | "goals" | "channel" | "referrer" | "utm_source" | "utm_medium" | "utm_campaign" | "path" | "country" | "city" | "device" | "browser" | "os" | |
| format | optional | "csv" | "json" | |
| period_days | optional | number, 1–3,650 | |
| exclude_country | optional | array | Two-letter country codes to leave out of this answer only, e.g. ["NO","CH"]. Omit to use the project's saved list; [] counts every country. To change the saved list use update_analytics_settings. |
identify_visitor
Web analytics: link a visitor to a user
| visitor_id | optional | string, max 40 | The nv_vid cookie's value before the dot. Leave out when there is none. |
| user_id | optional | string, max 128 | |
| optional | string, max 254 | ||
| source | optional | string, max 64 | Where the person came in, e.g. "ios-app". Lowercased to a tag. |
| details | optional | object | Name to value for the person's contact; null removes. Reuse names from list_contact_fields. |
| consents | optional | object | Purpose to true (granted) or false (withdrawn), only as the person gave it. |
list_funnels
Read-onlyWeb analytics: the project's funnels
No arguments.
create_funnel
Web analytics: create a funnel
| name | required | string, max 80 | |
| steps | required | array |
get_funnel_report
Read-onlyWeb analytics: where visitors drop off
| funnel_id | required | string, max 64 | |
| period_days | optional | number, 1–90 | Days back from now, up to 90 (raw events are kept 90 days). Free reads up to 30. |
| exclude_country | optional | array | Two-letter country codes to leave out of this answer only, e.g. ["NO","CH"]. Omit to use the project's saved list; [] counts every country. To change the saved list use update_analytics_settings. |
delete_funnel
Confirms firstWeb analytics: delete a funnel
| funnel_id | required | string, max 64 |
get_goals
Read-onlyWeb analytics: goals and how many reach them
| period_days | optional | number, 1–1,825 | Days back from now. Default 7. Free reads up to 30, Indie 365, Builder 730. Past 90 days, older days come from daily totals (from_rollups: true): visitors are then each day's visitors added up, breakdowns end in an "(other)" row, and filters are refused. |
| limit | optional | number, 1–50 | |
| exclude_country | optional | array | Two-letter country codes to leave out of this answer only, e.g. ["NO","CH"]. Omit to use the project's saved list; [] counts every country. To change the saved list use update_analytics_settings. |
create_analytics_proxy_key
Web analytics: key for serving the script from your own domain
No arguments.
delete_analytics_proxy_key
Confirms firstWeb analytics: remove the proxy key
No arguments.
Behaviour worth knowing
- The agent installs the script itself: get_analytics_settings returns the one-line snippet and the site's domains, and the tool description tells the agent to put it in the shared layout so every page has it.
- Visitors are only reported as a number when the tracking mode allows a visitor id; otherwise the agent speaks of visits, as the tool description tells it to.
- Free reads up to 30 days back; paid plans up to 90 for now. One visitor's history (get_visitor) is on Builder.
- No IP address is stored, and places are city-level with map points rounded to about 11 km.
Questions
- Can the agent add the tracking script for me?
- Yes. It reads the snippet with get_analytics_settings, sets the site's domain with update_analytics_settings if none is set, and adds the tag to your layout. Visits from domains not listed are dropped.
- Can it tell me which visitors became paying customers?
- It can hand over to attribution and revenue: get_attribution_report and get_revenue_by_source answer which sources produced paying customers, with Stripe connected.
- Does it work with a cookie banner?
- Yes. The tracking mode is set per site, and the script can take the answer from your own banner with nordva('consent', true) or false. The agent can read and change the mode with get_analytics_settings and update_analytics_settings.