Skip to main content
58 min read

MCP Tools Reference

This page documents all 77 MCP tools available through the Zenovay analytics server. Each tool includes its parameters, an example JSON-RPC request, and an example response.

Server URL: https://api.zenovay.com/mcp Transport: Streamable HTTP (JSON-RPC 2.0) Auth Header: Authorization: Bearer zv_YOUR_API_KEY

All tools require a valid API key with MCP enabled. Write tools (marked with requires read_write) return an error in Read Only mode. See Permissions & Limits for the full list.


Quick Reference for AI Assistants

Use this section to quickly understand the Zenovay MCP server. Every request uses this JSON-RPC envelope:

Request TemplateJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "TOOL_NAME",
  "arguments": { ... }
}
}

First step in every session: Call list_websites (no arguments) to discover website IDs. Almost every tool requires a website_id parameter.

All 77 tools at a glance:

#ToolCategoryCostDescription
1query_analyticsanalytics3Natural language analytics query
2get_visitorsanalytics1Visitor stats with optional period comparison
3get_top_pagesanalytics1Most visited pages ranked by visitor count
4get_traffic_sourcesanalytics1Traffic sources / referrers breakdown
5get_geographic_dataanalytics1Country + optional city breakdown
6get_technology_breakdownanalytics1Devices, browsers, operating systems
7get_realtime_visitorsanalytics1Currently active visitors (last 5 min)
8compare_periodsanalytics1Compare metrics between two time periods
9get_funnel_analysisadvanced1Funnel step-by-step conversion data
10get_goalsadvanced1Active goals with completion rates
11get_session_replaysadvanced1Session replay recordings list (Pro+)
12get_heatmap_dataadvanced1Heatmap interaction data per page (Pro+)
13get_errorsadvanced1JavaScript error tracking
14get_b2b_companiesadvanced1B2B company identification via reverse IP
15get_revenueadvanced1Revenue totals + breakdowns (Pro+)
16get_performance_metricsadvanced1Core Web Vitals (LCP, CLS, INP, FCP, TTFB)
17get_insightsai_insights1AI-generated actionable insights
18get_anomaliesai_insights1Detected metric anomalies
19get_weekly_digestai_insights1Weekly performance digest (this vs last week)
20get_recommendationsai_insights1AI-powered optimization recommendations
21list_websitesmanagement1List accessible websites (call first!)
22create_goalmanagement1Create custom goal (requires read_write)
23manage_funnelmanagement1Create/update funnel (requires read_write)
24export_datamanagement1Export analytics in JSON or CSV (Scale+)
25get_api_usagemanagement1Check remaining daily quota
26get_website_settingsmanagement1Get website configuration and settings
27update_website_settingsmanagement1Update website settings (requires read_write)
28toggle_public_dashboardmanagement1Enable/disable public dashboard (requires read_write)
29toggle_cookieless_trackingmanagement1Enable/disable cookieless mode (requires read_write, Pro+)
30get_tracking_codemanagement1Get the tracking code snippet for a website
31regenerate_tracking_codemanagement1Generate a new tracking code (requires read_write)
32list_goalsmanagement1List all goals for a website
33update_goalmanagement1Update an existing goal (requires read_write)
34delete_goalmanagement1Delete a goal (requires read_write)
35toggle_goalmanagement1Enable or disable a goal (requires read_write)
36list_funnelsmanagement1List all funnels for a website
37delete_funnelmanagement1Delete a funnel (requires read_write)
38delete_websitemanagement1Permanently delete a website (requires read_write, full_access)
39add_ip_exclusionsettings1Add IP to exclusion list (requires read_write)
40remove_ip_exclusionsettings1Remove IP from exclusion list (requires read_write)
41add_path_exclusionsettings1Add path pattern to exclusions (requires read_write)
42remove_path_exclusionsettings1Remove path from exclusions (requires read_write)
43list_exclusionssettings1List all IP and path exclusions
44get_notification_settingssettings1Get notification preferences
45update_notification_settingssettings1Update notification preferences (requires read_write)
46get_team_membersteam1List team members (requires full_access)
47invite_team_memberteam1Invite a new team member (requires read_write, full_access, Pro+)
48remove_team_memberteam1Remove a team member (requires read_write, full_access)
49create_websitemanagement1Create a new website (requires read_write, full_access)
50list_api_keysapi_keys1List all API keys for the team
51create_api_keyapi_keys1Create a new API key (requires read_write)
52revoke_api_keyapi_keys1Revoke an API key (requires read_write)
53get_api_key_detailsapi_keys1Get details for a specific API key
54update_api_key_permissionsapi_keys1Update API key permissions (requires read_write)
55list_uptime_monitorsuptime1List all uptime monitors
56get_uptime_statusuptime1Get current status for a monitor
57create_uptime_monitoruptime1Create a new uptime monitor (requires read_write)
58delete_uptime_monitoruptime1Delete an uptime monitor (requires read_write)
59get_uptime_historyuptime1Get uptime history and incident log
60update_website_namemanagement1Update website display name (requires read_write)
61update_website_timezonemanagement1Update website timezone (requires read_write)
62update_website_domainmanagement1Update website domain (requires read_write)
63pause_trackingmanagement1Pause analytics tracking (requires read_write)
64resume_trackingmanagement1Resume analytics tracking (requires read_write)
65schedule_reportmanagement1Schedule a recurring analytics report (requires read_write)
66get_report_schedulemanagement1Get scheduled report configuration
67cancel_reportmanagement1Cancel a scheduled report (requires read_write)
68get_export_historymanagement1Get data export history
69get_data_retentionmanagement1Get data retention policy for the website
70set_revenue_currencysettings1Set revenue currency (requires read_write)
71get_revenue_settingssettings1Get revenue settings (currency, field mappings)
72add_allowed_domainsettings1Add domain to CORS whitelist (requires read_write)
73remove_allowed_domainsettings1Remove domain from CORS whitelist (requires read_write)
74list_allowed_domainssettings1List CORS whitelisted domains
75request_data_deletionsettings1Delete visitor data for GDPR (requires read_write)
76get_retention_dataadvanced1Retention cohort analysis (Pro+)
77get_user_profilesanalytics1Visitor profiles with session history

Common time_range values: 24h, 7d, 30d, 90d, 1y (default: 7d for most tools)


Common Patterns

Before diving into individual tools, here are common multi-tool workflows:

Website discovery + analysis:

  1. list_websites — find your website IDs
  2. get_visitors — get traffic overview
  3. get_top_pages — see which pages perform best
  4. get_traffic_sources — understand where traffic comes from

Performance audit:

  1. list_websites — get website ID
  2. get_performance_metrics — check Core Web Vitals
  3. get_errors — find JavaScript errors
  4. get_insights — see AI-generated recommendations

Weekly review:

  1. get_weekly_digest — automated week-over-week comparison
  2. get_anomalies — check for unusual patterns
  3. compare_periods — deep-dive into specific metrics

Analytics Tools

All analytics tools enforce your plan's data retention window. Queries requesting data beyond your retention limit are automatically clamped, and the response includes a retention_note field. See Plan Enforcement for retention limits by plan.

1. query_analytics

Ask a natural language question about your analytics data. This is the most flexible tool — use it when other specific tools don't fit.

Cost: 3 queries

ParameterTypeRequiredDescription
website_idstringYesThe UUID of the website
questionstringYesNatural language question (max 500 characters)
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "query_analytics",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "question": "How many visitors did I have this week?"
  }
}
}
ResponseJSON
{
"jsonrpc": "2.0",
"id": 1,
"result": {
  "content": [{
    "type": "text",
    "text": {
      "intent": "visitor_count",
      "confidence": 0.95,
      "time_range": "7d",
      "results": { "total_visitors": 1250, "unique_visitors": 980 },
      "summary": "You had 1,250 total visitors (980 unique) in the last 7 days.",
      "suggestions": [
        "How many visitors did I have this week?",
        "What are my top pages?",
        "Where are my visitors from?",
        "What devices do visitors use?"
      ]
    }
  }]
}
}

