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:
{
"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:
| # | Tool | Category | Cost | Description |
|---|---|---|---|---|
| 1 | query_analytics | analytics | 3 | Natural language analytics query |
| 2 | get_visitors | analytics | 1 | Visitor stats with optional period comparison |
| 3 | get_top_pages | analytics | 1 | Most visited pages ranked by visitor count |
| 4 | get_traffic_sources | analytics | 1 | Traffic sources / referrers breakdown |
| 5 | get_geographic_data | analytics | 1 | Country + optional city breakdown |
| 6 | get_technology_breakdown | analytics | 1 | Devices, browsers, operating systems |
| 7 | get_realtime_visitors | analytics | 1 | Currently active visitors (last 5 min) |
| 8 | compare_periods | analytics | 1 | Compare metrics between two time periods |
| 9 | get_funnel_analysis | advanced | 1 | Funnel step-by-step conversion data |
| 10 | get_goals | advanced | 1 | Active goals with completion rates |
| 11 | get_session_replays | advanced | 1 | Session replay recordings list (Pro+) |
| 12 | get_heatmap_data | advanced | 1 | Heatmap interaction data per page (Pro+) |
| 13 | get_errors | advanced | 1 | JavaScript error tracking |
| 14 | get_b2b_companies | advanced | 1 | B2B company identification via reverse IP |
| 15 | get_revenue | advanced | 1 | Revenue totals + breakdowns (Pro+) |
| 16 | get_performance_metrics | advanced | 1 | Core Web Vitals (LCP, CLS, INP, FCP, TTFB) |
| 17 | get_insights | ai_insights | 1 | AI-generated actionable insights |
| 18 | get_anomalies | ai_insights | 1 | Detected metric anomalies |
| 19 | get_weekly_digest | ai_insights | 1 | Weekly performance digest (this vs last week) |
| 20 | get_recommendations | ai_insights | 1 | AI-powered optimization recommendations |
| 21 | list_websites | management | 1 | List accessible websites (call first!) |
| 22 | create_goal | management | 1 | Create custom goal (requires read_write) |
| 23 | manage_funnel | management | 1 | Create/update funnel (requires read_write) |
| 24 | export_data | management | 1 | Export analytics in JSON or CSV (Scale+) |
| 25 | get_api_usage | management | 1 | Check remaining daily quota |
| 26 | get_website_settings | management | 1 | Get website configuration and settings |
| 27 | update_website_settings | management | 1 | Update website settings (requires read_write) |
| 28 | toggle_public_dashboard | management | 1 | Enable/disable public dashboard (requires read_write) |
| 29 | toggle_cookieless_tracking | management | 1 | Enable/disable cookieless mode (requires read_write, Pro+) |
| 30 | get_tracking_code | management | 1 | Get the tracking code snippet for a website |
| 31 | regenerate_tracking_code | management | 1 | Generate a new tracking code (requires read_write) |
| 32 | list_goals | management | 1 | List all goals for a website |
| 33 | update_goal | management | 1 | Update an existing goal (requires read_write) |
| 34 | delete_goal | management | 1 | Delete a goal (requires read_write) |
| 35 | toggle_goal | management | 1 | Enable or disable a goal (requires read_write) |
| 36 | list_funnels | management | 1 | List all funnels for a website |
| 37 | delete_funnel | management | 1 | Delete a funnel (requires read_write) |
| 38 | delete_website | management | 1 | Permanently delete a website (requires read_write, full_access) |
| 39 | add_ip_exclusion | settings | 1 | Add IP to exclusion list (requires read_write) |
| 40 | remove_ip_exclusion | settings | 1 | Remove IP from exclusion list (requires read_write) |
| 41 | add_path_exclusion | settings | 1 | Add path pattern to exclusions (requires read_write) |
| 42 | remove_path_exclusion | settings | 1 | Remove path from exclusions (requires read_write) |
| 43 | list_exclusions | settings | 1 | List all IP and path exclusions |
| 44 | get_notification_settings | settings | 1 | Get notification preferences |
| 45 | update_notification_settings | settings | 1 | Update notification preferences (requires read_write) |
| 46 | get_team_members | team | 1 | List team members (requires full_access) |
| 47 | invite_team_member | team | 1 | Invite a new team member (requires read_write, full_access, Pro+) |
| 48 | remove_team_member | team | 1 | Remove a team member (requires read_write, full_access) |
| 49 | create_website | management | 1 | Create a new website (requires read_write, full_access) |
| 50 | list_api_keys | api_keys | 1 | List all API keys for the team |
| 51 | create_api_key | api_keys | 1 | Create a new API key (requires read_write) |
| 52 | revoke_api_key | api_keys | 1 | Revoke an API key (requires read_write) |
| 53 | get_api_key_details | api_keys | 1 | Get details for a specific API key |
| 54 | update_api_key_permissions | api_keys | 1 | Update API key permissions (requires read_write) |
| 55 | list_uptime_monitors | uptime | 1 | List all uptime monitors |
| 56 | get_uptime_status | uptime | 1 | Get current status for a monitor |
| 57 | create_uptime_monitor | uptime | 1 | Create a new uptime monitor (requires read_write) |
| 58 | delete_uptime_monitor | uptime | 1 | Delete an uptime monitor (requires read_write) |
| 59 | get_uptime_history | uptime | 1 | Get uptime history and incident log |
| 60 | update_website_name | management | 1 | Update website display name (requires read_write) |
| 61 | update_website_timezone | management | 1 | Update website timezone (requires read_write) |
| 62 | update_website_domain | management | 1 | Update website domain (requires read_write) |
| 63 | pause_tracking | management | 1 | Pause analytics tracking (requires read_write) |
| 64 | resume_tracking | management | 1 | Resume analytics tracking (requires read_write) |
| 65 | schedule_report | management | 1 | Schedule a recurring analytics report (requires read_write) |
| 66 | get_report_schedule | management | 1 | Get scheduled report configuration |
| 67 | cancel_report | management | 1 | Cancel a scheduled report (requires read_write) |
| 68 | get_export_history | management | 1 | Get data export history |
| 69 | get_data_retention | management | 1 | Get data retention policy for the website |
| 70 | set_revenue_currency | settings | 1 | Set revenue currency (requires read_write) |
| 71 | get_revenue_settings | settings | 1 | Get revenue settings (currency, field mappings) |
| 72 | add_allowed_domain | settings | 1 | Add domain to CORS whitelist (requires read_write) |
| 73 | remove_allowed_domain | settings | 1 | Remove domain from CORS whitelist (requires read_write) |
| 74 | list_allowed_domains | settings | 1 | List CORS whitelisted domains |
| 75 | request_data_deletion | settings | 1 | Delete visitor data for GDPR (requires read_write) |
| 76 | get_retention_data | advanced | 1 | Retention cohort analysis (Pro+) |
| 77 | get_user_profiles | analytics | 1 | Visitor 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:
list_websites— find your website IDsget_visitors— get traffic overviewget_top_pages— see which pages perform bestget_traffic_sources— understand where traffic comes from
Performance audit:
list_websites— get website IDget_performance_metrics— check Core Web Vitalsget_errors— find JavaScript errorsget_insights— see AI-generated recommendations
Weekly review:
get_weekly_digest— automated week-over-week comparisonget_anomalies— check for unusual patternscompare_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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The UUID of the website |
question | string | Yes | Natural language question (max 500 characters) |
{
"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?"
}
}
}{
"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
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The UUID of the website |
time_range | string | No | 7d | Time range: 24h, 7d, 30d, 90d, 1y |
compare_with_previous | boolean | No | false | Include comparison with previous period |
{
"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
}
}
}{
"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
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The UUID of the website |
time_range | string | No | 7d | Time range: 24h, 7d, 30d, 90d, 1y |
limit | number | No | 20 | Max pages to return (1-100) |
{
"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
}
}
}{
"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
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The UUID of the website |
time_range | string | No | 7d | Time range: 24h, 7d, 30d, 90d, 1y |
limit | number | No | 20 | Max sources to return (1-100) |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_traffic_sources",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"time_range": "30d"
}
}
}{
"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
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The UUID of the website |
time_range | string | No | 7d | Time range: 24h, 7d, 30d, 90d, 1y |
limit | number | No | 20 | Max entries (1-100) |
include_cities | boolean | No | false | Include city-level breakdown per country |
{
"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
}
}
}{
"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
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The UUID of the website |
time_range | string | No | 7d | Time range: 24h, 7d, 30d, 90d, 1y |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_technology_breakdown",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The UUID of the website |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_realtime_visitors",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"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
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The UUID of the website |
current_period | string | No | 7d | Current period: 24h, 7d, 30d, 90d |
comparison_period | string | No | previous | Comparison: previous, same_period_last_month, same_period_last_year |
{
"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"
}
}
}{
"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
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The website UUID |
funnel_id | string | No | — | Funnel UUID for detailed step analysis |
time_range | string | No | 30d | Time range: 24h, 7d, 30d, 90d, 1y |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_funnel_analysis",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"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" }
]
}{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "get_funnel_analysis",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"funnel_id": "f1a2b3c4-..."
}
}
}{
"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
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The website UUID |
time_range | string | No | 30d | Time range: 24h, 7d, 30d, 90d, 1y |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_goals",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"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)
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The website UUID |
limit | number | No | 20 | Sessions to return (1-50) |
device_type | string | No | — | Filter: desktop, mobile, tablet |
country_code | string | No | — | ISO country code (e.g. US, DE) |
{
"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
}
}
}{
"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)
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The website UUID |
page_url | string | No | — | Filter to a specific page URL |
limit | number | No | 20 | Pages to return (1-50) |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_heatmap_data",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"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
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The website UUID |
status | string | No | open | Filter: open, resolved, ignored |
limit | number | No | 50 | Errors to return (1-100) |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_errors",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "open"
}
}
}{
"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
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The website UUID |
limit | number | No | 20 | Companies to return (1-100) |
sort_by | string | No | last_seen | Sort: visits, last_seen, confidence |
industry | string | No | — | Filter by industry (e.g. Technology) |
min_visits | number | No | 1 | Minimum visit count |
{
"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
}
}
}{
"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)
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The website UUID |
time_range | string | No | 30d | Time range: 24h, 7d, 30d, 90d, 1y |
group_by | string | No | day | Grouping: day, week, month, source |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_revenue",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"group_by": "source"
}
}
}{
"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
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The website UUID |
time_range | string | No | 7d | Time range: 24h, 7d, 30d, 90d, 1y |
page_url | string | No | — | Filter to a specific page |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_performance_metrics",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"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:
| Metric | Good | Needs Improvement | Poor |
|---|---|---|---|
| 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
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The website UUID |
severity | string | No | — | Filter: critical, warning, info |
status | string | No | active | Filter: active, acknowledged, resolved |
limit | number | No | 10 | Max insights (1-50) |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_insights",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"severity": "critical"
}
}
}{
"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
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The website UUID |
severity | string | No | — | Filter: critical, warning, info |
metric | string | No | — | Filter by metric (e.g. visitors, bounce_rate) |
limit | number | No | 10 | Max anomalies (1-50) |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_anomalies",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_weekly_digest",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"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
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The website UUID |
category | string | No | — | Filter: performance, engagement, conversion, seo |
limit | number | No | 5 | Max recommendations (1-20) |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_recommendations",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"category": "performance"
}
}
}{
"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.
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_websites",
"arguments": {}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
name | string | Yes | Goal name (max 100 chars) |
goal_type | string | Yes | url_match, element_click, or custom_event |
url_pattern | string | For url_match | URL pattern to match |
url_match_type | string | No | exact, contains, starts_with, ends_with, regex (default: contains) |
css_selector | string | For element_click | CSS selector of the element |
event_name | string | For custom_event | Custom event name to track |
{
"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"
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
name | string | Yes | Funnel name |
steps | array | Yes | 2-10 ordered steps (see below) |
funnel_id | string | No | Existing funnel UUID to update |
Step object:
| Field | Type | Required | Description |
|---|---|---|---|
step_name | string | Yes | Display name |
step_type | string | Yes | url_match, element_click, custom_event |
url_pattern | string | No | URL pattern (for url_match) |
url_match_type | string | No | exact, contains, starts_with, ends_with, regex |
{
"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" }
]
}
}
}{
"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)
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The website UUID |
format | string | No | json | Output format: csv, json |
metrics | array | No | ["visitors","pageviews","unique_visitors"] | Metrics to include |
time_range | string | No | 30d | Time range: 7d, 30d, 90d, 1y |
Available metrics: visitors, pageviews, unique_visitors, bounce_rate, avg_session_duration
{
"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"
}
}
}{
"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.
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_api_usage",
"arguments": {}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_website_settings",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
name | string | No | Website display name |
timezone | string | No | IANA timezone (e.g. America/New_York) |
allowed_domains | array | No | List of allowed domains for the tracking script |
{
"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"]
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
enabled | boolean | Yes | true to enable, false to disable |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "toggle_public_dashboard",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"enabled": true
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
enabled | boolean | Yes | true to enable, false to disable |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "toggle_cookieless_tracking",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"enabled": true
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_tracking_code",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "regenerate_tracking_code",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"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
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The website UUID |
include_inactive | boolean | No | false | Include disabled goals |
time_range | string | No | 30d | Time range for conversion stats: 7d, 30d, 90d, 1y |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_goals",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"include_inactive": true
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
goal_id | string | Yes | The goal UUID |
name | string | No | Updated goal name |
url_pattern | string | No | Updated URL pattern |
url_match_type | string | No | exact, contains, starts_with, ends_with, regex |
css_selector | string | No | Updated CSS selector |
event_name | string | No | Updated event name |
{
"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"
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
goal_id | string | Yes | The goal UUID to delete |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "delete_goal",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"goal_id": "g5d6e7f8-..."
}
}
}{
"deleted": true,
"goal_id": "g5d6e7f8-..."
}35. toggle_goal
Enable or disable a goal without deleting it. Requires read_write mode.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
goal_id | string | Yes | The goal UUID |
is_active | boolean | Yes | true to enable, false to disable |
{
"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
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_funnels",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
funnel_id | string | Yes | The funnel UUID to delete |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "delete_funnel",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"funnel_id": "f5d6e7f8-..."
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID to delete |
confirm | boolean | Yes | Must be true to confirm deletion |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "delete_website",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"confirm": true
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | The website domain (e.g. docs.example.com) |
name | string | No | Display name (defaults to the domain) |
timezone | string | No | IANA timezone (default: UTC) |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "create_website",
"arguments": {
"domain": "docs.example.com",
"name": "Documentation Site",
"timezone": "America/New_York"
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
ip_address | string | Yes | IP address or CIDR range (e.g. 192.168.1.0/24) |
label | string | No | Descriptive label (e.g. "Office network") |
{
"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"
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
exclusion_id | string | Yes | The exclusion UUID to remove |
{
"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..."
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
path_pattern | string | Yes | URL path pattern to exclude (e.g. /admin/*, /internal/health) |
match_type | string | No | exact, starts_with, contains, regex (default: starts_with) |
label | string | No | Descriptive label |
{
"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"
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
exclusion_id | string | Yes | The exclusion UUID to remove |
{
"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..."
}
}
}{
"deleted": true,
"exclusion_id": "exc_path_1..."
}43. list_exclusions
List all IP and path exclusions for a website.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_exclusions",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_notification_settings",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
weekly_digest_email | boolean | No | Enable/disable weekly digest |
anomaly_alerts | boolean | No | Enable/disable anomaly alerts |
anomaly_threshold | string | No | Minimum severity: info, warning, critical |
goal_completion_alerts | boolean | No | Enable/disable goal completion notifications |
uptime_alerts | boolean | No | Enable/disable uptime monitoring alerts |
email_recipients | array | No | List of email addresses to notify |
{
"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]"]
}
}
}{
"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.
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_team_members",
"arguments": {}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
email | string | Yes | Email address to invite |
role | string | No | Role: member (default) or admin |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "invite_team_member",
"arguments": {
"email": "[email protected]",
"role": "member"
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
member_id | string | Yes | The user ID of the member to remove |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "remove_team_member",
"arguments": {
"member_id": "usr_2..."
}
}
}{
"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.
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_api_keys",
"arguments": {}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Display name for the key |
type | string | Yes | full_access or site_access |
website_id | string | No | Required for site_access keys |
{
"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"
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
key_id | string | Yes | The API key ID to revoke |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "revoke_api_key",
"arguments": {
"key_id": "key_2..."
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
key_id | string | Yes | The API key ID |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_api_key_details",
"arguments": {
"key_id": "key_1..."
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
key_id | string | Yes | The API key ID |
mcp_enabled | boolean | No | Enable or disable MCP access |
mcp_mode | string | No | read_only or read_write |
permissions | object | No | Feature group toggles (e.g. {"analytics": true, "management": false}) |
{
"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
}
}
}
}{
"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.
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_uptime_monitors",
"arguments": {}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
monitor_id | string | Yes | The monitor UUID |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_uptime_status",
"arguments": {
"monitor_id": "mon_1..."
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
url | string | Yes | The URL to monitor |
name | string | No | Display name (defaults to the URL hostname) |
interval | number | No | Check interval in seconds (default: 300) |
{
"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
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
monitor_id | string | Yes | The monitor UUID to delete |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "delete_uptime_monitor",
"arguments": {
"monitor_id": "mon_2..."
}
}
}{
"deleted": true,
"monitor_id": "mon_2..."
}59. get_uptime_history
Get uptime history and incident log for a monitor.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
monitor_id | string | Yes | The monitor UUID |
time_range | string | No | Time range: 24h, 7d, 30d, 90d (default: 30d) |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_uptime_history",
"arguments": {
"monitor_id": "mon_1...",
"time_range": "7d"
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
name | string | Yes | New display name |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "update_website_name",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"name": "Production Website"
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
timezone | string | Yes | IANA timezone (e.g. America/New_York, Europe/London) |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "update_website_timezone",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"timezone": "Europe/London"
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
domain | string | Yes | New domain (e.g. example.com) |
{
"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"
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "pause_tracking",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "resume_tracking",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
frequency | string | Yes | daily, weekly, or monthly |
recipients | array | Yes | List of email addresses |
metrics | array | No | Specific metrics to include (default: all) |
{
"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]"]
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_report_schedule",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
report_id | string | Yes | The report schedule ID to cancel |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "cancel_report",
"arguments": {
"report_id": "rpt_1..."
}
}
}{
"cancelled": true,
"report_id": "rpt_1..."
}68. get_export_history
Get the history of data exports for a website.
Cost: 1 query
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
limit | number | No | Max results (default: 20) |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_export_history",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"limit": 5
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_data_retention",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
currency | string | Yes | ISO 4217 currency code (e.g. USD, EUR, GBP, CHF, JPY) |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "set_revenue_currency",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"currency": "EUR"
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_revenue_settings",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
domain | string | Yes | Domain to whitelist (e.g. example.com, staging.example.com) |
{
"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"
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
domain | string | Yes | Domain to remove from the whitelist |
{
"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"
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_allowed_domains",
"arguments": {
"website_id": "2ea8af07-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
website_id | string | Yes | The website UUID |
visitor_id | string | Yes | The visitor UUID whose data should be deleted |
{
"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..."
}
}
}{
"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:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_websites",
"arguments": {}
}
}{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [{
"type": "text",
"text": "[{"id": "ws_abc123", "domain": "zenovay.com", "name": "Zenovay"}]"
}]
}
}Step 2 — Get visitor overview:
{
"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:
{
"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:
{
"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:
{
"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:
{
"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:
{
"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:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_api_usage",
"arguments": {}
}
}Step 2 — Check real-time visitors:
{
"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:
{
"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:
{
"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:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "create_website",
"arguments": {
"domain": "docs.example.com",
"name": "Documentation"
}
}
}Step 2 — Enable cookieless tracking:
{
"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:
{
"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:
{
"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)
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The website UUID |
time_range | string | No | 30d | Time range: 7d, 30d, 90d, 1y |
cohort_size | string | No | week | Cohort grouping: day, week, month |
{
"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"
}
}
}{
"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
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
website_id | string | Yes | — | The website UUID |
limit | number | No | 20 | Profiles to return (1-50) |
country_code | string | No | — | Filter by ISO country code (e.g. US, DE) |
min_sessions | number | No | — | Minimum number of sessions |
time_range | string | No | 30d | Time range: 7d, 30d, 90d, 1y |
{
"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
}
}
}{
"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:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "tool_name",
"arguments": { ... }
}
}Available methods:
| Method | Description |
|---|---|
initialize | Handshake — returns server info and capabilities |
tools/list | List all available tools with schemas |
tools/call | Execute a tool |
ping | Health check |
Error response format:
{
"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.