Skip to main content
Glama
billylo1

aptabase-mcp

by billylo1
README.md
# Aptabase MCP Server

Unofficial TypeScript [MCP](https://modelcontextprotocol.io/) server that lets AI agents (Cursor, Claude Desktop, etc.) query [Aptabase](https://aptabase.com) analytics.

Aptabase has no public query API. This server wraps the same cookie-authenticated dashboard endpoints used by the web UI (`/api/_apps`, `/api/_stats/*`, `/api/_export/usage`). Those endpoints are undocumented and may change.

## Security

`APTABASE_AUTH_SESSION` is a full dashboard login cookie. Anyone with it can read your analytics (and anything else that session can do in the Aptabase UI).

- Store it only in local MCP config or a secret manager — never commit it.
- Prefer a throwaway / limited account if your org supports one.
- Rotate by signing out of Aptabase (or clearing the cookie) if it leaks.
- Do not paste real cookies into issues, PRs, or chat logs.

## Requirements

- Node.js 20+
- An Aptabase account (cloud US/EU or self-hosted)
- A browser session cookie named `auth-session`

## Install (Cursor)

Clone and build:

```bash
git clone https://github.com/billylo1/aptabase-mcp.git
cd aptabase-mcp
npm install
```

Add to Cursor MCP settings (`~/.cursor/mcp.json` or project `.cursor/mcp.json`):

```json
{
  "mcpServers": {
    "aptabase": {
      "command": "node",
      "args": ["/absolute/path/to/aptabase-mcp/dist/index.js"],
      "env": {
        "APTABASE_BASE_URL": "https://us.aptabase.com",
        "APTABASE_AUTH_SESSION": "<paste-cookie-value>"
      }
    }
  }
}
```

For local development without building:

```json
{
  "mcpServers": {
    "aptabase": {
      "command": "npx",
      "args": ["tsx", "/absolute/path/to/aptabase-mcp/src/index.ts"],
      "env": {
        "APTABASE_BASE_URL": "https://us.aptabase.com",
        "APTABASE_AUTH_SESSION": "<paste-cookie-value>"
      }
    }
  }
}
```

### Get the `auth-session` cookie

1. Log into Aptabase (`https://us.aptabase.com`, `https://eu.aptabase.com`, or your self-hosted URL).
2. Open DevTools → **Application** (Chrome) / **Storage** (Firefox) → **Cookies**.
3. Copy the **value** of `auth-session` (not the name).
4. Paste into `APTABASE_AUTH_SESSION`. Cookies last up to ~365 days; refresh on 401.

### Base URL

| Deployment | `APTABASE_BASE_URL` |
|---|---|
| Aptabase Cloud (US) | `https://us.aptabase.com` |
| Aptabase Cloud (EU) | `https://eu.aptabase.com` |
| Self-hosted | `https://your-host.example.com` (no trailing slash) |

Use the same host you logged into when copying the cookie.

## Tools

| Tool | Description |
|---|---|
| `list_apps` | List apps for the authenticated account |
| `get_app` | Get one app by id |
| `get_metrics` | Key metrics (daily users, sessions, events, duration) |
| `get_periodic_stats` | Time-series buckets |
| `get_top_events` | Top event names |
| `get_top_countries` | Top countries |
| `get_top_os` | Top operating systems |
| `get_top_os_versions` | Top OS versions |
| `get_top_app_versions` | Top app versions |
| `get_top_devices` | Top device models |
| `get_top_regions` | Top regions |
| `get_event_props` | Custom props for a given `eventName` |
| `get_live_sessions` | Recent/live sessions |
| `get_live_geo` | Live geo points |
| `get_session_details` | Session timeline |
| `get_historical_sessions` | Historical sessions |
| `get_monthly_usage` | Monthly event counts |

Most stats tools accept:

- `appId` (required)
- `buildMode`: `release` (default) or `debug`
- `period` preset **or** `startDate` / `endDate` (ISO)
- Optional filters: `eventName`, `osName`, `appVersion`, `countryCode`, `deviceModel`

### Period presets

Same as the Aptabase dashboard: `24h`, `48h`, `today`, `yesterday`, `7d`, `14d`, `30d`, `month`, `last-month`, `90d`, `180d`, `365d`, `all`.

If neither `period` nor dates are provided, stats tools default to `24h`.

Note: `dailyUsers` from `get_metrics` is average daily users for the window, not a multi-day distinct user total (Aptabase’s privacy model).

## Example prompts

- “List my Aptabase apps.”
- “Show key metrics for app `<appId>` over the last 7 days.”
- “What are the top events in the last 30 days for `<appId>`?”
- “Break down properties for the `purchase` event over the last 90 days.”
- “Show live sessions and then detail session `<sessionId>`.”

## Scripts

| Script | Purpose |
|---|---|
| `npm install` | Install deps and build (`prepare`) |
| `npm run dev` | Run with `tsx` (no build) |
| `npm run build` | Compile to `dist/` |
| `npm start` | Run `dist/index.js` |
| `npm test` | Unit tests |
| `npm run typecheck` | `tsc --noEmit` |

## Notes

- Read-only: does not create/update/delete apps or download bulk CSV exports.
- Dashboard stats are rate-limited (~1000 req/hour); retry on `429`.
- App Key (`A-US-…`) is for **ingestion** only — querying needs the `auth-session` cookie.
- Not affiliated with Aptabase.

## License

MIT

TDQS

A3.5/5.0

Scored across 17 tools

Disambiguation5/5

Each tool targets a distinct query or resource: app metadata, metrics, time series, top lists, live sessions, and session details. Even similar tools like get_top_countries and get_top_regions differ in granularity and purpose.

Naming Consistency5/5

All tools follow the get_<noun> pattern, with lowercase snake_case and no style mixing. The naming is uniform and predictable, making it easy to infer each tool's purpose.

Tool Count4/5

At 17 tools, the server is slightly above the ideal 3-15 range, but each tool targets a specific analytics need and none feel redundant. The count is justified for the scope of an analytics server.

Completeness5/5

The tool set covers app listing, core metrics, periodic statistics, top dimension breakdowns, event properties, live sessions, and historical session detail. This is a comprehensive analytics surface with no obvious dead ends for the stated domain.

Maintenance

ActivitySlowing
ResponsivenessNo issues