Community edition generated from private repo via sync pipeline. Includes 9 plugins (WordPress, WooCommerce, WP Advanced, Gitea, n8n, Supabase, OpenPanel, Appwrite, Directus) with ~587 tools. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
30 KiB
OpenPanel Plugin Design - Phase H
MCP Plugin for OpenPanel Analytics Management (Self-Hosted)
Version: v1.0.0 (Design) Priority: Highest Estimated Tools: 72-78
Why OpenPanel over Plausible?
Comparison Summary
| Feature | Plausible | OpenPanel | Winner |
|---|---|---|---|
| Web Analytics | Yes | Yes | Tie |
| Product Analytics | No | Yes (Funnels, Cohorts) | OpenPanel |
| User Profiles | No | Yes | OpenPanel |
| A/B Testing | No | Yes | OpenPanel |
| Retention Analysis | No | Yes | OpenPanel |
| Session Recording | No | Yes | OpenPanel |
| Multi-platform | Web only | Web, Mobile, Server | OpenPanel |
| API Completeness | Stats API only | Track + Export + Management | OpenPanel |
| Custom Dashboards | Limited | Full flexibility | OpenPanel |
| Self-Hosted | Yes | Yes | Tie |
| Privacy (GDPR) | Yes | Yes | Tie |
Decision: OpenPanel - More comprehensive analytics with Product Analytics features that Plausible lacks.
Key OpenPanel Advantages
- Product Analytics - Funnels, cohorts, user profiles, retention
- A/B Testing - Built-in variant testing
- Multi-platform - Web, iOS, Android, Server-side SDKs
- Comprehensive API - Track, Export, and Management APIs
- Custom Dashboards - Flexible chart creation
- Self-Hosted on Coolify - Full data control
Sources:
Overview
Plugin for managing OpenPanel Self-Hosted instances deployed on Coolify.
Architecture Overview
┌─────────────────────────────────────────────────────────────────┐
│ OpenPanel Self-Hosted Architecture │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ OpenPanel Stack │ │
│ ├─────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ Next.js Dashboard (:3000) │ │
│ │ └── tRPC API (internal management) │ │
│ │ │ │
│ │ Fastify Event API (:3333) │ │
│ │ └── /track - Event ingestion │ │
│ │ └── /export - Data export │ │
│ │ │ │
│ │ PostgreSQL - Metadata & config │ │
│ │ ClickHouse - Event storage (high-volume) │ │
│ │ Redis - Cache, pub/sub, queues │ │
│ │ BullMQ - Job processing │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
Authentication
API Authentication
┌─────────────────────────────────────────────────────────────────┐
│ OpenPanel Authentication │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Required Headers: │
│ ├── openpanel-client-id: YOUR_CLIENT_ID │
│ └── openpanel-client-secret: YOUR_CLIENT_SECRET │
│ │
│ Client Modes: │
│ ├── write - Can send events (tracking) │
│ ├── read - Can read data (export) │
│ └── root - Full access (management + read + write) │
│ │
│ For Self-Hosted: Create clients via Dashboard or API │
│ │
└─────────────────────────────────────────────────────────────────┘
Environment Variables
# OpenPanel Self-Hosted Instance (Required)
OPENPANEL_SITE1_URL=https://analytics.example.com
OPENPANEL_SITE1_CLIENT_ID=your-client-id
OPENPANEL_SITE1_CLIENT_SECRET=your-client-secret
OPENPANEL_SITE1_PROJECT_ID=your-project-id # Required for Export/Read APIs
OPENPANEL_SITE1_ALIAS=myanalytics
# Optional: Multiple Instances
OPENPANEL_SITE2_URL=https://analytics-staging.example.com
OPENPANEL_SITE2_CLIENT_ID=client-id-staging
OPENPANEL_SITE2_CLIENT_SECRET=client-secret-staging
OPENPANEL_SITE2_PROJECT_ID=staging-project-id
OPENPANEL_SITE2_ALIAS=staging
Finding Your Project ID:
- Log in to your OpenPanel Dashboard
- Go to Project Settings
- Copy the Project ID
Note:
CLIENT_IDandCLIENT_SECRETare used for authenticationPROJECT_IDis required for Export/Read APIs (get_event_count, export_events, etc.)- Track APIs (identify_user, track_event) work without PROJECT_ID
API Endpoints
Track API (Fastify - /api)
Primary endpoint for event ingestion:
POST /track
Headers:
openpanel-client-id: YOUR_CLIENT_ID
openpanel-client-secret: YOUR_CLIENT_SECRET
x-client-ip: CLIENT_IP (optional, for geo)
user-agent: USER_AGENT (optional, for device info)
Operation Types:
| Type | Description | Use Case |
|---|---|---|
track |
Track custom event | Page view, button click, purchase |
identify |
Identify user | Set user profile properties |
increment |
Increment property | Visit count, purchase count |
decrement |
Decrement property | Credits used, inventory |
alias |
Alias profile ID | Link anonymous to authenticated |
Export API (Fastify - /export)
GET /export/events
- Retrieve raw event data
- Filters: projectId, profileId, event, start, end
- Pagination: page, limit
- Includes: profile, meta
GET /export/charts
- Retrieve aggregated chart data
- Events with breakdowns
- Intervals: minute, hour, day, week, month
- Ranges: 30min, today, 7d, 30d, 6m, 12m, etc.
Dashboard tRPC API (Next.js - /api/trpc)
Internal API for dashboard management:
Projects:
- project.list, project.get, project.create, project.update, project.delete
Dashboards:
- dashboard.list, dashboard.get, dashboard.create, dashboard.update, dashboard.delete
Charts:
- chart.create, chart.update, chart.delete
Clients:
- client.list, client.create, client.delete, client.regenerate
Funnels:
- funnel.list, funnel.get, funnel.create, funnel.update, funnel.delete
Reports:
- report.overview, report.retention, report.paths
Users/Profiles:
- profile.list, profile.get, profile.events
Plugin Architecture
Project Structure
plugins/openpanel/
├── __init__.py # Export: OpenPanelPlugin, OpenPanelClient
├── plugin.py # Main OpenPanelPlugin class
├── client.py # OpenPanelClient (unified client)
└── handlers/
├── __init__.py
├── events.py # Event tracking (10 tools)
├── export.py # Data export (10 tools)
├── projects.py # Project management (8 tools)
├── dashboards.py # Dashboard management (10 tools)
├── funnels.py # Funnel analytics (8 tools)
├── profiles.py # User profiles (8 tools)
├── clients.py # API client management (6 tools)
├── reports.py # Analytics reports (8 tools)
└── system.py # Health & stats (6 tools)
Client Architecture
class OpenPanelClient:
"""
Unified client for OpenPanel Self-Hosted APIs
Handles both Track/Export API (Fastify) and
Dashboard tRPC API (Next.js) where available.
"""
def __init__(
self,
base_url: str, # e.g., https://analytics.example.com
client_id: str, # Client ID for authentication
client_secret: str, # Client Secret for authentication
):
self.base_url = base_url.rstrip('/')
self.api_url = f"{self.base_url}/api"
self.client_id = client_id
self.client_secret = client_secret
def _get_headers(self, include_ip: str = None) -> Dict[str, str]:
"""Get authentication headers"""
headers = {
"Content-Type": "application/json",
"openpanel-client-id": self.client_id,
"openpanel-client-secret": self.client_secret
}
if include_ip:
headers["x-client-ip"] = include_ip
return headers
async def track(
self,
event_type: str,
payload: Dict[str, Any],
client_ip: str = None
) -> Dict[str, Any]:
"""Send tracking request to /track endpoint"""
...
async def export_events(
self,
project_id: str,
**filters
) -> Dict[str, Any]:
"""Export events from /export/events"""
...
Tool Categories
1. Events Handler (10 tools)
Event tracking and ingestion operations.
| Tool | Type | Scope | Description |
|---|---|---|---|
track_event |
track | write | Track custom event with properties |
track_page_view |
track | write | Track page view event |
track_screen_view |
track | write | Track screen view (mobile) |
identify_user |
identify | write | Identify user with profile data |
set_user_properties |
identify | write | Update user properties |
increment_property |
increment | write | Increment numeric property |
decrement_property |
decrement | write | Decrement numeric property |
alias_user |
alias | write | Link two profile IDs |
track_revenue |
track | write | Track revenue/purchase event |
track_batch |
track | write | Track multiple events in batch |
# Example: track_event
{
"name": "track_event",
"method_name": "track_event",
"description": "Track a custom event with properties. Events can have any custom properties.",
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Event name (e.g., 'button_clicked', 'purchase_completed')"
},
"properties": {
"type": "object",
"description": "Custom properties for the event"
},
"profile_id": {
"type": "string",
"description": "User/profile ID to associate with event"
},
"timestamp": {
"type": "string",
"format": "date-time",
"description": "Event timestamp (ISO 8601, defaults to now)"
}
},
"required": ["name"]
},
"scope": "write"
}
2. Export Handler (10 tools)
Data export and retrieval operations.
| Tool | Type | Scope | Description |
|---|---|---|---|
export_events |
GET | read | Export raw event data |
export_events_csv |
GET | read | Export events as CSV |
export_chart_data |
GET | read | Export aggregated chart data |
get_event_count |
GET | read | Get event counts with filters |
get_unique_users |
GET | read | Get unique user count |
get_page_views |
GET | read | Get page view statistics |
get_top_pages |
GET | read | Get top pages by views |
get_top_referrers |
GET | read | Get top traffic sources |
get_geo_data |
GET | read | Get geographic distribution |
get_device_data |
GET | read | Get device/browser breakdown |
# Example: export_events
{
"name": "export_events",
"method_name": "export_events",
"description": "Export raw event data with filters and pagination",
"schema": {
"type": "object",
"properties": {
"project_id": {
"type": "string",
"description": "Project ID to export from"
},
"event": {
"anyOf": [{"type": "string"}, {"type": "array", "items": {"type": "string"}}],
"description": "Event name(s) to filter"
},
"profile_id": {
"type": "string",
"description": "Filter by user/profile ID"
},
"start": {
"type": "string",
"format": "date",
"description": "Start date (YYYY-MM-DD)"
},
"end": {
"type": "string",
"format": "date",
"description": "End date (YYYY-MM-DD)"
},
"limit": {
"type": "integer",
"default": 50,
"maximum": 1000
},
"page": {
"type": "integer",
"default": 1
},
"includes": {
"type": "array",
"items": {"type": "string", "enum": ["profile", "meta"]},
"description": "Additional data to include"
}
},
"required": ["project_id"]
},
"scope": "read"
}
3. Projects Handler (8 tools)
Project management operations.
| Tool | Method | Scope | Description |
|---|---|---|---|
list_projects |
GET | read | List all projects |
get_project |
GET | read | Get project details |
create_project |
POST | admin | Create new project |
update_project |
PUT | admin | Update project settings |
delete_project |
DELETE | admin | Delete project |
get_project_stats |
GET | read | Get project statistics |
get_project_settings |
GET | read | Get project configuration |
update_project_settings |
PUT | admin | Update project configuration |
4. Dashboards Handler (10 tools)
Dashboard and chart management.
| Tool | Method | Scope | Description |
|---|---|---|---|
list_dashboards |
GET | read | List all dashboards |
get_dashboard |
GET | read | Get dashboard with charts |
create_dashboard |
POST | write | Create new dashboard |
update_dashboard |
PUT | write | Update dashboard |
delete_dashboard |
DELETE | write | Delete dashboard |
add_chart |
POST | write | Add chart to dashboard |
update_chart |
PUT | write | Update chart configuration |
delete_chart |
DELETE | write | Remove chart from dashboard |
duplicate_dashboard |
POST | write | Clone existing dashboard |
share_dashboard |
POST | write | Generate shareable link |
5. Funnels Handler (8 tools)
Funnel analysis operations.
| Tool | Method | Scope | Description |
|---|---|---|---|
list_funnels |
GET | read | List all funnels |
get_funnel |
GET | read | Get funnel with conversion data |
create_funnel |
POST | write | Create new funnel |
update_funnel |
PUT | write | Update funnel steps |
delete_funnel |
DELETE | write | Delete funnel |
get_funnel_conversion |
GET | read | Get conversion rates |
get_funnel_breakdown |
GET | read | Get breakdown by segment |
compare_funnels |
GET | read | Compare multiple funnels |
# Example: create_funnel
{
"name": "create_funnel",
"method_name": "create_funnel",
"description": "Create a funnel to track user journey through steps",
"schema": {
"type": "object",
"properties": {
"project_id": {
"type": "string",
"description": "Project ID"
},
"name": {
"type": "string",
"description": "Funnel name"
},
"steps": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {"type": "string"},
"event": {"type": "string"},
"filters": {"type": "array"}
},
"required": ["name", "event"]
},
"description": "Funnel steps (events in sequence)",
"minItems": 2
},
"window_days": {
"type": "integer",
"default": 14,
"description": "Conversion window in days"
}
},
"required": ["project_id", "name", "steps"]
},
"scope": "write"
}
6. Profiles Handler (8 tools)
User profile management.
| Tool | Method | Scope | Description |
|---|---|---|---|
list_profiles |
GET | read | List user profiles |
get_profile |
GET | read | Get profile details |
search_profiles |
GET | read | Search profiles by property |
get_profile_events |
GET | read | Get events for profile |
get_profile_sessions |
GET | read | Get sessions for profile |
delete_profile |
DELETE | admin | Delete profile data (GDPR) |
merge_profiles |
POST | admin | Merge duplicate profiles |
export_profile_data |
GET | read | Export all profile data (GDPR) |
7. Clients Handler (6 tools)
API client/key management.
| Tool | Method | Scope | Description |
|---|---|---|---|
list_clients |
GET | read | List API clients |
get_client |
GET | read | Get client details |
create_client |
POST | admin | Create new API client |
delete_client |
DELETE | admin | Delete API client |
regenerate_secret |
POST | admin | Regenerate client secret |
update_client_mode |
PUT | admin | Update client permissions |
8. Reports Handler (8 tools)
Analytics and reporting.
| Tool | Method | Scope | Description |
|---|---|---|---|
get_overview_report |
GET | read | Get overview statistics |
get_retention_report |
GET | read | Get retention analysis |
get_cohort_report |
GET | read | Get cohort analysis |
get_paths_report |
GET | read | Get user flow paths |
get_realtime_stats |
GET | read | Get real-time visitors |
get_ab_test_results |
GET | read | Get A/B test results |
create_report |
POST | write | Create scheduled report |
export_report |
GET | read | Export report as PDF/CSV |
9. System Handler (6 tools)
System health and management.
| Tool | Method | Scope | Description |
|---|---|---|---|
health_check |
GET | read | Check service health |
get_instance_info |
GET | read | Get instance information |
get_usage_stats |
GET | read | Get usage statistics |
get_storage_stats |
GET | read | Get storage usage (ClickHouse) |
test_connection |
GET | read | Test API connection |
get_rate_limit_status |
GET | read | Check rate limit status |
Tool Summary
| Handler | Tools | Description |
|---|---|---|
| Events | 10 | Event tracking & ingestion |
| Export | 10 | Data export & retrieval |
| Projects | 8 | Project management |
| Dashboards | 10 | Dashboard & chart management |
| Funnels | 8 | Funnel analysis |
| Profiles | 8 | User profile management |
| Clients | 6 | API client management |
| Reports | 8 | Analytics & reporting |
| System | 6 | Health & instance info |
| Total | 74 |
Implementation Phases
Phase H.1: Core (Required)
Goal: Basic event tracking and data export
- OpenPanelPlugin class
- OpenPanelClient (unified)
- Events Handler (10 tools)
- Export Handler (10 tools)
- System Handler (6 tools)
Tools: 26
Phase H.2: Analytics (Recommended)
Goal: Advanced analytics features
- Reports Handler (8 tools)
- Funnels Handler (8 tools)
- Profiles Handler (8 tools)
Tools: 24 (Total: 50)
Phase H.3: Management (Complete)
Goal: Full dashboard and project management
- Projects Handler (8 tools)
- Dashboards Handler (10 tools)
- Clients Handler (6 tools)
Tools: 24 (Total: 74)
Export API Reference
Event Segmentation Types
| Segment | Description |
|---|---|
event |
Count total events |
user |
Count unique users |
session |
Count unique sessions |
user_average |
Average per user |
one_event_per_user |
First event per user |
property_sum |
Sum of property values |
property_average |
Average of property values |
property_min |
Minimum property value |
property_max |
Maximum property value |
Filter Operators
| Operator | Description |
|---|---|
is |
Exact match |
isNot |
Not equal |
contains |
Contains substring |
doesNotContain |
Does not contain |
startsWith |
Starts with |
endsWith |
Ends with |
regex |
Regular expression |
isNull |
Is null/undefined |
isNotNull |
Is not null |
Breakdown Dimensions
| Dimension | Description |
|---|---|
country |
Country |
region |
Region/State |
city |
City |
device |
Device type |
browser |
Browser name |
os |
Operating system |
referrer |
Traffic source |
path |
Page path |
Date Ranges
30min, lastHour, today, yesterday
7d, 30d, 6m, 12m
monthToDate, lastMonth
yearToDate, lastYear
Error Handling
HTTP Status Codes
| Code | Description | Action |
|---|---|---|
| 200 | Success | Return data |
| 400 | Bad Request | Validate input |
| 401 | Unauthorized | Check credentials |
| 403 | Forbidden | Check client mode |
| 404 | Not Found | Resource doesn't exist |
| 429 | Rate Limited | Implement backoff |
| 500 | Server Error | Retry with backoff |
Rate Limiting
Limit: 100 requests per 10 seconds per client
Backoff: Exponential (1s, 2s, 4s, 8s...)
Headers:
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1699999999
Security Considerations
Client Secret Protection
┌─────────────────────────────────────────────────────────────────┐
│ Client Security │
├─────────────────────────────────────────────────────────────────┤
│ │
│ write mode client: │
│ ├── Can send events only │
│ ├── Cannot read data │
│ └── Safe for client-side (with domain restrictions) │
│ │
│ read mode client: │
│ ├── Can export data │
│ ├── Cannot send events │
│ └── Server-side only │
│ │
│ root mode client: │
│ ├── Full access │
│ ├── Can manage projects, clients │
│ └── ⚠️ Server-side only - Never expose! │
│ │
└─────────────────────────────────────────────────────────────────┘
Best Practices
- Use appropriate client mode - write for tracking, read for export
- Never expose root clients - Server-side only
- Implement rate limiting - Respect API limits
- GDPR compliance - Use profile deletion tools
- Audit data exports - Log who exports what
Example Usage
Track Event
{
"tool": "track_event",
"args": {
"site": "myanalytics",
"name": "purchase_completed",
"properties": {
"product_id": "prod_123",
"amount": 99.99,
"currency": "USD",
"category": "electronics"
},
"profile_id": "user_456"
}
}
Identify User
{
"tool": "identify_user",
"args": {
"site": "myanalytics",
"profile_id": "user_456",
"properties": {
"firstName": "John",
"lastName": "Doe",
"email": "john@example.com",
"plan": "premium",
"company": "Acme Inc"
}
}
}
Export Events
{
"tool": "export_events",
"args": {
"site": "myanalytics",
"project_id": "proj_abc",
"event": "purchase_completed",
"start": "2025-11-01",
"end": "2025-11-30",
"limit": 100,
"includes": ["profile"]
}
}
Create Funnel
{
"tool": "create_funnel",
"args": {
"site": "myanalytics",
"project_id": "proj_abc",
"name": "Checkout Flow",
"steps": [
{"name": "View Product", "event": "product_viewed"},
{"name": "Add to Cart", "event": "cart_added"},
{"name": "Start Checkout", "event": "checkout_started"},
{"name": "Complete Purchase", "event": "purchase_completed"}
],
"window_days": 7
}
}
Get Retention Report
{
"tool": "get_retention_report",
"args": {
"site": "myanalytics",
"project_id": "proj_abc",
"start_event": "signup_completed",
"return_event": "app_opened",
"period": "week",
"cohorts": 12
}
}
Coolify Deployment Notes
OpenPanel Services
# OpenPanel services in Coolify
services:
dashboard: # Next.js - port 3000
api: # Fastify Event API - port 3333
worker: # BullMQ worker
postgres: # PostgreSQL - metadata
clickhouse: # ClickHouse - events
redis: # Redis - cache/queue
Environment Variables (Coolify)
# Required
NEXT_PUBLIC_DASHBOARD_URL=https://analytics.example.com
DATABASE_URL=postgresql://...
CLICKHOUSE_URL=http://clickhouse:8123
REDIS_URL=redis://redis:6379
# Optional
RESEND_API_KEY=re_...
OPENAI_API_KEY=sk-... # For AI features
ANTHROPIC_API_KEY=sk-...
Finding Credentials
- URL: Coolify Dashboard → Project → OpenPanel → Domain
- Client ID/Secret: OpenPanel Dashboard → Settings → Clients
Endpoint Registration
Endpoint Config
# core/endpoints/config.py
EndpointType.OPENPANEL: EndpointConfig(
path="/openpanel",
name="OpenPanel Analytics",
description="OpenPanel product analytics management (events, funnels, dashboards)",
endpoint_type=EndpointType.OPENPANEL,
plugin_types=["openpanel"],
require_master_key=False,
allowed_scopes={"read", "write", "admin"},
tool_blacklist={
"manage_api_keys_create",
"manage_api_keys_delete",
"oauth_register_client",
"oauth_revoke_client",
},
max_tools=80,
),
Testing Checklist
Unit Tests
- OpenPanelClient authentication
- Track API operations (track, identify, increment)
- Export API operations (events, charts)
- Error handling for all endpoints
- Rate limiting behavior
Integration Tests
- Track event and verify in export
- Create funnel and get conversion data
- Create dashboard with charts
- Profile identification and merging
- GDPR data export and deletion
Comparison with Other Plugins
| Aspect | Supabase | n8n | OpenPanel |
|---|---|---|---|
| Primary Focus | Database/Backend | Automation | Analytics |
| Auth Method | JWT Keys | API Key | Client ID/Secret |
| Main APIs | PostgREST, GoTrue | REST API | Track, Export |
| Tools | 70 | 56 | 74 |
| Phases | 3 | 1 | 3 |
References
Created: 2025-11-30 Author: Claude AI Assistant Status: Design Phase