2. get_visitors

Get visitor statistics for a website with optional period comparison.

Cost: 1 query

ParameterTypeRequiredDefaultDescription
website_idstringYesThe UUID of the website
time_rangestringNo7dTime range: 24h, 7d, 30d, 90d, 1y
compare_with_previousbooleanNofalseInclude comparison with previous period
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "get_visitors",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "time_range": "7d",
    "compare_with_previous": true
  }
}
}
ResponseJSON
{
"summary": {
  "total_visitors": 1250,
  "unique_visitors": 980,
  "page_views": 3400,
  "bounce_rate": 42.5,
  "avg_session_duration": 185.3
},
"daily_stats": [
  { "date": "2026-02-27", "visitors": 180, "unique_visitors": 140, "page_views": 490, "bounce_rate": 41.2 },
  { "date": "2026-02-28", "visitors": 195, "unique_visitors": 155, "page_views": 510, "bounce_rate": 43.1 }
],
"comparison": {
  "previous_period": { "start": "2026-02-20", "end": "2026-02-26" },
  "previous_summary": {
    "total_visitors": 1100,
    "unique_visitors": 870,
    "page_views": 3100,
    "bounce_rate": 44.8
  },
  "changes": {
    "visitors_pct": 13.64,
    "unique_visitors_pct": 12.64,
    "page_views_pct": 9.68,
    "bounce_rate_pct": -5.13
  }
}
}

3. get_top_pages

Get the most visited pages ranked by visitor count.

Cost: 1 query

ParameterTypeRequiredDefaultDescription
website_idstringYesThe UUID of the website
time_rangestringNo7dTime range: 24h, 7d, 30d, 90d, 1y
limitnumberNo20Max pages to return (1-100)
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "get_top_pages",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "time_range": "30d",
    "limit": 5
  }
}
}
ResponseJSON
{
"pages": [
  { "url": "/", "visitors": 520, "percentage": 41.6 },
  { "url": "/pricing", "visitors": 180, "percentage": 14.4 },
  { "url": "/features", "visitors": 145, "percentage": 11.6 },
  { "url": "/docs", "visitors": 110, "percentage": 8.8 },
  { "url": "/blog/analytics-guide", "visitors": 95, "percentage": 7.6 }
],
"total_pages": 47
}

4. get_traffic_sources

Get traffic sources showing where visitors come from.

Cost: 1 query

ParameterTypeRequiredDefaultDescription
website_idstringYesThe UUID of the website
time_rangestringNo7dTime range: 24h, 7d, 30d, 90d, 1y
limitnumberNo20Max sources to return (1-100)
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "get_traffic_sources",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "time_range": "30d"
  }
}
}
ResponseJSON
{
"sources": [
  { "source": "Direct", "visitors": 450, "percentage": 36.0 },
  { "source": "google.com", "visitors": 320, "percentage": 25.6 },
  { "source": "twitter.com", "visitors": 85, "percentage": 6.8 },
  { "source": "github.com", "visitors": 60, "percentage": 4.8 }
],
"total_sources": 23
}

5. get_geographic_data

Get geographic breakdown by country with optional city-level detail.

Cost: 1 query

ParameterTypeRequiredDefaultDescription
website_idstringYesThe UUID of the website
time_rangestringNo7dTime range: 24h, 7d, 30d, 90d, 1y
limitnumberNo20Max entries (1-100)
include_citiesbooleanNofalseInclude city-level breakdown per country
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "get_geographic_data",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "include_cities": true,
    "limit": 3
  }
}
}
ResponseJSON
{
"countries": [
  {
    "country_code": "US",
    "country_name": "United States",
    "visitors": 520,
    "percentage": 41.6,
    "cities": [
      { "city": "San Francisco", "visitors": 85 },
      { "city": "New York", "visitors": 72 }
    ]
  },
  {
    "country_code": "DE",
    "country_name": "Germany",
    "visitors": 180,
    "percentage": 14.4,
    "cities": [
      { "city": "Berlin", "visitors": 45 },
      { "city": "Munich", "visitors": 32 }
    ]
  }
],
"total_countries": 28
}

6. get_technology_breakdown

Get visitor technology breakdown: devices, browsers, and operating systems.

Cost: 1 query

ParameterTypeRequiredDefaultDescription
website_idstringYesThe UUID of the website
time_rangestringNo7dTime range: 24h, 7d, 30d, 90d, 1y
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "get_technology_breakdown",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  }
}
}
ResponseJSON
{
"devices": [
  { "name": "desktop", "visitors": 780, "percentage": 62.4 },
  { "name": "mobile", "visitors": 390, "percentage": 31.2 },
  { "name": "tablet", "visitors": 80, "percentage": 6.4 }
],
"browsers": [
  { "name": "Chrome", "visitors": 625, "percentage": 50.0 },
  { "name": "Safari", "visitors": 300, "percentage": 24.0 },
  { "name": "Firefox", "visitors": 150, "percentage": 12.0 }
],
"operating_systems": [
  { "name": "Windows", "visitors": 450, "percentage": 36.0 },
  { "name": "macOS", "visitors": 350, "percentage": 28.0 },
  { "name": "iOS", "visitors": 250, "percentage": 20.0 },
  { "name": "Android", "visitors": 140, "percentage": 11.2 }
],
"total_visitors": 1250
}

7. get_realtime_visitors

Get currently active visitors (visited within the last 5 minutes).

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe UUID of the website
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "get_realtime_visitors",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  }
}
}
ResponseJSON
{
"active_visitors": 12,
"recent_visitors": [
  {
    "country_name": "United States",
    "page_url": "/pricing",
    "device_type": "desktop",
    "browser": "Chrome"
  },
  {
    "country_name": "Germany",
    "page_url": "/",
    "device_type": "mobile",
    "browser": "Safari"
  }
]
}

8. compare_periods

Compare analytics metrics between two time periods.

Cost: 1 query

ParameterTypeRequiredDefaultDescription
website_idstringYesThe UUID of the website
current_periodstringNo7dCurrent period: 24h, 7d, 30d, 90d
comparison_periodstringNopreviousComparison: previous, same_period_last_month, same_period_last_year
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "compare_periods",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "current_period": "30d",
    "comparison_period": "same_period_last_month"
  }
}
}
ResponseJSON
{
"current": {
  "period": { "start": "2026-02-04", "end": "2026-03-06" },
  "visitors": 3800,
  "unique_visitors": 2900,
  "page_views": 10200,
  "bounce_rate": 42.5,
  "avg_session_duration": 185.3,
  "days": 30
},
"comparison": {
  "period": { "start": "2026-01-05", "end": "2026-02-04" },
  "type": "same_period_last_month",
  "visitors": 3200,
  "unique_visitors": 2500,
  "page_views": 8800,
  "bounce_rate": 45.1,
  "avg_session_duration": 170.8,
  "days": 30
},
"changes": {
  "visitors_pct": 18.75,
  "unique_visitors_pct": 16.0,
  "pageviews_pct": 15.91,
  "bounce_rate_pct": -5.76,
  "avg_session_duration_pct": 8.49
}
}

Advanced Tools

9. get_funnel_analysis

Get funnel analysis data. Without a funnel_id, lists all funnels. With one, returns step-by-step conversion data.

Cost: 1 query

ParameterTypeRequiredDefaultDescription
website_idstringYesThe website UUID
funnel_idstringNoFunnel UUID for detailed step analysis
time_rangestringNo30dTime range: 24h, 7d, 30d, 90d, 1y
Request (list funnels)JSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "get_funnel_analysis",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  }
}
}
ResponseJSON
{
"funnels": [
  { "id": "f1a2b3c4-...", "name": "Signup Flow", "created_at": "2026-01-15T10:00:00Z" },
  { "id": "f5d6e7f8-...", "name": "Checkout Flow", "created_at": "2026-02-01T14:30:00Z" }
]
}
Request (detailed analysis)JSON
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
  "name": "get_funnel_analysis",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "funnel_id": "f1a2b3c4-..."
  }
}
}
ResponseJSON
{
"funnel": { "id": "f1a2b3c4-...", "name": "Signup Flow" },
"steps": [
  { "name": "Landing Page", "order": 1, "visitors": 500, "conversion_rate": 100 },
  { "name": "Signup Form", "order": 2, "visitors": 320, "conversion_rate": 64 },
  { "name": "Email Verification", "order": 3, "visitors": 280, "conversion_rate": 56 },
  { "name": "Onboarding Complete", "order": 4, "visitors": 210, "conversion_rate": 42 }
]
}

