Check your website traffic from Claude Desktop
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.
Claude Desktop's config file starts local processes, so a remote server with a header is reached through the mcp-remote bridge. Node.js 18 or later must be installed.
Setup
You need a secret key (nv_live_…) from Dashboard → API keys.
01Add the bridge to the config file
claude_desktop_config.json (Settings → Developer → Edit Config)
{
"mcpServers": {
"nordva": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://mcp.nordva.dev",
"--header",
"Authorization:${NORDVA_AUTH}"
],
"env": {
"NORDVA_AUTH": "Bearer nv_live_..."
}
}
}
}The header value is passed through an environment variable because some platforms split arguments that contain a space. On macOS the file is in ~/Library/Application Support/Claude/, on Windows in %APPDATA%\Claude\.
02Check the connection
Quit and reopen Claude Desktop. The nordva tools should appear in the tools menu of a new chat. Ask it to run setup_check.
Then ask Claude Desktop
- 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?
For “How was traffic this week compared with last week?” Claude Desktop calls get_analytics_summary with:
{
"period_days": 7
} Returned: 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.
Web analytics 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.
- The Connectors screen in Claude Desktop and claude.ai expects OAuth. The Nordva Launch server authenticates with an API key header instead, which is why the bridge is needed there.