Pirsch MCP Server
by charpeni
README.md
# Pirsch MCP Server
A read-only [Model Context Protocol](https://modelcontextprotocol.io/) server for the [Pirsch Analytics API v1](https://docs.pirsch.io/api-sdks/api-guide-v1), written in TypeScript.
The server uses the official [`pirsch-sdk`](https://github.com/pirsch-analytics/pirsch-js-sdk) and exposes no tracking or configuration writes.
## Installation
Requirements: Node.js 22.19 or later and a Pirsch OAuth client with read scopes.
Most MCP clients can run the package on demand without a global installation. Add the following server configuration, replacing the credential placeholders:
```json
{
"mcpServers": {
"pirsch": {
"command": "npx",
"args": ["-y", "@charpeni/pirsch-mcp"],
"env": {
"PIRSCH_CLIENT_ID": "your-client-id",
"PIRSCH_CLIENT_SECRET": "your-client-secret"
}
}
}
}
```
Alternatively, install the executable globally:
```bash
npm install --global @charpeni/pirsch-mcp
```
Then configure your MCP client to run `pirsch-mcp`.
Create an **OAuth** client from the Pirsch dashboard's **Integration Settings** or **Account Settings**. Disable write operations to keep its scopes read-only. Pirsch access keys beginning with `pa_` are write-only and cannot read statistics.
## Tools
### `pirsch_list_domains`
Lists every domain available to the configured OAuth client. Each result contains only the fields needed to select a statistics target: `id`, `hostname`, and optional `displayName` and `timezone` values.
Account-scoped OAuth clients can use this tool to discover all accessible domains. Agents can switch domains by passing the selected `id` as `domainId` to `pirsch_query_statistics`.
### `pirsch_get_domain`
Returns the Pirsch SDK's default domain. Dashboard-scoped clients return their dashboard domain. Account-scoped clients can access multiple domains, so use the Pirsch dashboard to select the intended `PIRSCH_DOMAIN_ID`.
### `pirsch_query_statistics`
Queries traffic, pages, events, acquisition, device, geography, tag, keyword, and funnel statistics.
Available metrics:
```text
total, visitors, pages, entry_pages, exit_pages, session_duration,
time_on_page, conversion_goals, events, event_metadata, event_list,
event_pages, growth, active_visitors, time_of_day, languages, referrers,
operating_systems, operating_system_versions, browsers, browser_versions,
countries, regions, cities, platforms, screen_classes, utm_sources,
utm_mediums, utm_campaigns, utm_contents, utm_terms, tag_keys, tags,
keywords, funnels
```
Example:
```json
{
"metric": "pages",
"from": "2026-07-01",
"to": "2026-07-31",
"limit": 10,
"sort": "visitors",
"direction": "desc"
}
```
The `domainId` argument can be omitted when `PIRSCH_DOMAIN_ID` is configured. The server never automatically selects a domain for statistics queries because account-scoped clients can access multiple domains.
A typical multi-domain flow is:
1. Call `pirsch_list_domains`.
2. Match the requested hostname or display name.
3. Pass that domain's `id` to `pirsch_query_statistics`.
## Configuration
| Environment variable | Required | Default | Description |
| ---------------------- | -------- | ----------------------- | -------------------------------------------- |
| `PIRSCH_CLIENT_ID` | Yes | | Pirsch OAuth client ID |
| `PIRSCH_CLIENT_SECRET` | Yes | | Pirsch OAuth client secret |
| `PIRSCH_DOMAIN_ID` | No | | Default domain ID; otherwise pass `domainId` |
| `PIRSCH_HOSTNAME` | No | `localhost` | Hostname passed to the SDK; unused by reads |
| `PIRSCH_BASE_URL` | No | `https://api.pirsch.io` | Pirsch API base URL |
| `PIRSCH_TIMEOUT_MS` | No | `5000` | Positive request timeout in milliseconds |
Credentials are loaded lazily. MCP clients can start the server and list its tools without credentials, but tool calls require them.
## MCP Inspector
Set the required credentials in your shell:
```bash
export PIRSCH_CLIENT_ID="your-client-id"
export PIRSCH_CLIENT_SECRET="your-client-secret"
```
Inspect the published package:
```bash
npx -y @modelcontextprotocol/inspector \
-e "PIRSCH_CLIENT_ID=$PIRSCH_CLIENT_ID" \
-e "PIRSCH_CLIENT_SECRET=$PIRSCH_CLIENT_SECRET" \
npx -y @charpeni/pirsch-mcp
```
Inspector does not forward arbitrary shell variables to spawned `stdio` servers, so the credentials are passed explicitly with `-e`.
## Development
Install dependencies and run the complete quality gate:
```bash
pnpm install
pnpm check
```
List the local server's tools through Inspector without Pirsch credentials:
```bash
pnpm inspect:list
```
Run the local Inspector web UI after exporting the credentials:
```bash
pnpm inspect
```
Other development commands:
```bash
pnpm dev
pnpm build
pnpm format
pnpm lint
pnpm typecheck
pnpm test
```
TDQS
A4.2/5.0
Scored across 3 tools
Disambiguation5/5
Each tool has a clearly distinct role: get_domain returns the default, list_domains enumerates available domains, and query_statistics fetches analytics. No overlap or ambiguity exists.
Naming Consistency5/5
All tool names follow a consistent pattern of 'pirsch_' prefix plus a verb_noun structure (get, list, query). This makes the API predictable and easy to understand.
Tool Count5/5
Three tools is well-scoped for an analytics server: domain discovery, default selection, and statistics querying. Each tool is necessary and there is no bloat.
Completeness5/5
The tool surface fully covers the workflow of selecting a domain and querying comprehensive statistics (traffic, pages, events, etc.). No obvious missing operations or dead ends exist for the stated purpose.
Maintenance
ActivitySlowing
ResponsivenessNo issues