10. get_goals

Get active goals with completion counts and conversion rates.

Cost: 1 query

ParameterTypeRequiredDefaultDescription
website_idstringYesThe website UUID
time_rangestringNo30dTime range: 24h, 7d, 30d, 90d, 1y
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "get_goals",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  }
}
}
ResponseJSON
{
"goals": [
  { "id": "g1...", "name": "Newsletter Signup", "goal_type": "url_match", "is_active": true, "completions": 145, "conversion_rate": 3.82 },
  { "id": "g2...", "name": "Pricing Click", "goal_type": "element_click", "is_active": true, "completions": 89, "conversion_rate": 2.34 }
]
}

11. get_session_replays

List session replay recordings. Filter by device or country.

Cost: 1 query | Requires: Pro+ (sessionReplay feature flag)

ParameterTypeRequiredDefaultDescription
website_idstringYesThe website UUID
limitnumberNo20Sessions to return (1-50)
device_typestringNoFilter: desktop, mobile, tablet
country_codestringNoISO country code (e.g. US, DE)
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "get_session_replays",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "device_type": "mobile",
    "limit": 5
  }
}
}
ResponseJSON
{
"sessions": [
  {
    "id": "sr1...",
    "session_id": "sess_abc123",
    "visitor_id": "v1...",
    "duration_ms": 45200,
    "page_count": 4,
    "had_interaction": true,
    "started_at": "2026-03-05T14:22:00Z"
  }
],
"total": 23
}

12. get_heatmap_data

Get heatmap interaction data per page.

Cost: 1 query | Requires: Pro+ (heatmaps feature flag)

ParameterTypeRequiredDefaultDescription
website_idstringYesThe website UUID
page_urlstringNoFilter to a specific page URL
limitnumberNo20Pages to return (1-50)
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "get_heatmap_data",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  }
}
}
ResponseJSON
{
"pages": [
  { "page_url": "/", "total_interactions": 2340, "unique_visitors": 890, "last_updated": "2026-03-05T18:00:00Z" },
  { "page_url": "/pricing", "total_interactions": 1560, "unique_visitors": 620, "last_updated": "2026-03-05T17:45:00Z" }
]
}

13. get_errors

Get tracked JavaScript errors for a website.

Cost: 1 query

ParameterTypeRequiredDefaultDescription
website_idstringYesThe website UUID
statusstringNoopenFilter: open, resolved, ignored
limitnumberNo50Errors to return (1-100)
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "get_errors",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "status": "open"
  }
}
}
ResponseJSON
{
"errors": [
  {
    "id": "e1...",
    "message": "TypeError: Cannot read property 'map' of undefined",
    "type": "TypeError",
    "occurrence_count": 45,
    "first_seen": "2026-02-28T10:15:00Z",
    "last_seen": "2026-03-05T22:30:00Z",
    "is_resolved": false
  }
],
"total": 8
}

14. get_b2b_companies

Identify B2B companies visiting your website via reverse IP lookup.

Cost: 1 query

ParameterTypeRequiredDefaultDescription
website_idstringYesThe website UUID
limitnumberNo20Companies to return (1-100)
sort_bystringNolast_seenSort: visits, last_seen, confidence
industrystringNoFilter by industry (e.g. Technology)
min_visitsnumberNo1Minimum visit count
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "get_b2b_companies",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "sort_by": "visits",
    "min_visits": 3
  }
}
}
ResponseJSON
{
"companies": [
  {
    "name": "Acme Corp",
    "domain": "acme.com",
    "industry": "Technology",
    "employee_count": 500,
    "visit_count": 12,
    "last_visit": "2026-03-05T16:00:00Z",
    "confidence_score": 0.92
  }
]
}

15. get_revenue

Get revenue analytics with totals and breakdowns.

Cost: 1 query | Requires: Pro+ (revenueAttribution feature flag)

ParameterTypeRequiredDefaultDescription
website_idstringYesThe website UUID
time_rangestringNo30dTime range: 24h, 7d, 30d, 90d, 1y
group_bystringNodayGrouping: day, week, month, source
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "get_revenue",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "group_by": "source"
  }
}
}
ResponseJSON
{
"total_revenue": 12450.00,
"transaction_count": 89,
"avg_order_value": 139.89,
"currency": "USD",
"breakdown": [
  { "source": "google.com", "revenue": 5200.00, "transactions": 38 },
  { "source": "Direct", "revenue": 4100.00, "transactions": 30 },
  { "source": "twitter.com", "revenue": 1850.00, "transactions": 12 }
]
}

16. get_performance_metrics

Get Core Web Vitals and performance metrics with percentile breakdowns.

Cost: 1 query

ParameterTypeRequiredDefaultDescription
website_idstringYesThe website UUID
time_rangestringNo7dTime range: 24h, 7d, 30d, 90d, 1y
page_urlstringNoFilter to a specific page
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "get_performance_metrics",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  }
}
}
ResponseJSON
{
"lcp": { "p50": 1800, "p75": 2200, "p90": 3100, "rating": "good", "sample_count": 450 },
"cls": { "p50": 0.05, "p75": 0.08, "p90": 0.15, "rating": "good", "sample_count": 450 },
"inp": { "p50": 120, "p75": 180, "p90": 280, "rating": "good", "sample_count": 420 },
"fcp": { "p50": 1200, "p75": 1600, "p90": 2400, "rating": "good", "sample_count": 450 },
"ttfb": { "p50": 350, "p75": 600, "p90": 950, "rating": "good", "sample_count": 450 }
}

Rating thresholds:

MetricGoodNeeds ImprovementPoor
LCP≤ 2500ms≤ 4000ms> 4000ms
CLS≤ 0.1≤ 0.25> 0.25
INP≤ 200ms≤ 500ms> 500ms
FCP≤ 1800ms≤ 3000ms> 3000ms
TTFB≤ 800ms≤ 1800ms> 1800ms

AI Insights Tools

17. get_insights

Retrieve AI-generated actionable insights about website performance.

Cost: 1 query

ParameterTypeRequiredDefaultDescription
website_idstringYesThe website UUID
severitystringNoFilter: critical, warning, info
statusstringNoactiveFilter: active, acknowledged, resolved
limitnumberNo10Max insights (1-50)
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "get_insights",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "severity": "critical"
  }
}
}
ResponseJSON
{
"website": { "id": "2ea8af07-...", "domain": "example.com" },
"insights": [
  {
    "id": "i1...",
    "title": "Bounce rate spike on /pricing",
    "description": "Bounce rate on the pricing page increased by 35% compared to last week. Consider reviewing recent changes.",
    "severity": "critical",
    "type": "bounce_rate",
    "created_at": "2026-03-05T08:00:00Z"
  }
],
"summary": { "total": 3, "critical": 1, "warning": 1, "info": 1 }
}

18. get_anomalies

Retrieve detected anomalies — unusual deviations in metrics.

Cost: 1 query

ParameterTypeRequiredDefaultDescription
website_idstringYesThe website UUID
severitystringNoFilter: critical, warning, info
metricstringNoFilter by metric (e.g. visitors, bounce_rate)
limitnumberNo10Max anomalies (1-50)
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "get_anomalies",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  }
}
}
ResponseJSON
{
"website": { "id": "2ea8af07-...", "domain": "example.com" },
"anomalies": [
  {
    "id": "a1...",
    "metric_name": "visitors",
    "expected_value": 180,
    "actual_value": 45,
    "deviation_pct": -75.0,
    "severity": "critical",
    "detected_at": "2026-03-04T00:00:00Z",
    "is_resolved": false
  }
],
"total": 2
}

