Skip to main content
Glama
rafaljanicki

Goatcounter MCP Server

by rafaljanicki

Goatcounter MCP Server

Overview

This project provides a Model Context Protocol (MCP) server for interacting with the Goatcounter web analytics API. It allows language models or other MCP clients to easily query Goatcounter statistics and information using a standardized tool interface.

The server is built using Python and the FastMCP library. It reads your Goatcounter site code and API key from environment variables for authentication.

Related MCP server: Clicky MCP Server

Features

  • Provides tools for most Goatcounter API endpoints.

  • Handles API key and site code configuration via environment variables (GOATCOUNTER_API_KEY, GOATCOUNTER_CODE).

  • Lazy initialization of the API client: Tools can be listed even if API credentials are not yet configured.

  • Rate Limit Handling: Implements automatic retries with backoff when encountering API rate limits (HTTP 429).

    • Prioritizes the X-Rate-Limit-Reset header for waiting if provided by the API.

    • Falls back to exponential backoff (starting at 1 second) with random jitter if the header is unavailable or invalid.

    • Retries up to 5 times before failing.

  • Runs directly using the fastmcp command-line tool.

Installation

To install X (Twitter) MCP server for Claude Desktop automatically via Smithery:

npx -y @smithery/cli install @rafaljanicki/goatcounter-mcp-server --client claude

Option 2: Install from PyPI

The easiest way to install goatcounter-mcp-server is via PyPI:

pip install goatcounter-mcp-server

Or install directly from the repository:

pip install git+https://github.com/rafaljanicki/goatcounter-mcp-server.git

Option 3: Install from Source

If you prefer to install from the source repository:

  1. Clone the repository:

    git clone https://github.com/rafaljanicki/goatcounter-mcp-server
    cd goatcounter-mcp-server
  2. Create a virtual environment:

    python3.13 -m venv venv
    source venv/bin/activate  # On Windows use `venv\Scripts\activate`
  3. Install dependencies: Install FastMCP and other required packages:

    pip install -r requirements.txt
  4. Configure environment variables: Copy the example .env.example file to .env:

    cp .env.example .env

    Edit the .env file and add your Goatcounter details (see Environment Variables section below).

Environment Variables

The server requires the following environment variables to be set:

  • GOATCOUNTER_CODE: Your Goatcounter site code (the subdomain part, e.g., 'mycoolsite').

  • GOATCOUNTER_API_KEY: Your Goatcounter API token. You can generate one in your Goatcounter site under Settings -> API tokens. Ensure it has the necessary permissions for the API actions you intend to use.

You can set these variables directly in your environment or place them in a .env file in the project root.

Running the Server

Option 1: Using the CLI Script

The project defines a CLI script goatcounter-mcp-server.

If installed from PyPI:

goatcounter-mcp-server

If installed from source with uv:

uv run goatcounter-mcp-server

Option 2: Using FastMCP Directly (Source Only)

If you installed from source and prefer to run the server using FastMCP's development mode:

fastmcp dev src/goatcounter_mcp_server/server.py

Using with Claude Desktop

To use this MCP server with Claude Desktop, you need to configure Claude to connect to the server. Follow these steps:

Step 1: Install Node.js

Claude Desktop uses Node.js to run MCP servers. If you don't have Node.js installed:

  • Download and install Node.js from nodejs.org.

  • Verify installation:

    node --version

Step 2: Locate Claude Desktop Configuration

Claude Desktop uses a claude_desktop_config.json file to configure MCP servers.

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

If the file doesn't exist, create it.

Step 3: Configure the MCP Server

Edit claude_desktop_config.json to include the goatcounter-mcp-server server. Replace /path/to/goatcounter-mcp-server with the actual path to your project directory (if installed from source) or the path to your Python executable (if installed from PyPI).

If installed from PyPI:

{
  "mcpServers": {
    "goatcounter-mcp-server": {
      "command": "goatcounter-mcp-server",
      "args": [],
      "env": {
        "PYTHONUNBUFFERED": "1",
        "GOATCOUNTER_CODE": "goatcounter_code",
        "GOATCOUNTER_API_KEY": "goatcounter_api_key"
      }
    }
  }
}

