Plausible MCP by usefulapi
Query site stats, realtime visitors, breakdowns and goals from Plausible Analytics.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
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-httpWhat it can do
Tool inventory
Tools (8)
🟢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
Evidence