19. get_weekly_digest

Generate a weekly performance digest comparing this week vs last week.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "get_weekly_digest",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  }
}
}
ResponseJSON
{
"website": { "id": "2ea8af07-...", "domain": "example.com" },
"this_week": { "visitors": 1250, "pageviews": 3400, "sessions": 980, "bounce_rate": 42.5, "avg_duration": 185 },
"last_week": { "visitors": 1100, "pageviews": 3100, "sessions": 870, "bounce_rate": 44.8, "avg_duration": 170 },
"changes": {
  "visitors": 13.64,
  "pageviews": 9.68,
  "sessions": 12.64,
  "bounce_rate": -5.13,
  "avg_duration": 8.82
},
"top_pages": [
  { "path": "/", "views": 520 },
  { "path": "/pricing", "views": 180 }
],
"top_countries": [
  { "country": "US", "visitors": 520 },
  { "country": "DE", "visitors": 180 }
]
}

20. get_recommendations

Get AI-powered optimization recommendations.

Cost: 1 query

ParameterTypeRequiredDefaultDescription
website_idstringYesThe website UUID
categorystringNoFilter: performance, engagement, conversion, seo
limitnumberNo5Max recommendations (1-20)
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "get_recommendations",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "category": "performance"
  }
}
}
ResponseJSON
{
"website": { "id": "2ea8af07-...", "domain": "example.com" },
"recommendations": [
  {
    "id": "r1...",
    "title": "Optimize Largest Contentful Paint",
    "description": "Your LCP p75 is 3200ms (needs improvement). Consider lazy-loading below-fold images and preloading critical assets.",
    "category": "performance",
    "priority": "high",
    "impact": "Improving LCP to under 2500ms could reduce bounce rate by ~10%"
  }
],
"total": 3
}

Management Tools

21. list_websites

List all websites accessible by the current API key.

Cost: 1 query

This tool takes no parameters. Full-access keys see all team websites; site-scoped keys see only their assigned website.

RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "list_websites",
  "arguments": {}
}
}
ResponseJSON
{
"websites": [
  {
    "id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "domain": "example.com",
    "name": "My Website",
    "tracking_code": "zv_abc123",
    "is_active": true,
    "created_at": "2025-06-15T10:00:00Z"
  }
],
"total": 1
}

22. create_goal

Create a custom conversion goal. Requires read_write mode.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
namestringYesGoal name (max 100 chars)
goal_typestringYesurl_match, element_click, or custom_event
url_patternstringFor url_matchURL pattern to match
url_match_typestringNoexact, contains, starts_with, ends_with, regex (default: contains)
css_selectorstringFor element_clickCSS selector of the element
event_namestringFor custom_eventCustom event name to track
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "create_goal",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "name": "Newsletter Signup",
    "goal_type": "url_match",
    "url_pattern": "/thank-you",
    "url_match_type": "contains"
  }
}
}
ResponseJSON
{
"goal": {
  "id": "g1a2b3c4-...",
  "name": "Newsletter Signup",
  "goal_type": "url_match",
  "is_active": true,
  "created_at": "2026-03-06T12:00:00Z"
}
}

23. manage_funnel

Create or update a conversion funnel. Requires read_write mode.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
namestringYesFunnel name
stepsarrayYes2-10 ordered steps (see below)
funnel_idstringNoExisting funnel UUID to update

Step object:

FieldTypeRequiredDescription
step_namestringYesDisplay name
step_typestringYesurl_match, element_click, custom_event
url_patternstringNoURL pattern (for url_match)
url_match_typestringNoexact, contains, starts_with, ends_with, regex
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "manage_funnel",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "name": "Checkout Flow",
    "steps": [
      { "step_name": "Product Page", "step_type": "url_match", "url_pattern": "/products" },
      { "step_name": "Add to Cart", "step_type": "custom_event", "url_pattern": "add_to_cart" },
      { "step_name": "Checkout", "step_type": "url_match", "url_pattern": "/checkout" },
      { "step_name": "Purchase Complete", "step_type": "url_match", "url_pattern": "/order-confirmation" }
    ]
  }
}
}
ResponseJSON
{
"funnel": {
  "id": "f1a2b3c4-...",
  "name": "Checkout Flow",
  "steps_count": 4,
  "created_at": "2026-03-06T12:00:00Z"
}
}

24. export_data

Export analytics data in JSON or CSV format.

Cost: 1 query | Requires: Scale+ (dataExport feature flag)

ParameterTypeRequiredDefaultDescription
website_idstringYesThe website UUID
formatstringNojsonOutput format: csv, json
metricsarrayNo["visitors","pageviews","unique_visitors"]Metrics to include
time_rangestringNo30dTime range: 7d, 30d, 90d, 1y

Available metrics: visitors, pageviews, unique_visitors, bounce_rate, avg_session_duration

RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "export_data",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "format": "csv",
    "metrics": ["visitors", "pageviews", "bounce_rate"],
    "time_range": "30d"
  }
}
}
ResponseJSON
{
"format": "csv",
"time_range": "30d",
"data": "date,visitors,page_views,bounce_rate\n2026-02-04,120,340,42.5\n2026-02-05,135,380,41.2\n...",
"total_rows": 30
}

25. get_api_usage

Check current API key usage and remaining quota.

Cost: 1 query

This tool takes no parameters.

RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "get_api_usage",
  "arguments": {}
}
}
ResponseJSON
{
"api_key": {
  "id": "key_abc123",
  "name": "Production Key",
  "permission": "full_access"
},
"usage": {
  "monthly_requests": 1250,
  "total_requests": 8400
},
"mcp": {
  "queries_today": 15,
  "queries_limit": 500,
  "reset_at": "2026-03-07T00:00:00Z"
},
"subscription": {
  "tier": "Scale"
}
}

26. get_website_settings

Get configuration and settings for a website.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "get_website_settings",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  }
}
}
ResponseJSON
{
"website": {
  "id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "domain": "example.com",
  "name": "My Website",
  "is_active": true,
  "created_at": "2025-06-15T10:00:00Z"
},
"settings": {
  "public_dashboard_enabled": false,
  "public_dashboard_url": null,
  "cookieless_tracking": false,
  "tracking_code": "zv_abc123",
  "timezone": "America/New_York",
  "data_retention_days": 730,
  "allowed_domains": ["example.com", "www.example.com"]
}
}

27. update_website_settings

Update website configuration settings. Requires read_write mode.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
namestringNoWebsite display name
timezonestringNoIANA timezone (e.g. America/New_York)
allowed_domainsarrayNoList of allowed domains for the tracking script
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "update_website_settings",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "name": "My Updated Website",
    "timezone": "Europe/Berlin",
    "allowed_domains": ["example.com", "www.example.com", "staging.example.com"]
  }
}
}
ResponseJSON
{
"website": {
  "id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "name": "My Updated Website",
  "timezone": "Europe/Berlin",
  "allowed_domains": ["example.com", "www.example.com", "staging.example.com"],
  "updated_at": "2026-03-15T10:00:00Z"
}
}

28. toggle_public_dashboard

Enable or disable public dashboard sharing for a website. Requires read_write mode.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
enabledbooleanYestrue to enable, false to disable
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "toggle_public_dashboard",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "enabled": true
  }
}
}
ResponseJSON
{
"public_dashboard": {
  "enabled": true,
  "url": "https://app.zenovay.com/public/2ea8af07-xxxx",
  "globe_url": "https://app.zenovay.com/globe/2ea8af07-xxxx"
}
}

29. toggle_cookieless_tracking

Enable or disable cookieless tracking mode. Requires read_write mode. Pro plan or higher.

When enabled, the tracker uses SHA-256(IP_subnet + UA + daily_salt) for visitor identification instead of cookies or localStorage.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
enabledbooleanYestrue to enable, false to disable
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "toggle_cookieless_tracking",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "enabled": true
  }
}
}
ResponseJSON
{
"cookieless_tracking": {
  "enabled": true,
  "method": "server_side_hashing",
  "updated_at": "2026-03-15T10:00:00Z"
}
}

