Skip to main content
Glama
AryanKo

Plausible Analytics MCP Server

by AryanKo

Plausible Analytics MCP Server

A stdio-based Model Context Protocol (MCP) server that gives Large Language Models (LLMs) tools to read analytics data from a Plausible Analytics account (cloud-hosted or self-hosted). It operates as a read-only proxy — it does not store, transform, cache, or mutate anything. Every tool call maps to exactly one Plausible API request.

Prerequisites

  • Python: 3.12 or higher

  • Package Manager: uv

  • Plausible Account: Plausible Cloud or self-hosted instance with an API key (Personal Access Token)

Related MCP server: plausible-whenever-mcp

Setup Instructions

  1. Clone the repository and navigate into the directory:

    git clone <repository-url>
    cd plausible-mcp
  2. Install dependencies using uv:

    uv sync
  3. Create and configure your environment file:

    cp .env.example .env
  4. Edit .env to set your credentials:

    PLAUSIBLE_API_KEY=your_secret_api_key_here
    PLAUSIBLE_BASE_URL=https://plausible.io

    (For self-hosted instances, replace https://plausible.io with your custom instance URL).

Running the Server

Start the server locally over stdio transport:

uv run python -m src.server

MCP Client Configuration (Claude Desktop)

To connect this MCP server to Claude Desktop, add the following entry to your claude_desktop_config.json file (typically located at %APPDATA%\Claude\claude_desktop_config.json on Windows or ~/Library/Application Support/Claude/claude_desktop_config.json on macOS):

{
  "mcpServers": {
    "plausible-mcp": {
      "command": "uv",
      "args": [
        "--directory",
        "C:/path/to/plausible-mcp",
        "run",
        "python",
        "-m",
        "src.server"
      ],
      "env": {
        "PLAUSIBLE_API_KEY": "your_secret_api_key_here",
        "PLAUSIBLE_BASE_URL": "https://plausible.io"
      }
    }
  }
}

Tool Reference

1. list_sites

  • Description: Returns the list of sites/domains accessible by the configured Plausible API key.

  • Parameters: None

  • Example Call:

    list_sites()

2. query_stats

  • Description: General-purpose analytics query endpoint wrapping Plausible Stats API v2 (POST /api/v2/query).

  • Parameters:

    • site_id (str, required): The domain name configured in Plausible (min length 1).

    • metrics (list[Metric], required): List of confirmed metrics (e.g. visitors, visits, pageviews, bounce_rate, visit_duration, events, scroll_depth, percentage, conversion_rate, group_conversion_rate, average_revenue, total_revenue, time_on_page).

    • date_range (DateRangePreset | DateRangeCustom, required): Either a preset string (day, 24h, 7d, 28d, 30d, 91d, month, 6mo, 12mo, year, all) or a 2-element list of ISO8601 date/datetime strings (e.g., ["2026-01-01", "2026-01-07"]).

    • dimensions (list[str], optional): List of event, visit, or time dimensions (e.g., visit:source, event:page, time:day).

    • filters (list[FilterClause], optional): Structurally validated filter clauses (e.g., [["is", "visit:country", ["US"]]]).

    • order_by (list[tuple[str, "asc" | "desc"]], optional): Sorting specifications.

    • pagination (Pagination, optional): Limits and offsets ({"limit": 10000, "offset": 0}).

  • Example Call:

    query_stats(
        site_id="example.com",
        metrics=["visitors", "pageviews"],
        date_range="7d",
        dimensions=["visit:source"],
        order_by=[("visitors", "desc")]
    )

3. get_realtime_visitors

  • Description: Convenience wrapper querying the current active visitor count over a server-fixed 5-minute window (now - 5 minutes to now).

  • Parameters:

    • site_id (str, required): The domain name configured in Plausible.

  • Example Call:

    get_realtime_visitors(site_id="example.com")

Known Limitations

  • Filter DSL Structural Validation Only: Filter clauses undergo structural validation (checking element length and operator string), but semantic validation of Plausible's full filter DSL is delegated to the Plausible API itself.

  • stdio Transport Only: Only stdio transport is supported in this release.

  • Single Account / Single API Key: Designed for single-tenant operations per server instance.

  • Read-Only Scope: Purely read-only proxy. Endpoint calls to record pageviews, provision sites, or mutate goals are strictly out of scope.

License

Not yet decided.

Available Tools

3 tools
get_realtime_visitorsB

Get the current active visitor count for a site over the last 5 minutes.

ParametersJSON Schema
NameRequiredDescriptionDefault
site_idYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It does disclose the time window (5 minutes), which is a useful behavioral trait, but it does not mention the return format, error behavior, or any rate limits, leaving gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence, front-loaded with the action and object, and contains no extraneous information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read operation with one parameter, the description provides the essential purpose and time context. However, it lacks information about the return value structure and how to obtain a site_id, so it is not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description does not explain the site_id parameter beyond referring to 'a site'. With 0% schema description coverage, the description fails to add meaning to the parameter, such as how to obtain a valid site_id (e.g., from list_sites).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves the current active visitor count for a site, with a specific time window ('last 5 minutes'), distinguishing it from sibling tools list_sites and query_stats.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus the alternatives. The description does not mention any alternatives, exclusions, or conditions under which it should be preferred, leaving the agent to infer usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_sitesA

Returns the list of sites/domains accessible by the configured Plausible API key.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the transparency burden. It does indicate a read operation through 'Returns' and mentions API key authentication, but it lacks details on potential errors, rate limits, or return structure. This is minimally sufficient for a simple list operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single clear sentence with no redundant information. It is front-loaded with the main action and resource, making it easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with zero parameters and no output schema, this description is complete enough. It explains what the tool returns and the underlying access context. The sibling tools suggest complementary analytics functions, reinforcing the purpose.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, so the schema coverage is trivially 100%. The description adds context about the configured API key, which clarifies the data source. With no parameters, the baseline is 4, and this description does not detract from that.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns a list of sites/domains accessible via the API key. The verb 'Returns' and resource 'sites/domains' make it distinct from the sibling tools query_stats and get_realtime_visitors, which focus on analytics data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No usage guidance is provided. The description does not indicate when to use this tool versus the siblings, nor does it mention any prerequisites or expected workflow. This leaves the agent to infer usage from the tool name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query_statsC

Execute a general-purpose analytics query against Plausible Analytics API v2.

ParametersJSON Schema
NameRequiredDescriptionDefault
filtersNo
metricsYes
site_idYes
order_byNo
date_rangeYes
dimensionsNo
paginationNo

TDQS

C2.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It only says 'execute a query', which implies a read operation but does not state whether it is read-only, whether authentication is needed, or any side effects. It adds little beyond what the tool name already implies.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no wasted words. It is easy to parse, though it is also under-specified. The conciseness is good but not exceptional because it sacrifices needed detail for brevity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (7 parameters, no output schema, no annotations), the description is severely incomplete. It provides no information about return values, pagination, error behavior, or how to construct queries. An agent would not know what to expect from the tool's output or how to use it effectively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not compensate by explaining any parameters. It mentions none of the seven parameters, leaving the agent to rely entirely on the schema. The schema itself has minimal descriptions for the main properties, so the tool provides insufficient parameter guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Execute a general-purpose analytics query against Plausible Analytics API v2' clearly states the action (execute) and resource (analytics query). It provides a general sense of scope with 'general-purpose', but it does not explicitly differentiate from sibling tools like get_realtime_visitors or list_sites, so it lacks a strong distinguishing element.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description offers no guidance on when to use this tool vs alternatives. There is no mention of specific use cases, prerequisites, or exclusions. Sibling tools are not referenced, so an agent receives no context for choosing query_stats over get_realtime_visitors or list_sites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

TDQS

B3.3/5.0
Disambiguation4/5

The three tools are mostly distinct: list_sites retrieves site metadata, query_stats provides general analytics data, and get_realtime_visitors focuses on current active visitors. There is slight overlap between query_stats and get_realtime_visitors, but the descriptions clearly differentiate realtime from historical querying.

Naming Consistency5/5

All tool names follow the verb_noun pattern: list_sites, query_stats, get_realtime_visitors. The naming is consistent, predictable, and clearly indicates the action and target resource.

Tool Count4/5

With only 3 tools, the server is minimal but focused. The count is not excessive and covers the core analytics needs (site listing, stats querying, and realtime tracking) without adding redundant tools.

Completeness4/5

The server covers the essential read-only analytics lifecycle for Plausible: listing sites, querying statistics, and checking realtime visitors. Minor gaps exist such as site management (add/delete) or specific breakdown endpoints, but query_stats likely abstracts several API v2 query types, so the surface is reasonably complete for typical analytics workflows.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Read-only MCP server for Umami analytics. It talks to the Umami REST API directly over HTTP, supporting self-hosted and cloud setups.
    8
    17
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    MCP server that provides read access to Plausible Analytics data with natural-language date resolution, enabling users to query analytics like 'yesterday' or 'last week' without needing to know exact date formats.
    8
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    MCP server for Plausible Analytics that enables querying traffic, conversions, and comparing time periods from any AI tool supporting MCP.
    4
    33
    38
    MIT
  • A
    license
    A
    quality
    F
    maintenance
    MCP server for querying privacy-friendly website analytics from a self-hosted Takt instance, supporting metrics like visitors, pageviews, realtime activity, and more.
    10
    16
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/AryanKo/Plausible-MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server