If installed from source with uv:

{
  "mcpServers": {
    "goatcounter-mcp-server": {
      "command": "uv",
      "args": [
        "--directory",
        "/path/to/goatcounter-mcp-server",
        "run",
        "goatcounter-mcp-server"
      ],
      "env": {
        "PYTHONUNBUFFERED": "1",
        "GOATCOUNTER_CODE": "goatcounter_code",
        "GOATCOUNTER_API_KEY": "goatcounter_api_key"
      }
    }
  }
}
  • "command": "goatcounter-mcp-server": Uses the CLI script directly if installed from PyPI.

  • "env": If installed from PyPI, you may need to provide environment variables directly in the config (since there's no .env file). If installed from source, the .env file will be used.

  • "env": {"PYTHONUNBUFFERED": "1"}: Ensures output is unbuffered for better logging in Claude.

Step 4: Restart Claude Desktop

  • Quit Claude Desktop completely.

  • Reopen Claude Desktop to load the new configuration.

Step 5: Verify Connection

  • Open Claude Desktop.

  • Look for a hammer or connector icon in the input area (bottom right corner). This indicates MCP tools are available.

  • Click the icon to see the available tools from goatcounter-mcp-server

API Documentation: Available Tools

The following MCP tools are available:


Tool: Goatcounter_get_me

Get information about the current Goatcounter user and API key associated with the configured GOATCOUNTER_API_KEY.

  • Parameters: None

  • Returns: object - Information about the user and token.


Tool: Goatcounter_list_sites

List all Goatcounter sites accessible with the current API key.

  • Parameters: None

  • Returns: object - A list of accessible sites.


Tool: Goatcounter_list_paths

Get an overview of paths tracked on this site (without statistics).

  • Parameters:

    • limit (integer, optional): Limit number of returned results (1-200, default 20).

    • after (integer, optional): Only select paths after this path ID, for pagination.

  • Returns: object - A list of paths and pagination info.


Tool: Goatcounter_get_stats_total

Get the total number of pageviews and unique visitors for the site within a specified period.

  • Parameters:

    • start (string, optional): Start date (YYYY-MM-DD or relative e.g., '7 days ago').

    • end (string, optional): End date (YYYY-MM-DD or relative e.g., 'yesterday').

    • filter (string, optional): Filter paths (e.g., '/blog*').

    • daily (boolean, optional): Show daily statistics instead of totals (default: false).

  • Returns: object - Total statistics or daily statistics if daily is true.


Tool: Goatcounter_get_stats_hits

List page statistics (pageviews and visitors per path).

  • Parameters:

    • start (string, optional): Start date (YYYY-MM-DD or relative e.g., '7 days ago').

    • end (string, optional): End date (YYYY-MM-DD or relative e.g., 'yesterday').

    • filter (string, optional): Filter paths (e.g., '/blog*').

    • daily (boolean, optional): Show daily statistics instead of totals (default: false).

    • limit (integer, optional): Limit number of returned results (1-200, default 20).

    • after (integer, optional): Pagination cursor.

  • Returns: object - A list of path statistics and pagination info.


Tool: Goatcounter_get_stats_refs

List referrer statistics.

  • Parameters:

    • start (string, optional): Start date (YYYY-MM-DD or relative e.g., '7 days ago').

    • end (string, optional): End date (YYYY-MM-DD or relative e.g., 'yesterday').

    • filter (string, optional): Filter paths (e.g., '/blog*').

    • daily (boolean, optional): Show daily statistics instead of totals (default: false).

    • limit (integer, optional): Limit number of returned results (1-200, default 20).

    • after (integer, optional): Pagination cursor.

  • Returns: object - A list of referrer statistics and pagination info.


Tool: Goatcounter_get_stats_browsers

List browser statistics.

  • Parameters:

    • start (string, optional): Start date (YYYY-MM-DD or relative e.g., '7 days ago').

    • end (string, optional): End date (YYYY-MM-DD or relative e.g., 'yesterday').

    • filter (string, optional): Filter paths (e.g., '/blog*').

    • daily (boolean, optional): Show daily statistics instead of totals (default: false).

    • limit (integer, optional): Limit number of returned results (1-200, default 20).

    • after (integer, optional): Pagination cursor.

  • Returns: object - A list of browser statistics and pagination info.


Tool: Goatcounter_get_stats_systems

List operating system statistics.

  • Parameters:

    • start (string, optional): Start date (YYYY-MM-DD or relative e.g., '7 days ago').

    • end (string, optional): End date (YYYY-MM-DD or relative e.g., 'yesterday').

    • filter (string, optional): Filter paths (e.g., '/blog*').

    • daily (boolean, optional): Show daily statistics instead of totals (default: false).

    • limit (integer, optional): Limit number of returned results (1-200, default 20).

    • after (integer, optional): Pagination cursor.

  • Returns: object - A list of OS statistics and pagination info.


Tool: Goatcounter_get_stats_sizes

List screen size statistics.

  • Parameters:

    • start (string, optional): Start date (YYYY-MM-DD or relative e.g., '7 days ago').

    • end (string, optional): End date (YYYY-MM-DD or relative e.g., 'yesterday').

    • filter (string, optional): Filter paths (e.g., '/blog*').

    • daily (boolean, optional): Show daily statistics instead of totals (default: false).

    • limit (integer, optional): Limit number of returned results (1-200, default 20).

    • after (integer, optional): Pagination cursor.

  • Returns: object - A list of screen size statistics and pagination info.


Tool: Goatcounter_get_stats_locations

List location statistics.

  • Parameters:

    • start (string, optional): Start date (YYYY-MM-DD or relative e.g., '7 days ago').

    • end (string, optional): End date (YYYY-MM-DD or relative e.g., 'yesterday').

    • filter (string, optional): Filter paths (e.g., '/blog*').

    • daily (boolean, optional): Show daily statistics instead of totals (default: false).

    • limit (integer, optional): Limit number of returned results (1-200, default 20).

    • after (integer, optional): Pagination cursor.

  • Returns: object - A list of location statistics and pagination info.

Usage

  1. Set Environment Variables: Create a .env file in your project root or set the environment variables directly:

    GOATCOUNTER_CODE=your_site_code
    GOATCOUNTER_API_KEY=your_goatcounter_api_key

    You can generate an API key in your Goatcounter account settings.

  2. Run with FastMCP: Integrate this server with your FastMCP setup. Refer to the FastMCP documentation for details on connecting MCP servers.

    The server registers tools with the prefix Goatcounter (e.g., Goatcounter.list_sites).

Development

  • Install development dependencies: pip install -e ".[dev]" (if dev dependencies are specified in pyproject.toml)

  • This project uses hatch for building.

Contributing

Contributions are welcome! Please open an issue or submit a pull request.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    B
    quality
    D
    maintenance
    Allows AI models to query and retrieve analytics data from Plausible Analytics through the Plausible API, enabling natural language interactions with website statistics.
    1
    8
    -
  • F
    license
    A
    quality
    B
    maintenance
    Enables users to retrieve website traffic analytics data from Clicky, including visitor counts, top pages, traffic sources, and domain-specific visitor data. Provides comprehensive web analytics insights through natural language queries with support for date range filtering and detailed traffic breakdowns.
    5
    1
    -
  • A
    license
    A
    quality
    F
    maintenance
    Enables AI assistants to interact with Umami Analytics for both Cloud and self-hosted instances. It provides tools to retrieve website statistics, visitor metrics, pageview trends, and real-time active user counts.
    5
    1
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables AI assistants to query website statistics from Plausible Analytics, providing access to metrics like real-time visitors, traffic trends, and page performance. It supports both Plausible Cloud and self-hosted instances through the Stats API v2.
    6
    21
    1
    MIT