Cookieless tracking is privacy-first. No cookies or localStorage are used. Visitor identification is computed server-side using a daily-rotating salt.


30. get_tracking_code

Get the tracking code snippet for a website. Use this to retrieve the script tag to install on your site.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "get_tracking_code",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  }
}
}
ResponseJSON
{
"tracking_code": "zv_abc123",
"script_tag": "<script defer data-website-id=\"zv_abc123\" src=\"https://api.zenovay.com/tracker.js\"></script>",
"cookieless_script_tag": "<script defer data-website-id=\"zv_abc123\" data-cookieless=\"true\" src=\"https://api.zenovay.com/tracker.js\"></script>"
}

31. regenerate_tracking_code

Generate a new tracking code for a website. Requires read_write mode.

This invalidates the previous tracking code. You must update the script tag on your website after regenerating.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "regenerate_tracking_code",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  }
}
}
ResponseJSON
{
"tracking_code": "zv_def456",
"previous_code": "zv_abc123",
"script_tag": "<script defer data-website-id=\"zv_def456\" src=\"https://api.zenovay.com/tracker.js\"></script>",
"regenerated_at": "2026-03-15T10:00:00Z"
}

32. list_goals

List all goals for a website with their current status and conversion rates.

Cost: 1 query

ParameterTypeRequiredDefaultDescription
website_idstringYesThe website UUID
include_inactivebooleanNofalseInclude disabled goals
time_rangestringNo30dTime range for conversion stats: 7d, 30d, 90d, 1y
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "list_goals",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "include_inactive": true
  }
}
}
ResponseJSON
{
"goals": [
  {
    "id": "g1a2b3c4-...",
    "name": "Newsletter Signup",
    "goal_type": "url_match",
    "url_pattern": "/thank-you",
    "is_active": true,
    "completions": 145,
    "conversion_rate": 3.82,
    "created_at": "2026-01-15T10:00:00Z"
  },
  {
    "id": "g5d6e7f8-...",
    "name": "Old Promo Banner",
    "goal_type": "element_click",
    "css_selector": "#promo-cta",
    "is_active": false,
    "completions": 0,
    "conversion_rate": 0,
    "created_at": "2025-11-01T08:00:00Z"
  }
],
"total": 2
}

33. update_goal

Update an existing goal's configuration. Requires read_write mode.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
goal_idstringYesThe goal UUID
namestringNoUpdated goal name
url_patternstringNoUpdated URL pattern
url_match_typestringNoexact, contains, starts_with, ends_with, regex
css_selectorstringNoUpdated CSS selector
event_namestringNoUpdated event name
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "update_goal",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "goal_id": "g1a2b3c4-...",
    "name": "Newsletter Signup v2",
    "url_pattern": "/signup-complete"
  }
}
}
ResponseJSON
{
"goal": {
  "id": "g1a2b3c4-...",
  "name": "Newsletter Signup v2",
  "goal_type": "url_match",
  "url_pattern": "/signup-complete",
  "is_active": true,
  "updated_at": "2026-03-15T10:00:00Z"
}
}

34. delete_goal

Permanently delete a goal. Requires read_write mode.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
goal_idstringYesThe goal UUID to delete
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "delete_goal",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "goal_id": "g5d6e7f8-..."
  }
}
}
ResponseJSON
{
"deleted": true,
"goal_id": "g5d6e7f8-..."
}

35. toggle_goal

Enable or disable a goal without deleting it. Requires read_write mode.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
goal_idstringYesThe goal UUID
is_activebooleanYestrue to enable, false to disable
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "toggle_goal",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "goal_id": "g1a2b3c4-...",
    "is_active": false
  }
}
}
ResponseJSON
{
"goal": {
  "id": "g1a2b3c4-...",
  "name": "Newsletter Signup v2",
  "is_active": false,
  "updated_at": "2026-03-15T10:00:00Z"
}
}

36. list_funnels

List all funnels for a website.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "list_funnels",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  }
}
}
ResponseJSON
{
"funnels": [
  {
    "id": "f1a2b3c4-...",
    "name": "Signup Flow",
    "steps_count": 4,
    "created_at": "2026-01-15T10:00:00Z"
  },
  {
    "id": "f5d6e7f8-...",
    "name": "Checkout Flow",
    "steps_count": 5,
    "created_at": "2026-02-01T14:30:00Z"
  }
],
"total": 2
}

37. delete_funnel

Permanently delete a funnel. Requires read_write mode.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
funnel_idstringYesThe funnel UUID to delete
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "delete_funnel",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "funnel_id": "f5d6e7f8-..."
  }
}
}
ResponseJSON
{
"deleted": true,
"funnel_id": "f5d6e7f8-..."
}

38. delete_website

Permanently delete a website and all its analytics data. Requires read_write mode and full_access key.

This action is irreversible. All analytics data, goals, funnels, and settings for this website will be permanently deleted.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID to delete
confirmbooleanYesMust be true to confirm deletion
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "delete_website",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "confirm": true
  }
}
}
ResponseJSON
{
"deleted": true,
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"domain": "example.com"
}

49. create_website

Create a new website to track. Requires read_write mode and full_access key.

Cost: 1 query

ParameterTypeRequiredDescription
domainstringYesThe website domain (e.g. docs.example.com)
namestringNoDisplay name (defaults to the domain)
timezonestringNoIANA timezone (default: UTC)
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "create_website",
  "arguments": {
    "domain": "docs.example.com",
    "name": "Documentation Site",
    "timezone": "America/New_York"
  }
}
}
ResponseJSON
{
"website": {
  "id": "3fb9bg08-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "domain": "docs.example.com",
  "name": "Documentation Site",
  "tracking_code": "zv_ghi789",
  "is_active": true,
  "created_at": "2026-03-15T10:00:00Z"
},
"script_tag": "<script defer data-website-id=\"zv_ghi789\" src=\"https://api.zenovay.com/tracker.js\"></script>"
}

Settings Tools

39. add_ip_exclusion

Add an IP address or CIDR range to the exclusion list. Visitors from excluded IPs will not be tracked. Requires read_write mode.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
ip_addressstringYesIP address or CIDR range (e.g. 192.168.1.0/24)
labelstringNoDescriptive label (e.g. "Office network")
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "add_ip_exclusion",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "ip_address": "203.0.113.0/24",
    "label": "Office network"
  }
}
}
ResponseJSON
{
"exclusion": {
  "id": "exc_ip_1...",
  "type": "ip",
  "ip_address": "203.0.113.0/24",
  "label": "Office network",
  "created_at": "2026-03-15T10:00:00Z"
}
}

40. remove_ip_exclusion

Remove an IP address from the exclusion list. Requires read_write mode.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
exclusion_idstringYesThe exclusion UUID to remove
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "remove_ip_exclusion",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "exclusion_id": "exc_ip_1..."
  }
}
}
ResponseJSON
{
"deleted": true,
"exclusion_id": "exc_ip_1..."
}

41. add_path_exclusion

