Plausible MCP by usefulapi

Query site stats, realtime visitors, breakdowns and goals from Plausible Analytics.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
97%
Naming quality
80%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~2,865Tokens (tool definitions)
~3.3 KBTypical response size
Significant attention impact (2.24% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "plausible-analytics": {
      "url": "https://plausible-analytics.usefulapi.io/mcp"
    }
  }
}

Remote endpoints

https://plausible-analytics.usefulapi.io/mcpstreamable-http

What it can do

Tool inventory

Tools (8)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢plausible_query_stats(site_id, metrics, date_range, dimensions, filters, ...)

The full-power Stats API query. Compute metrics over a date range, optionally grouped by dimensions and narrowed by filters, with ordering, includes, and pagination. Plausible: POST /api/v2/query.

Input Schema

{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "The site's domain as registered in Plausible, e.g. \"example.com\"."
    },
    "metrics": {
      "minItems": 1,
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "visitors",
          "visits",
          "pageviews",
          "views_per_visit",
          "bounce_rate",
          "visit_duration",
          "events",
          "scroll_depth",
          "percentage",
          "conversion_rate",
          "group_conversion_rate",
          "average_revenue",
          "total_revenue",
          "time_on_page"
        ]
      },
      "description": "Metrics to compute. Any of: visitors, visits, pageviews, views_per_visit, bounce_rate, visit_duration, events, scroll_depth, percentage, conversion_rate, group_conversion_rate, average_revenue, total_revenue, time_on_page."
    },
    "date_range": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      ],
      "description": "Date range: a shortcut string (\"day\", \"7d\", \"28d\", \"30d\", \"91d\", \"month\", \"6mo\", \"12mo\", \"year\", \"all\", \"24h\") OR a 2-element ISO8601 array like [\"2024-01-01\",\"2024-07-01\"] (dates or datetimes with tz)."
    },
    "dimensions": {
      "description": "Group-by dimensions. Event dims (event:goal, event:page, event:hostname), visit dims (visit:source, visit:referrer, visit:utm_medium/source/campaign, visit:device, visit:browser, visit:os, visit:country/region/city[_name], visit:entry_page, visit:exit_page), time dims (time, time:hour, time:day, time:week, time:month), or custom props (event:props:<name>). Omit for totals.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "filters": {
      "description": "Optional filters. Each is an array like [\"is\",\"visit:country_name\",[\"Estonia\"]] or [\"contains\",\"event:page\",[\"/blog\"]] with logical wrappers [\"and\",[...]] / [\"or\",[...]] / [\"not\",[...]]. Operators: is, is_not, contains, contains_not, matches, matches_not, has_done, has_not_done.",
      "type": "array",
      "items": {
        "type": "array",
        "items": {}
      }
    },
    "order_by": {
      "description": "Optional ordering: an array of [metric_or_dimension, \"asc\"|\"desc\"] pairs, e.g. [[\"visitors\",\"desc\"]].",
      "type": "array",
      "items": {
        "type": "array",
        "items": {}
      }
    },
    "include": {
      "description": "Optional include flags: { imports?, time_labels?, total_rows? }.",
      "type": "object",
      "properties": {
        "imports": {
          "description": "Include imported (pre-Plausible) stats.",
          "type": "boolean"
        },
        "time_labels": {
          "description": "Include a full list of time labels for the range.",
          "type": "boolean"
        },
        "total_rows": {
          "description": "Include the total number of rows in meta.",
          "type": "boolean"
        }
      }
    },
    "pagination": {
      "description": "Optional pagination: { limit?, offset? }.",
      "type": "object",
      "properties": {
        "limit": {
          "description": "Rows per page (default 10000).",
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "offset": {
          "description": "Row offset (default 0).",
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        }
      }
    }
  },
  "required": [
    "site_id",
    "metrics",
    "date_range"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢plausible_aggregate(site_id, metrics, date_range, filters)

Convenience: aggregate totals for the given metrics over a date range (no group-by). Plausible: POST /api/v2/query with no dimensions.

Input Schema

{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "The site's domain as registered in Plausible, e.g. \"example.com\"."
    },
    "metrics": {
      "minItems": 1,
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "visitors",
          "visits",
          "pageviews",
          "views_per_visit",
          "bounce_rate",
          "visit_duration",
          "events",
          "scroll_depth",
          "percentage",
          "conversion_rate",
          "group_conversion_rate",
          "average_revenue",
          "total_revenue",
          "time_on_page"
        ]
      },
      "description": "Metrics to compute. Any of: visitors, visits, pageviews, views_per_visit, bounce_rate, visit_duration, events, scroll_depth, percentage, conversion_rate, group_conversion_rate, average_revenue, total_revenue, time_on_page."
    },
    "date_range": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      ],
      "description": "Date range: a shortcut string (\"day\", \"7d\", \"28d\", \"30d\", \"91d\", \"month\", \"6mo\", \"12mo\", \"year\", \"all\", \"24h\") OR a 2-element ISO8601 array like [\"2024-01-01\",\"2024-07-01\"] (dates or datetimes with tz)."
    },
    "filters": {
      "description": "Optional filters. Each is an array like [\"is\",\"visit:country_name\",[\"Estonia\"]] or [\"contains\",\"event:page\",[\"/blog\"]] with logical wrappers [\"and\",[...]] / [\"or\",[...]] / [\"not\",[...]]. Operators: is, is_not, contains, contains_not, matches, matches_not, has_done, has_not_done.",
      "type": "array",
      "items": {
        "type": "array",
        "items": {}
      }
    }
  },
  "required": [
    "site_id",
    "metrics",
    "date_range"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢plausible_timeseries(site_id, metrics, date_range, interval, filters)

Convenience: metrics over time, grouped by a time interval. Plausible: POST /api/v2/query with dimensions=[interval].

Input Schema

{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "The site's domain as registered in Plausible, e.g. \"example.com\"."
    },
    "metrics": {
      "minItems": 1,
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "visitors",
          "visits",
          "pageviews",
          "views_per_visit",
          "bounce_rate",
          "visit_duration",
          "events",
          "scroll_depth",
          "percentage",
          "conversion_rate",
          "group_conversion_rate",
          "average_revenue",
          "total_revenue",
          "time_on_page"
        ]
      },
      "description": "Metrics to compute. Any of: visitors, visits, pageviews, views_per_visit, bounce_rate, visit_duration, events, scroll_depth, percentage, conversion_rate, group_conversion_rate, average_revenue, total_revenue, time_on_page."
    },
    "date_range": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      ],
      "description": "Date range: a shortcut string (\"day\", \"7d\", \"28d\", \"30d\", \"91d\", \"month\", \"6mo\", \"12mo\", \"year\", \"all\", \"24h\") OR a 2-element ISO8601 array like [\"2024-01-01\",\"2024-07-01\"] (dates or datetimes with tz)."
    },
    "interval": {
      "description": "Time bucket to group by. Default time:day.",
      "type": "string",
      "enum": [
        "time",
        "time:hour",
        "time:day",
        "time:week",
        "time:month"
      ]
    },
    "filters": {
      "description": "Optional filters. Each is an array like [\"is\",\"visit:country_name\",[\"Estonia\"]] or [\"contains\",\"event:page\",[\"/blog\"]] with logical wrappers [\"and\",[...]] / [\"or\",[...]] / [\"not\",[...]]. Operators: is, is_not, contains, contains_not, matches, matches_not, has_done, has_not_done.",
      "type": "array",
      "items": {
        "type": "array",
        "items": {}
      }
    }
  },
  "required": [
    "site_id",
    "metrics",
    "date_range"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢plausible_breakdown(site_id, metrics, date_range, property, filters, ...)

Convenience: break metrics down by a single property (dimension), e.g. visit:source or event:page. Plausible: POST /api/v2/query with dimensions=[property].

Input Schema

{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "The site's domain as registered in Plausible, e.g. \"example.com\"."
    },
    "metrics": {
      "minItems": 1,
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "visitors",
          "visits",
          "pageviews",
          "views_per_visit",
          "bounce_rate",
          "visit_duration",
          "events",
          "scroll_depth",
          "percentage",
          "conversion_rate",
          "group_conversion_rate",
          "average_revenue",
          "total_revenue",
          "time_on_page"
        ]
      },
      "description": "Metrics to compute. Any of: visitors, visits, pageviews, views_per_visit, bounce_rate, visit_duration, events, scroll_depth, percentage, conversion_rate, group_conversion_rate, average_revenue, total_revenue, time_on_page."
    },
    "date_range": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      ],
      "description": "Date range: a shortcut string (\"day\", \"7d\", \"28d\", \"30d\", \"91d\", \"month\", \"6mo\", \"12mo\", \"year\", \"all\", \"24h\") OR a 2-element ISO8601 array like [\"2024-01-01\",\"2024-07-01\"] (dates or datetimes with tz)."
    },
    "property": {
      "type": "string",
      "description": "The single dimension to group by, e.g. visit:source, event:page, visit:country_name, visit:device."
    },
    "filters": {
      "description": "Optional filters. Each is an array like [\"is\",\"visit:country_name\",[\"Estonia\"]] or [\"contains\",\"event:page\",[\"/blog\"]] with logical wrappers [\"and\",[...]] / [\"or\",[...]] / [\"not\",[...]]. Operators: is, is_not, contains, contains_not, matches, matches_not, has_done, has_not_done.",
      "type": "array",
      "items": {
        "type": "array",
        "items": {}
      }
    },
    "limit": {
      "description": "Max rows to return — maps to pagination.limit.",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "order_by": {
      "description": "Optional ordering: an array of [metric_or_dimension, \"asc\"|\"desc\"] pairs, e.g. [[\"visitors\",\"desc\"]].",
      "type": "array",
      "items": {
        "type": "array",
        "items": {}
      }
    }
  },
  "required": [
    "site_id",
    "metrics",
    "date_range",
    "property"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢plausible_realtime_visitors(site_id)

Get the number of current visitors on a site (active in the last 5 minutes). Returns a single integer. Plausible: GET /api/v1/stats/realtime/visitors.

Input Schema

{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "The site's domain as registered in Plausible, e.g. \"example.com\"."
    }
  },
  "required": [
    "site_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢plausible_list_sites(limit, after, before)

List the sites the API key can access (domain + timezone), with cursor pagination. Requires an enterprise plan. Plausible: GET /api/v1/sites.

Input Schema

{
  "type": "object",
  "properties": {
    "limit": {
      "description": "Sites per page.",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "after": {
      "description": "Cursor for the next page (from meta.after).",
      "type": "string"
    },
    "before": {
      "description": "Cursor for the previous page (from meta.before).",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢plausible_get_site(site_id)

Get a single site by its domain (timezone, etc.). Requires an enterprise plan. Plausible: GET /api/v1/sites/{site_id}.

Input Schema

{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "The site's domain as registered in Plausible, e.g. \"example.com\"."
    }
  },
  "required": [
    "site_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢plausible_list_goals(site_id)

List the goals (conversions) configured for a site. Requires an enterprise plan. Plausible: GET /api/v1/sites/goals.

Input Schema

{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "The site's domain as registered in Plausible, e.g. \"example.com\"."
    }
  },
  "required": [
    "site_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded8 tools
verifiedversion not recorded8 tools
verifiedversion not recorded8 tools
failed observationversion not recorded—
failed observationversion not recorded—