@posthog/pi
PostHog extension package for pi coding agent.
It currently provides two capabilities:
- LLM Analytics for pi — captures generations, tool executions, and traces as structured
$ai_*events in PostHog. - PostHog MCP bridge for pi — connects pi to the PostHog MCP server and dynamically exposes PostHog MCP tools inside pi.
Install
pi install npm:@posthog/pi
Or for project-local install:
pi install -l npm:@posthog/pi
Quick start
Use PostHog MCP inside pi
Set a PostHog personal API key and start pi:
export POSTHOG_PERSONAL_API_KEY="phx_your_personal_api_key"
pi
You can also pass the full auth header instead:
export POSTHOG_AUTH_HEADER="Bearer phx_your_personal_api_key"
pi
By default, the extension connects to:
https://mcp.posthog.com/mcp- MCP version header:
x-posthog-mcp-version: 2
When connected, PostHog MCP tools are registered dynamically in pi and are callable like any other pi tool.
Useful commands:
/posthog-mcp-status— show connection and config status/posthog-mcp-reload— reconnect and refresh MCP tools
Send pi traces to PostHog LLM Analytics
Set your project API key:
export POSTHOG_API_KEY="phc_your_project_key"
pi
Configuration
MCP bridge
Examples:
# expose all default PostHog MCP v2 tools
export POSTHOG_PERSONAL_API_KEY="phx_..."
# narrow the tool surface
export POSTHOG_MCP_FEATURES="sql,llm_analytics,error_tracking,flags,experiments"
# or allowlist exact tools
export POSTHOG_MCP_TOOLS="execute-sql,dashboard-get,feature-flag-get-all"
# keep large results out of context
export POSTHOG_MCP_SPILL_TO_FILE="true"
export POSTHOG_MCP_MAX_INLINE_CHARS="12000"
LLM analytics / tracing
If POSTHOG_DISTINCT_ID is set, @posthog/pi calls identify() once on session start for that distinct ID. If the value looks like an email address, it is also sent as the email person property.
If POSTHOG_DISTINCT_ID is not set, @posthog/pi will try to discover your identity from POSTHOG_PERSONAL_API_KEY (or personalApiKey in ~/.pi/agent/posthog.json) and use that as distinct_id. If discovery fails, it falls back to session IDs (pi:...).
What gets captured
$ai_generation
Captured on every LLM call (one per turn).
$ai_span
Captured for each tool execution (read, write, edit, bash, etc.).
$ai_trace
Captured when an agent run completes (one per user prompt).
Trace Grouping
message(default): Each user prompt creates a new trace. Multiple LLM turns within one prompt (e.g., tool use loops) are grouped under the same trace.session: All generations within a session window are grouped under one trace. A new trace starts aftersessionWindowMinutesof inactivity.
Privacy Mode
When POSTHOG_PRIVACY_MODE=true, all LLM input/output content, user prompts, tool inputs, and tool outputs are redacted (sent as null). Token counts, costs, latency, and model metadata are still captured.
Even when privacy mode is off, sensitive keys in tool inputs/outputs (e.g. api_key, token, secret, password, authorization) are automatically redacted.
Subagent Detection
When used with pi-subagents, the extension automatically detects subagent names from --append-system-prompt CLI args and includes them in $ai_agent_name as projectName/subagentName.
Requirements
- Node.js >= 22
Development
Local development with pi
Run the extension directly from source:
cd /path/to/posthog-pi
pnpm install
# Use a PostHog personal API key for MCP
export POSTHOG_PERSONAL_API_KEY="phx_..."
# Start pi with the local extension source
pi -e ./src/index.ts
Useful commands inside pi:
/posthog-mcp-status
/posthog-mcp-reload
If you prefer to install the package into pi locally instead of using -e:
cd /path/to/posthog-pi
pi install -l .
# then launch pi normally
pi
If large MCP results are causing compaction or context pressure during development, keep spill-to-file enabled (the default) or set it explicitly:
export POSTHOG_MCP_SPILL_TO_FILE="true"
export POSTHOG_MCP_MAX_INLINE_CHARS="12000"
export POSTHOG_MCP_TEMP_DIR="/tmp/posthog-mcp"
Development commands
# Install dependencies
pnpm install
# Test with pi (without installing)
pi -e ./src/index.ts
# Type check
pnpm typecheck
# Lint (oxfmt)
pnpm lint
# Format
pnpm lint:fix
# Run tests (vitest)
pnpm test
License
MIT