Add a URL path pattern to exclude from tracking. Pages matching the pattern will not generate analytics events. Requires read_write mode.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
path_patternstringYesURL path pattern to exclude (e.g. /admin/*, /internal/health)
match_typestringNoexact, starts_with, contains, regex (default: starts_with)
labelstringNoDescriptive label
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "add_path_exclusion",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "path_pattern": "/admin",
    "match_type": "starts_with",
    "label": "Admin panel"
  }
}
}
ResponseJSON
{
"exclusion": {
  "id": "exc_path_1...",
  "type": "path",
  "path_pattern": "/admin",
  "match_type": "starts_with",
  "label": "Admin panel",
  "created_at": "2026-03-15T10:00:00Z"
}
}

42. remove_path_exclusion

Remove a path exclusion. Requires read_write mode.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
exclusion_idstringYesThe exclusion UUID to remove
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "remove_path_exclusion",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "exclusion_id": "exc_path_1..."
  }
}
}
ResponseJSON
{
"deleted": true,
"exclusion_id": "exc_path_1..."
}

43. list_exclusions

List all IP and path exclusions for a website.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "list_exclusions",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  }
}
}
ResponseJSON
{
"ip_exclusions": [
  {
    "id": "exc_ip_1...",
    "ip_address": "203.0.113.0/24",
    "label": "Office network",
    "created_at": "2026-03-15T10:00:00Z"
  }
],
"path_exclusions": [
  {
    "id": "exc_path_1...",
    "path_pattern": "/admin",
    "match_type": "starts_with",
    "label": "Admin panel",
    "created_at": "2026-03-15T10:00:00Z"
  }
],
"total_ip": 1,
"total_path": 1
}

44. get_notification_settings

Get notification preferences for the current team.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "get_notification_settings",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  }
}
}
ResponseJSON
{
"notifications": {
  "weekly_digest_email": true,
  "anomaly_alerts": true,
  "anomaly_threshold": "warning",
  "goal_completion_alerts": false,
  "uptime_alerts": true,
  "email_recipients": ["[email protected]"]
}
}

45. update_notification_settings

Update notification preferences. Requires read_write mode.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
weekly_digest_emailbooleanNoEnable/disable weekly digest
anomaly_alertsbooleanNoEnable/disable anomaly alerts
anomaly_thresholdstringNoMinimum severity: info, warning, critical
goal_completion_alertsbooleanNoEnable/disable goal completion notifications
uptime_alertsbooleanNoEnable/disable uptime monitoring alerts
email_recipientsarrayNoList of email addresses to notify
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "update_notification_settings",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "anomaly_alerts": true,
    "anomaly_threshold": "critical",
    "goal_completion_alerts": true,
    "email_recipients": ["[email protected]", "[email protected]"]
  }
}
}
ResponseJSON
{
"notifications": {
  "weekly_digest_email": true,
  "anomaly_alerts": true,
  "anomaly_threshold": "critical",
  "goal_completion_alerts": true,
  "uptime_alerts": true,
  "email_recipients": ["[email protected]", "[email protected]"],
  "updated_at": "2026-03-15T10:00:00Z"
}
}

Team Tools

46. get_team_members

List all members of your team. Requires full_access key.

Cost: 1 query

This tool takes no parameters.

RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "get_team_members",
  "arguments": {}
}
}
ResponseJSON
{
"team": {
  "id": "team_abc123",
  "name": "Acme Corp"
},
"members": [
  {
    "id": "usr_1...",
    "email": "[email protected]",
    "name": "Jane Admin",
    "role": "owner",
    "joined_at": "2025-06-01T10:00:00Z"
  },
  {
    "id": "usr_2...",
    "email": "[email protected]",
    "name": "John Dev",
    "role": "member",
    "joined_at": "2025-08-15T14:00:00Z"
  }
],
"total": 2
}

47. invite_team_member

Invite a new member to your team by email. Requires read_write mode, full_access key, and Pro plan or higher.

Cost: 1 query

ParameterTypeRequiredDescription
emailstringYesEmail address to invite
rolestringNoRole: member (default) or admin
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "invite_team_member",
  "arguments": {
    "email": "[email protected]",
    "role": "member"
  }
}
}
ResponseJSON
{
"invitation": {
  "id": "inv_1...",
  "email": "[email protected]",
  "role": "member",
  "status": "pending",
  "invited_at": "2026-03-15T10:00:00Z",
  "expires_at": "2026-03-22T10:00:00Z"
}
}

48. remove_team_member

Remove a member from your team. Requires read_write mode and full_access key.

You cannot remove the team owner. The member will immediately lose access to all team websites.

Cost: 1 query

ParameterTypeRequiredDescription
member_idstringYesThe user ID of the member to remove
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "remove_team_member",
  "arguments": {
    "member_id": "usr_2..."
  }
}
}
ResponseJSON
{
"removed": true,
"member_id": "usr_2...",
"email": "[email protected]"
}

API Key Tools

50. list_api_keys

List all API keys for the current team. Returns key metadata (not the key values themselves).

Cost: 1 query

This tool takes no parameters.

RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "list_api_keys",
  "arguments": {}
}
}
ResponseJSON
{
"api_keys": [
  {
    "id": "key_1...",
    "name": "Production Key",
    "prefix": "zv_prod_",
    "type": "full_access",
    "mcp_enabled": true,
    "mcp_mode": "read_write",
    "created_at": "2026-01-15T10:00:00Z",
    "last_used_at": "2026-03-15T09:30:00Z"
  }
],
"total": 1
}

51. create_api_key

Create a new API key. Requires read_write mode.

Cost: 1 query

ParameterTypeRequiredDescription
namestringYesDisplay name for the key
typestringYesfull_access or site_access
website_idstringNoRequired for site_access keys
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "create_api_key",
  "arguments": {
    "name": "Staging Key",
    "type": "site_access",
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  }
}
}
ResponseJSON
{
"api_key": {
  "id": "key_2...",
  "name": "Staging Key",
  "key": "zv_stg_xxxxxxxxxxxxxxxx",
  "type": "site_access",
  "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "created_at": "2026-03-15T10:00:00Z"
},
"message": "Save this key — it will not be shown again."
}

The full API key value is only returned once at creation time. Store it securely.


52. revoke_api_key

Revoke (delete) an API key. Requires read_write mode.

Cost: 1 query

ParameterTypeRequiredDescription
key_idstringYesThe API key ID to revoke
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "revoke_api_key",
  "arguments": {
    "key_id": "key_2..."
  }
}
}
ResponseJSON
{
"revoked": true,
"key_id": "key_2...",
"name": "Staging Key"
}

53. get_api_key_details

Get detailed information about a specific API key.

Cost: 1 query

ParameterTypeRequiredDescription
key_idstringYesThe API key ID
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "get_api_key_details",
  "arguments": {
    "key_id": "key_1..."
  }
}
}
ResponseJSON
{
"api_key": {
  "id": "key_1...",
  "name": "Production Key",
  "prefix": "zv_prod_",
  "type": "full_access",
  "mcp_enabled": true,
  "mcp_mode": "read_write",
  "mcp_permissions": {
    "analytics": true,
    "advanced": true,
    "ai_insights": true,
    "management": true,
    "settings": true,
    "api_keys": false,
    "uptime": true
  },
  "created_at": "2026-01-15T10:00:00Z",
  "last_used_at": "2026-03-15T09:30:00Z",
  "total_requests": 1247
}
}

54. update_api_key_permissions

Update MCP permissions for an API key. Requires read_write mode.

Cost: 1 query

ParameterTypeRequiredDescription
key_idstringYesThe API key ID
mcp_enabledbooleanNoEnable or disable MCP access
mcp_modestringNoread_only or read_write
permissionsobjectNoFeature group toggles (e.g. {"analytics": true, "management": false})
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "update_api_key_permissions",
  "arguments": {
    "key_id": "key_1...",
    "mcp_mode": "read_write",
    "permissions": {
      "analytics": true,
      "advanced": true,
      "ai_insights": true,
      "management": true,
      "settings": false
    }
  }
}
}
ResponseJSON
{
"updated": true,
"key_id": "key_1...",
"mcp_mode": "read_write",
"mcp_permissions": {
  "analytics": true,
  "advanced": true,
  "ai_insights": true,
  "management": true,
  "settings": false
}
}

Uptime Tools

55. list_uptime_monitors

List all uptime monitors for the current team.

Cost: 1 query

This tool takes no parameters.

RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "list_uptime_monitors",
  "arguments": {}
}
}
ResponseJSON
{
"monitors": [
  {
    "id": "mon_1...",
    "url": "https://example.com",
    "name": "Production Site",
    "interval": 300,
    "status": "up",
    "uptime_30d": 99.98,
    "last_checked_at": "2026-03-15T09:55:00Z"
  }
],
"total": 1
}

56. get_uptime_status

Get current status and response time for a specific monitor.

Cost: 1 query

ParameterTypeRequiredDescription
monitor_idstringYesThe monitor UUID
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "get_uptime_status",
  "arguments": {
    "monitor_id": "mon_1..."
  }
}
}
ResponseJSON
{
"monitor": {
  "id": "mon_1...",
  "url": "https://example.com",
  "status": "up",
  "response_time_ms": 142,
  "status_code": 200,
  "uptime_24h": 100.0,
  "uptime_7d": 99.99,
  "uptime_30d": 99.98,
  "last_checked_at": "2026-03-15T09:55:00Z",
  "last_incident_at": "2026-03-10T03:22:00Z"
}
}

57. create_uptime_monitor

Create a new uptime monitor. Requires read_write mode.

Cost: 1 query

ParameterTypeRequiredDescription
urlstringYesThe URL to monitor
namestringNoDisplay name (defaults to the URL hostname)
intervalnumberNoCheck interval in seconds (default: 300)
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "create_uptime_monitor",
  "arguments": {
    "url": "https://api.example.com/health",
    "name": "API Health",
    "interval": 60
  }
}
}
ResponseJSON
{
"monitor": {
  "id": "mon_2...",
  "url": "https://api.example.com/health",
  "name": "API Health",
  "interval": 60,
  "status": "pending",
  "created_at": "2026-03-15T10:00:00Z"
}
}

58. delete_uptime_monitor

Delete an uptime monitor. Requires read_write mode.

Cost: 1 query

ParameterTypeRequiredDescription
monitor_idstringYesThe monitor UUID to delete
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "delete_uptime_monitor",
  "arguments": {
    "monitor_id": "mon_2..."
  }
}
}
ResponseJSON
{
"deleted": true,
"monitor_id": "mon_2..."
}

59. get_uptime_history

Get uptime history and incident log for a monitor.

Cost: 1 query

ParameterTypeRequiredDescription
monitor_idstringYesThe monitor UUID
time_rangestringNoTime range: 24h, 7d, 30d, 90d (default: 30d)
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "get_uptime_history",
  "arguments": {
    "monitor_id": "mon_1...",
    "time_range": "7d"
  }
}
}
ResponseJSON
{
"monitor_id": "mon_1...",
"uptime_percentage": 99.99,
"total_checks": 2016,
"failed_checks": 1,
"incidents": [
  {
    "id": "inc_1...",
    "started_at": "2026-03-10T03:22:00Z",
    "resolved_at": "2026-03-10T03:27:00Z",
    "duration_seconds": 300,
    "status_code": 503,
    "reason": "Service Unavailable"
  }
],
"avg_response_time_ms": 156
}

Website Management Tools (60-64)

60. update_website_name

Update the display name for a website. Requires read_write mode.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
namestringYesNew display name
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "update_website_name",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "name": "Production Website"
  }
}
}
ResponseJSON
{
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"name": "Production Website",
"updated_at": "2026-03-15T10:00:00Z"
}

61. update_website_timezone

Update the timezone for a website. Affects how daily analytics are aggregated. Requires read_write mode.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
timezonestringYesIANA timezone (e.g. America/New_York, Europe/London)
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "update_website_timezone",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "timezone": "Europe/London"
  }
}
}
ResponseJSON
{
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"timezone": "Europe/London",
"updated_at": "2026-03-15T10:00:00Z"
}

62. update_website_domain

Update the domain for a website. Requires read_write mode.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
domainstringYesNew domain (e.g. example.com)
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "update_website_domain",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "domain": "new.example.com"
  }
}
}
ResponseJSON
{
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"domain": "new.example.com",
"updated_at": "2026-03-15T10:00:00Z"
}

63. pause_tracking

Temporarily pause analytics tracking for a website. No new events will be recorded. Requires read_write mode.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "pause_tracking",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  }
}
}
ResponseJSON
{
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"tracking_active": false,
"paused_at": "2026-03-15T10:00:00Z"
}

64. resume_tracking

Resume analytics tracking for a paused website. Requires read_write mode.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "resume_tracking",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  }
}
}
ResponseJSON
{
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"tracking_active": true,
"resumed_at": "2026-03-15T10:00:00Z"
}

Reporting Tools (65-69)

65. schedule_report

Schedule a recurring analytics report to be sent via email. Requires read_write mode.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
frequencystringYesdaily, weekly, or monthly
recipientsarrayYesList of email addresses
metricsarrayNoSpecific metrics to include (default: all)
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "schedule_report",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "frequency": "weekly",
    "recipients": ["[email protected]", "[email protected]"]
  }
}
}
ResponseJSON
{
"report": {
  "id": "rpt_1...",
  "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "frequency": "weekly",
  "recipients": ["[email protected]", "[email protected]"],
  "next_send_at": "2026-03-22T08:00:00Z",
  "created_at": "2026-03-15T10:00:00Z"
}
}

66. get_report_schedule

Get scheduled report configuration for a website.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "get_report_schedule",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  }
}
}
ResponseJSON
{
"reports": [
  {
    "id": "rpt_1...",
    "frequency": "weekly",
    "recipients": ["[email protected]", "[email protected]"],
    "next_send_at": "2026-03-22T08:00:00Z",
    "last_sent_at": "2026-03-15T08:00:00Z"
  }
],
"total": 1
}

67. cancel_report

Cancel a scheduled report. Requires read_write mode.

Cost: 1 query

ParameterTypeRequiredDescription
report_idstringYesThe report schedule ID to cancel
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "cancel_report",
  "arguments": {
    "report_id": "rpt_1..."
  }
}
}
ResponseJSON
{
"cancelled": true,
"report_id": "rpt_1..."
}

68. get_export_history

Get the history of data exports for a website.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
limitnumberNoMax results (default: 20)
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "get_export_history",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "limit": 5
  }
}
}
ResponseJSON
{
"exports": [
  {
    "id": "exp_1...",
    "format": "csv",
    "time_range": "30d",
    "status": "completed",
    "file_size_bytes": 245760,
    "created_at": "2026-03-14T15:00:00Z"
  }
],
"total": 1
}

69. get_data_retention

Get the data retention policy for a website based on the current plan.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "get_data_retention",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  }
}
}
ResponseJSON
{
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"plan": "pro",
"analytics_retention_days": 730,
"heatmap_retention_days": 60,
"session_replay_retention_days": 60,
"oldest_data_at": "2024-03-15T00:00:00Z"
}

Revenue & Data Tools (70-75)

70. set_revenue_currency

Set the default revenue display currency for a website. Uses ISO 4217 currency codes. Requires read_write mode.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
currencystringYesISO 4217 currency code (e.g. USD, EUR, GBP, CHF, JPY)
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "set_revenue_currency",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "currency": "EUR"
  }
}
}
ResponseJSON
{
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"currency": "EUR",
"message": "Revenue currency set to EUR"
}

71. get_revenue_settings

Get revenue-related settings for a website, including the configured currency and any field mappings.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "get_revenue_settings",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  }
}
}
ResponseJSON
{
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"currency": "EUR",
"revenue_field_mappings": null
}

72. add_allowed_domain

Add a domain to the CORS whitelist. Only whitelisted domains can send tracking data to this website. Requires read_write mode.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
domainstringYesDomain to whitelist (e.g. example.com, staging.example.com)
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "add_allowed_domain",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "domain": "staging.example.com"
  }
}
}
ResponseJSON
{
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"domain": "staging.example.com",
"allowed_domains": ["example.com", "staging.example.com"],
"total": 2
}

73. remove_allowed_domain

Remove a domain from the CORS whitelist. Requires read_write mode.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
domainstringYesDomain to remove from the whitelist
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "remove_allowed_domain",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "domain": "staging.example.com"
  }
}
}
ResponseJSON
{
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"removed": "staging.example.com",
"allowed_domains": ["example.com"],
"total": 1
}

74. list_allowed_domains

List all domains in the CORS whitelist for a website.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "list_allowed_domains",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  }
}
}
ResponseJSON
{
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"allowed_domains": ["example.com", "staging.example.com"],
"total": 2
}

75. request_data_deletion

Delete all data for a specific visitor from a website. Used for GDPR compliance (right to erasure). This action is irreversible. Requires read_write mode.

Cost: 1 query

ParameterTypeRequiredDescription
website_idstringYesThe website UUID
visitor_idstringYesThe visitor UUID whose data should be deleted
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "request_data_deletion",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "visitor_id": "vis_abc123..."
  }
}
}
ResponseJSON
{
"message": "Visitor data deleted successfully",
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"visitor_id": "vis_abc123...",
"records_deleted": 47,
"deleted_at": "2026-03-15T10:00:00Z"
}

This permanently deletes all visitor data including page views, sessions, and events. This cannot be undone.


Multi-Step Workflow Examples

These examples show complete request/response chains for common tasks. Each step uses the JSON-RPC format above.

Weekly Traffic Report

A typical reporting workflow: discover websites, then pull visitor stats, top pages, and traffic sources.

Step 1 — Discover your websites:

RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "list_websites",
  "arguments": {}
}
}
Response (extract website_id)JSON
{
"jsonrpc": "2.0",
"id": 1,
"result": {
  "content": [{
    "type": "text",
    "text": "[{"id": "ws_abc123", "domain": "zenovay.com", "name": "Zenovay"}]"
  }]
}
}

Step 2 — Get visitor overview:

RequestJSON
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
  "name": "get_visitors",
  "arguments": {
    "website_id": "ws_abc123",
    "time_range": "7d"
  }
}
}

Step 3 — Get top pages:

RequestJSON
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
  "name": "get_top_pages",
  "arguments": {
    "website_id": "ws_abc123",
    "time_range": "7d",
    "limit": 10
  }
}
}

Step 4 — Get traffic sources:

RequestJSON
{
"jsonrpc": "2.0",
"id": 4,
"method": "tools/call",
"params": {
  "name": "get_traffic_sources",
  "arguments": {
    "website_id": "ws_abc123",
    "time_range": "7d"
  }
}
}

Total cost: 4 queries (1 + 1 + 1 + 1)


Performance Audit

Identify performance issues, errors, and get AI recommendations.

Step 1 — List websites (same as above, get website_id)

Step 2 — Check Core Web Vitals:

RequestJSON
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
  "name": "get_performance_metrics",
  "arguments": {
    "website_id": "ws_abc123",
    "time_range": "7d"
  }
}
}

Step 3 — Check for errors:

RequestJSON
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
  "name": "get_errors",
  "arguments": {
    "website_id": "ws_abc123",
    "time_range": "7d",
    "limit": 20
  }
}
}

Step 4 — Get AI recommendations:

RequestJSON
{
"jsonrpc": "2.0",
"id": 4,
"method": "tools/call",
"params": {
  "name": "get_recommendations",
  "arguments": {
    "website_id": "ws_abc123"
  }
}
}

Total cost: 4 queries (1 + 1 + 1 + 1)


Quick Health Check

Fast check of remaining quota and current live visitors — ideal at the start of a session.

Step 1 — Check remaining quota:

RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "get_api_usage",
  "arguments": {}
}
}

Step 2 — Check real-time visitors:

RequestJSON
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
  "name": "get_realtime_visitors",
  "arguments": {
    "website_id": "ws_abc123"
  }
}
}

Total cost: 2 queries (1 + 1)


Week-over-Week Comparison

Compare this week's metrics against last week to identify trends.

Step 1 — List websites (get website_id)

Step 2 — Compare periods:

RequestJSON
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
  "name": "compare_periods",
  "arguments": {
    "website_id": "ws_abc123",
    "current_period": "7d",
    "previous_period": "7d"
  }
}
}

Step 3 — Detect anomalies:

RequestJSON
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
  "name": "get_anomalies",
  "arguments": {
    "website_id": "ws_abc123",
    "time_range": "7d"
  }
}
}

Total cost: 3 queries (1 + 1 + 1)


Website Setup & Configuration

Set up a new website with exclusions and cookieless tracking.

Step 1 — Create the website:

RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "create_website",
  "arguments": {
    "domain": "docs.example.com",
    "name": "Documentation"
  }
}
}

Step 2 — Enable cookieless tracking:

RequestJSON
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
  "name": "toggle_cookieless_tracking",
  "arguments": {
    "website_id": "NEW_WEBSITE_ID",
    "enabled": true
  }
}
}

Step 3 — Exclude office IP:

RequestJSON
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
  "name": "add_ip_exclusion",
  "arguments": {
    "website_id": "NEW_WEBSITE_ID",
    "ip_address": "203.0.113.0/24",
    "label": "Office network"
  }
}
}

Step 4 — Get tracking code to install:

RequestJSON
{
"jsonrpc": "2.0",
"id": 4,
"method": "tools/call",
"params": {
  "name": "get_tracking_code",
  "arguments": {
    "website_id": "NEW_WEBSITE_ID"
  }
}
}

Total cost: 4 queries (1 + 1 + 1 + 1)


New Tools

76. get_retention_data

Get retention cohort analysis showing how well your website retains visitors over time. Returns cohort data grouped by the visitor's first-visit period.

Cost: 1 query | Requires: Pro+ (retentionAnalysis feature flag)

ParameterTypeRequiredDefaultDescription
website_idstringYesThe website UUID
time_rangestringNo30dTime range: 7d, 30d, 90d, 1y
cohort_sizestringNoweekCohort grouping: day, week, month
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "get_retention_data",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "time_range": "30d",
    "cohort_size": "week"
  }
}
}
ResponseJSON
{
"cohorts": [
  {
    "period": "2026-02-17",
    "visitors": 320,
    "retention": [100, 42.5, 28.1, 18.4]
  },
  {
    "period": "2026-02-24",
    "visitors": 285,
    "retention": [100, 38.9, 25.3]
  },
  {
    "period": "2026-03-03",
    "visitors": 310,
    "retention": [100, 41.0]
  },
  {
    "period": "2026-03-10",
    "visitors": 295,
    "retention": [100]
  }
],
"cohort_size": "week",
"time_range": "30d",
"summary": {
  "avg_week1_retention": 40.8,
  "avg_week2_retention": 26.7,
  "total_cohort_visitors": 1210
}
}

77. get_user_profiles

Get visitor profiles with session history and behavioral data. Returns individual visitor records with their visit history, pages viewed, and engagement metrics.

Cost: 1 query

ParameterTypeRequiredDefaultDescription
website_idstringYesThe website UUID
limitnumberNo20Profiles to return (1-50)
country_codestringNoFilter by ISO country code (e.g. US, DE)
min_sessionsnumberNoMinimum number of sessions
time_rangestringNo30dTime range: 7d, 30d, 90d, 1y
RequestJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "get_user_profiles",
  "arguments": {
    "website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "min_sessions": 3,
    "limit": 10
  }
}
}
ResponseJSON
{
"profiles": [
  {
    "visitor_id": "v_abc123",
    "first_seen": "2026-02-15T09:30:00Z",
    "last_seen": "2026-03-14T16:45:00Z",
    "total_sessions": 8,
    "total_pageviews": 34,
    "avg_session_duration_ms": 185000,
    "country": "US",
    "city": "San Francisco",
    "device_type": "desktop",
    "browser": "Chrome",
    "os": "macOS",
    "top_pages": ["/", "/pricing", "/docs"],
    "referrer": "google.com"
  }
],
"total": 156
}

JSON-RPC Protocol Reference

All MCP requests use the JSON-RPC 2.0 format:

Request envelopeJSON
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
  "name": "tool_name",
  "arguments": { ... }
}
}

Available methods:

MethodDescription
initializeHandshake — returns server info and capabilities
tools/listList all available tools with schemas
tools/callExecute a tool
pingHealth check

Error response format:

Error responseJSON
{
"jsonrpc": "2.0",
"id": 1,
"error": {
  "code": -32003,
  "message": "Daily query limit exceeded. Upgrade at https://app.zenovay.com/settings"
}
}

See Permissions & Limits for the full error code reference.

Was this page helpful?