Manage Mixpanel Headless authentication: check session state, list/add/use accounts, run OAuth login, switch projects/workspaces, manage targets, and check bridge credentials.
69
83%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
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.
mp account add <name> --type service_account -u <username> -p <project_id> -r <region> themselves — this prompts for the secret with hidden inputParse $ARGUMENTS and route to the appropriate subcommand. With no
arguments, run session.
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:
mp loginRegion 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 browserAfter the user confirms they ran it, verify with account test:
python3 $PLUGIN_ROOT/skills/mixpanelyst/scripts/auth_manager.py account test
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.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).
This is a guided wizard. Do NOT run any script that handles secrets.
oauth_browser (recommended for laptops),
service_account (long-lived), or oauth_token (CI/agents)service_account: ask for username and project ID (numeric).
For oauth_token: ask for project ID and the env-var name holding the bearer.
For oauth_browser: project ID is OPTIONAL — mp account login will
backfill it after the PKCE flow.Now run this command — it will prompt for your service account secret with hidden input:
mp account add <NAME> --type service_account --username <USERNAME> --project <PROJECT_ID> --region <REGION>For OAuth browser, prefer the one-shot mp login (covered by the "login"
branch above):
mp login --name <NAME> --region <REGION>For full control over registration before the PKCE flow, the explicit two-step is still available:
mp account add <NAME> --type oauth_browser --region <REGION>
mp account login <NAME> # opens browser for PKCE flowReplace placeholders with the values collected above.
account test:
python3 $PLUGIN_ROOT/skills/mixpanelyst/scripts/auth_manager.py account test <NAME>result.ok field.If a name is provided:
python3 $PLUGIN_ROOT/skills/mixpanelyst/scripts/auth_manager.py account use <name>If no name:
account list to show available accountsaccount use with the chosen nameOn state: ok, show one line: "Switched to active.account (project active.project)".
On state: error, show error.message.
Run: python3 $PLUGIN_ROOT/skills/mixpanelyst/scripts/auth_manager.py account login <name>
Tell the user a browser window will open for Mixpanel authentication. Wait for the JSON response.
On state: ok: "OAuth login successful! logged_in_as.user.email, token
valid until logged_in_as.expires_at."
On state: error: Show error.message and suggest retrying.
Run: python3 $PLUGIN_ROOT/skills/mixpanelyst/scripts/auth_manager.py account test [name]
The subcommand never raises — state is always ok. Read result.ok to
determine whether the credentials worked:
result.ok: true → "Connected as result.user.email ·
result.accessible_project_count accessible projects."result.ok: false → "Test failed: result.error."Run: python3 $PLUGIN_ROOT/skills/mixpanelyst/scripts/auth_manager.py project list
Present items as a table: organization, project name, project ID. Mark the
active project (is_active: true) with a star. Suggest the project-use workflow
in this skill to switch.
If no ID: run project list first, then ask which to switch to.
Run: python3 $PLUGIN_ROOT/skills/mixpanelyst/scripts/auth_manager.py project use <PROJECT_ID>
On state: ok: "Switched to project active.project."
On state: error: Show error.message.
Run: python3 $PLUGIN_ROOT/skills/mixpanelyst/scripts/auth_manager.py workspace list
Present items as a table: workspace ID, name, is_default. Mark the
active workspace with a star. Mention the parent project from
project.name (project.id).
Run: python3 $PLUGIN_ROOT/skills/mixpanelyst/scripts/auth_manager.py workspace use <WORKSPACE_ID>
On state: ok: "Pinned workspace active.workspace."
Run: python3 $PLUGIN_ROOT/skills/mixpanelyst/scripts/auth_manager.py target list
Targets are saved (account, project, workspace?) triples — named cursor positions. Present as a table: name, account, project, workspace.
Guided wizard — collect target name, account name, project ID, optional workspace ID. Then either invoke the auth_manager directly:
python3 $PLUGIN_ROOT/skills/mixpanelyst/scripts/auth_manager.py target add <NAME> --account <ACCT> --project <PROJ> [--workspace <WS>]Or guide the user to mp target add <NAME> --account <ACCT> --project <PROJ> [--workspace <WS>].
Run: python3 $PLUGIN_ROOT/skills/mixpanelyst/scripts/auth_manager.py target use <name>
Applies all three axes (account / project / workspace) to [active]
in a single atomic config write.
Run: python3 $PLUGIN_ROOT/skills/mixpanelyst/scripts/auth_manager.py bridge status
Parse the JSON:
bridge is null → "No bridge file found. To create one, run
mp account export-bridge --to <path> on your host machine."bridge is non-null → show bridge.path, bridge.account.name
(bridge.account.type), pinned bridge.project / bridge.workspace if set,
and any custom bridge.headers.MP_OAUTH_TOKEN)For non-interactive contexts (CI, agents, ephemeral environments) where the PKCE browser flow isn't viable, set:
export MP_OAUTH_TOKEN=<bearer-token>
export MP_PROJECT_ID=<project-id>
export MP_REGION=<us|eu|in>The library builds an Authorization: Bearer <token> header for every
Mixpanel endpoint. The full service-account env-var set (MP_USERNAME +
MP_SECRET + MP_PROJECT_ID + MP_REGION) takes precedence when both
sets are complete, so this is safe to add to a shell that already exports
the service-account vars.
error.message verbatim — it names the fix11c74d6
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.