· 1 observation
Technical updates · 1
Package or technical metadata updated
View technical comparison →Mixpanel v0.1.2
Analyze Mixpanel data with Python
From the developer
Not specified in the available declarations: limitations, pricing & account requirements.
Analyze my Mixpanel signup funnel with Python
Developer declarations; not independently tested. Listing last checked Nov 7, 2026. Package observed Nov 7, 2026.
From the marketplace listing
Use Mixpanel Headless skills to install and authenticate the mixpanel_headless Python SDK, discover Mixpanel schemas, run segmentation, funnel, retention, flow, and user-profile analyses, and build or inspect Mixpanel dashboards from Codex.
Language: English · Automatically detected from descriptions.
From the developer.
Exact text from the indicated source. A mention alone does not establish support for your task.
Interactive Read Write
Analyze Mixpanel data with the mixpanel_headless Python SDK and Codex skills.
Use Mixpanel Headless skills to install and authenticate the mixpanel_headless Python SDK, discover Mixpanel schemas, run segmentation, funnel, retention, flow, and user-profile analyses, and build or inspect Mixpanel dashboards from Codex.
· 1 observation
Package or technical metadata updated
View technical comparison →· 2 observations
Package or technical metadata updated
View technical comparison →Find competitors to follow as you develop your plugin.
Query and analyze your Mixpanel data directly in ChatGPT. Run segmentation, funnel, and retention analyses, explore your event taxonomy, ...
Shared terms: mixpanel, analyze, analyse, funnel
Honeycomb helps users investigate observability data, inspect traces, AI conversations, and anomaly signals, run queries and BubbleUp ana...
Shared terms: analyze, analyse, dashboard, inspect
Honeycomb helps users investigate observability data, inspect traces, AI conversations, and anomaly signals, run queries and BubbleUp ana...
Shared terms: analyze, analyse, dashboard, inspect
Browse and analyze your Centiment organizations, workspaces, surveys, and survey responses directly from ChatGPT. The Centiment MCP Serve...
Shared terms: analyze, discover, inspect
Analyze synthetic data and run privacy-preserving Secure Compute workflows in Subsalt.
Shared terms: analyze, analyse, run
---
name: dashboard-expert
description: >-
Full CRUD and analysis for Mixpanel dashboards. Use when the user asks to
build, create, analyze, read, understand, explain, modify, update, enhance,
or manage dashboards, or asks about dashboard layout, text cards, or report
arrangement. Covers dashboard analysis (read + understand existing), creation
(new builds), modification (update existing), and explanation (data-driven
annotation).
allowed-tools: Bash Read Write
---
# Dashboard Expert
Analyze, build, modify, and explain Mixpanel dashboards. Four modes — pick the one matching the user's intent.
## Mode Selection
| User intent | Mode | Key actions |
|---|---|---|
| "analyze/understand/read/explore dashboard" | **Analyze** | Read structure, execute reports, summarize |
| "build/create/make a new dashboard" | **Build** | Investigate data → plan → create with layout |
| "modify/update/add to/fix/improve dashboard" | **Modify** | Read current state → plan changes → execute |
| "explain/annotate/add insights to dashboard" | **Explain** | Analyze → generate data-driven text cards |
## Quick Start: Analyze an Existing Dashboard
```python
import json, re
import mixpanel_headless as mp
ws = mp.Workspace()
dash = ws.get_dashboard(DASHBOARD_ID)
layout, contents = dash.layout, dash.contents
# Extract structure: rows → cells → content items
for row_id in layout["order"]:
row = layout["rows"][row_id]
for cell in row["cells"]:
cid, ctype = str(cell["content_id"]), cell["content_type"]
if ctype in ("report", "report-link"):
info = contents["report"][cid]
print(f" [{cell['width']}w] {info['name']} ({info['type']}) {'[linked]' if ctype == 'report-link' else ''}")
elif ctype == "text":
md = contents["text"][cid].get("markdown", "")
is_header = bool(re.search(r'<h2[\s>]', md, re.I))
print(f" [{cell['width']}w] TEXT {'[SECTION]' if is_header else ''}: {md[:60]}...")
# Execute each report → DataFrame
for cid, info in contents.get("report", {}).items():
btype, bid = info["type"], info["id"]
if btype == "flows":
result = ws.query_saved_flows(bid)
else:
result = ws.query_saved_report(bid, bookmark_type=btype)
df = result.df
print(f"{info['name']}: {len(df)} rows, columns={list(df.columns)}")
```
## Quick Start: Build a New Dashboard
```python
from mixpanel_headless.types import CreateDashboardParams, DashboardRow, DashboardRowContent
import json
ws = mp.Workspace()
dau = ws.query("Login", math="dau", last=90)
def text(html):
return DashboardRowContent(content_type="text", content_params={"markdown": html})
def report(name, btype, result):
return DashboardRowContent(content_type="report", content_params={
"bookmark": {"name": name, "type": btype, "params": json.dumps(result.params)}})
dashboard = ws.create_dashboard(CreateDashboardParams(
title="Product Health", description="Core metrics.",
rows=[
DashboardRow(contents=[text("<h2>Product Health</h2><p>Core metrics.</p>")]),
DashboardRow(contents=[report("DAU (90d)", "insights", dau)]),
],
))
ws.pin_dashboard(dashboard.id) # Make visible to team
```
---
## Mode: Analyze
Read existing dashboards, execute their reports, and synthesize understanding.
### Phase A1: Read Dashboard Structure
```python
dash = ws.get_dashboard(dashboard_id)
layout, contents = dash.layout, dash.contents
```
Parse the response into a structured representation:
- **`layout["order"]`** — ordered list of row IDs
- **`layout["rows"][row_id]["cells"]`** — cells with `content_id`, `content_type`, `width`
- **`contents["report"][str(content_id)]`** — report metadata: `id` (bookmark_id), `name`, `type`, `params`, `description`
- **`contents["text"][str(content_id)]`** — text card: `markdown`
**Classify each cell:**
- `content_type == "report"` → owned, editable
- `content_type == "report-link"` → linked from another dashboard, read-onPreview of the first 4,000 characters. Read full instructions →
Referenced files: 4 — file references are metadata, not package contents.
---
name: mixpanel-auth
description: "Manage Mixpanel Headless authentication: check session state, list/add/use accounts, run OAuth login, switch projects/workspaces, manage targets, and check bridge credentials."
---
# Mixpanel Authentication Management
You manage Mixpanel credentials by shelling out to `auth_manager.py`. Every
subcommand emits exactly one JSON object to stdout — parse it and present the
result conversationally.
Before running bundled scripts, set `PLUGIN_ROOT` to the absolute path of the installed
`mixpanel-headless` plugin directory.
**Script path:** `python3 $PLUGIN_ROOT/skills/mixpanelyst/scripts/auth_manager.py`
**Schema:** Every response has `schema_version: 1` and a discriminated `state`
of `ok` | `needs_account` | `needs_project` | `error`. Errors emit JSON to
stdout (exit 0) so you can `json.loads` unconditionally — no try/except needed.
## Security Rules (NON-NEGOTIABLE)
- **NEVER ask for secrets (passwords, API secrets) in conversation** — they would be visible in history
- **NEVER pass secrets as CLI arguments** — visible in process list
- For account creation, guide the user to run `mp account add <name> --type service_account -u <username> -p <project_id> -r <region>` themselves — this prompts for the secret with hidden input
## Routing
Parse `$ARGUMENTS` and route to the appropriate subcommand. With no
arguments, run `session`.
### "login"
For first-time setup, the frictionless one-shot path is `mp login`. It
runs the right auth flow for the environment, derives the account name
from `/me`, and pins a default project. Tell the user to run:
```bash
mp login
```
Region behavior is auth-type-specific:
- `service_account` and `oauth_token` paths: probes `us → eu → in` and
uses the first 200.
- `oauth_browser` path (the bare-`mp login` default): commits to `us`
unless the user passes `--region eu` or `--region in`.
Optional flags they may want:
- `--name NAME` — override the derived account name
- `--region us|eu|in` — set the region explicitly (required for EU / India browser users)
- `--project ID` — skip the project picker
- `--service-account` — force the SA path (requires `MP_USERNAME` + `MP_SECRET` in env)
- `--token-env VAR` — force the static-bearer path (reads token from `$VAR`)
- `--no-browser` — print the authorization URL instead of launching a browser
After the user confirms they ran it, verify with `account test`:
`python3 $PLUGIN_ROOT/skills/mixpanelyst/scripts/auth_manager.py account test`
### No arguments or "session"
Run: `python3 $PLUGIN_ROOT/skills/mixpanelyst/scripts/auth_manager.py session`
Switch on `state`:
- **`ok`** — show one line: "Active: `account.name` → project `project.id`"
(add workspace `workspace.id` if non-null). Mention that
the account-list and project-list workflows in this skill exist if the user wants to switch.
- **`needs_account`** — no account configured. Show the first
`next[0].command` as the recommended onboarding step (the frictionless
`mp login` orchestrator); list the alternatives in `next[1]` (explicit
account add) and `next[2]` (`MP_OAUTH_TOKEN` env triple — best for
non-interactive contexts like CI or agents).
- **`needs_project`** — account configured but no project pinned. Tell the
user to run `mp project list` then `mp project use <id>`.
- **`error`** — show `error.message`. If `error.actionable` is true, the
message names a concrete next command.
### "account list"
Run: `python3 $PLUGIN_ROOT/skills/mixpanelyst/scripts/auth_manager.py account list`
Present `items` as a clean table: `name`, `type`, `region`, `is_active`.
Mark the active account with a star. If `referenced_by_targets` is non-empty
for any account, mention it ("`team` is referenced by targets: `ecom`").
If `items` is empty, show the `next` onboarding hints (same as `needs_account`).
### "account add"
This is a guided wizard. Do NOT run any script that handles secrets.
1. Ask for the **account name** (e.g., "personal", "team", "ci")
2. Preview of the first 4,000 characters. Read full instructions →
--- name: mixpanel-headless-setup description: This skill installs mixpanel_headless, pandas, numpy, matplotlib, seaborn, networkx, anytree, scipy (and pyarrow on Python 3.11+), then verifies Mixpanel credentials. It should be invoked when setting up a new environment for Mixpanel data analysis, when dependencies are missing, or when configuring service account or OAuth credentials for the first time. disable-model-invocation: false allowed-tools: Bash --- # mixpanel-headless — Setup Install dependencies and verify credentials for CodeMode analytics. ## Run Setup Before running bundled scripts, set `SKILL_DIR` to the absolute path of this `skills/setup` directory. ```bash bash $SKILL_DIR/scripts/setup.sh ``` This will: 1. Verify Python 3.10+ is available 2. Install `mixpanel_headless`, `pandas`, `numpy`, `matplotlib`, `seaborn`, `networkx>=3.0`, `anytree>=2.8.0`, `scipy`, and `pyarrow>=17.0` on Python 3.11+ (tries uv, pip in order) 3. Verify all packages import successfully (including pyarrow on 3.11+, networkx, anytree, and scipy) 4. Check for configured Mixpanel credentials (single schema — Account → Project → Workspace) ## Check Credentials After installation, check the active session: ```bash python3 $SKILL_DIR/../mixpanelyst/scripts/auth_manager.py session ``` Parse the JSON `state` field: - **`ok`** — credentials configured. Show `account.name` → project `project.id` and proceed to verification. - **`needs_account`** — no account configured. Read `next` for onboarding suggestions and follow "If Credentials Are Missing" below. - **`needs_project`** — account configured but no project pinned. Suggest `mp project list` then `mp project use <id>`. - **`error`** — show `error.message`. If `error.actionable` is true, the message names a concrete next command. ## If Credentials Are Missing If no credentials are configured, guide the user to one of these methods: ### Recommended: `mp login` The frictionless one-shot path. Tell the user to run: ```bash mp login ``` `mp login` runs the right auth flow for the environment, derives the account name from `/me`, and pins a default project. For laptops with a usable browser, this opens the PKCE flow; for environments with `MP_USERNAME` + `MP_SECRET` set, it skips the browser and uses the service-account path; for `MP_OAUTH_TOKEN` set, it uses the static bearer. Region behavior: - `service_account` and `oauth_token` paths probe `us → eu → in` when `--region` is omitted. - `oauth_browser` (the bare-`mp login` default) defaults to `us`. EU and India browser users must pass `--region eu` or `--region in`. Useful flags: `--name NAME`, `--region us|eu|in`, `--project ID`, `--service-account`, `--token-env VAR`, `--no-browser`, `--secret-stdin`. ### Alternative: Guided Setup (explicit account add) Use the `mixpanel-auth` skill's account-add workflow for a step-by-step walkthrough. The workflow never prompts for secrets in conversation — it instructs the user to run `mp account add ...` themselves so the secret is read with hidden input. Use this path when the user wants explicit control over the account name, region, and type at registration time. ### Alternative: Service-Account Environment Variables (temporary) For quick testing, set all four variables in the shell — the resolver picks them up directly without account registration: ```bash export MP_USERNAME="service-account-username" export MP_SECRET="service-account-secret" export MP_PROJECT_ID="12345" export MP_REGION="us" # or "eu", "in" ``` ### Alternative: Raw OAuth Bearer Token (best for agents / CI) If the user has an OAuth 2.0 access token from another source, they can use it directly without the PKCE browser flow: ```bash export MP_OAUTH_TOKEN="<bearer-token>" export MP_PROJECT_ID="12345" export MP_REGION="us" # or "eu", "in" ``` This is the recommended mode for non-interactive contexts. The full service-account env-var set (`MP_USERNAME` + `MP_SECRET` + `MP_PROJECT_ID` + `MP_REGION`) takes precede
Preview of the first 4,000 characters. Read full instructions →
Referenced files: 1 — file references are metadata, not package contents.
---
name: mixpanelyst
description: This skill should be used when the user asks about Mixpanel product analytics, event data, funnel analysis, retention curves, cohort analysis, segmentation queries, user behavior, conversion rates, churn, DAU/MAU, ARPU, revenue metrics, feature adoption, A/B test results, user paths, flow analysis, or any request to query, explore, visualize, or analyze Mixpanel data using Python. Also use when the user asks to read, write, or manage Mixpanel "business context" — the markdown documentation that grounds AI assistants in an organization's structure and goals.
allowed-tools: Bash Read Write WebFetch
---
# mixpanel_headless API Reference
Analyze Mixpanel data by writing and executing Python code using the `mixpanel_headless` library and `pandas`.
Before running bundled helper scripts, set `SKILL_DIR` to the absolute path of this
`skills/mixpanelyst` directory.
```python
import mixpanel_headless as mp
ws = mp.Workspace()
result = ws.query("Login", last=30)
print(result.df.head())
```
## Query Engines
| Question | Method | Returns |
|----------|--------|---------|
| How much? How many? Trends? | `ws.query()` | `QueryResult` |
| Do users convert through a sequence? | `ws.query_funnel()` | `FunnelQueryResult` |
| Do users come back? | `ws.query_retention()` | `RetentionQueryResult` |
| What paths do users take? | `ws.query_flow()` | `FlowQueryResult` |
| Who are they? What do they look like? | `ws.query_user()` | `UserQueryResult` |
All result types have a `.df` property returning a pandas DataFrame and a `.params` dict containing the bookmark JSON.
`FlowQueryResult` also has `.graph` (NetworkX DiGraph) and `.anytree` (list of tree roots).
**Quick lookups** use `python3 -c "..."` one-liners. **Multi-step analysis** writes `.py` files.
## Discovery — ALWAYS Do Both Steps Before Querying
Guessing event names causes silent empty results. Guessing API parameters causes TypeErrors and invalid queries. **Discover both the data schema AND the API surface before writing any query.**
### Step 1: Discover the data schema
```python
import mixpanel_headless as mp
from mixpanel_headless import Filter, GroupBy, Metric
ws = mp.Workspace()
# 1. Find real event names
events = ws.events()
top = ws.top_events(limit=10)
print("Events:", events[:20])
print("Top:", [(e.event, e.count) for e in top])
# 2. Find real property names for the event you'll query
props = ws.properties("Login") # use an actual event name from step 1
print("Properties:", props)
# 3. (Optional) Check property values to validate filter inputs
vals = ws.property_values("platform", event="Login")
print("Platforms:", vals)
```
### Step 2: Discover the API surface with `help.py`
**`help.py` is the source of truth for method signatures, parameter names, type constructors, and enum values.** The method signatures later in this document are summaries — always verify with `help.py` before using a method or type you haven't looked up.
**Never guess parameter names.** If you're unsure whether a parameter is called `property` or `math_property`, or what arguments `GroupBy()` accepts, run `help.py` first. Wrong parameter names cause TypeErrors that waste tool calls.
```bash
# Look up a query method BEFORE writing the query
python3 $SKILL_DIR/scripts/help.py Workspace.query
python3 $SKILL_DIR/scripts/help.py Workspace.query_funnel
# Look up types BEFORE constructing them
python3 $SKILL_DIR/scripts/help.py Filter # → classmethods: .equals(), .less_than(), etc.
python3 $SKILL_DIR/scripts/help.py Metric # → property=, NOT math_property=
python3 $SKILL_DIR/scripts/help.py GroupBy # → property, property_type only
python3 $SKILL_DIR/scripts/help.py MathType # → enum values
# Look up result types to know what columns .df returns
python3 $SKILL_DIR/scripts/help.py QueryResult
python3 $SKILL_DIR/scripts/help.py FlowQueryResult
# Search when you're not sure of the exact name
python3 $SKILL_DIR/scripts/help.py search Preview of the first 4,000 characters. Read full instructions →
Referenced files: 2 — file references are metadata, not package contents.
Publisher declarations from the archived package. These are separate from our research and the live service's terms.
Package observed Nov 7, 2026.
Plugin_646f53d9a40c8191a747ca268ab3d779
Download plugin data (JSON)Plugin details: served from cache. Prepared . Refreshed when plugin data changes or after 6 hours. Your account and Follow status are live.