An MCP server that triangulates customer support tickets and feature requests to help PMs decide what to build next. - Signal triangulation — Not just data access. Matches support tickets against feature requests to find convergent themes, then scores them with a weighted formula that gives convergent signals a 2x priority boost. - Composability — Designed to work with other MCP servers. Pass chur
Add this skill
npx mdskills install dkships/pm-copilotRobust MCP server with sophisticated signal triangulation, opinionated PM methodology, and strong PII controls
1# PM Copilot23An MCP server that triangulates customer support tickets and feature requests to help PMs decide what to build next.45[](#)6[](LICENSE)7[](#)8[](#)910---1112> **Real results:** Analyzed 2,370 signals (2,136 support tickets + 234 feature requests) across 3 products in 55 seconds. Identified 16 themes, 15 convergent. Top priority: Booking & Scheduling (score: 134.6) — 629 tickets + 77 feature requests pointing at the same problem.1314---1516## What Makes This Different1718- **Signal triangulation** — Not just data access. Matches support tickets against feature requests to find convergent themes, then scores them with a weighted formula that gives convergent signals a 2x priority boost.19- **Composability** — Designed to work *with* other MCP servers. Pass churn data from Metabase or traffic trends from Google Analytics into `generate_product_plan` via `kpi_context`, and the methodology adjusts priorities accordingly.20- **PM methodology built in** — Opinionated scoring based on 7 years of real product management across 9 products and 1M+ users. Not a generic framework — an actual decision-making process exposed as an MCP resource.21- **PII scrubbing** — Customer data never reaches the LLM unfiltered. SSNs, credit cards (Luhn-validated), emails, and phone numbers are redacted before analysis. Agent responses are filtered out of quotes.2223## Architecture2425```mermaid26graph TD27 A[Claude Desktop / Code] -->|stdio| B[pm-copilot]28 A -->|stdio| C[Metabase MCP]29 A -->|stdio| D[Google Analytics MCP]30 B -->|Qualitative| E[HelpScout: tickets]31 B -->|Qualitative| F[ProductLift: feature requests]32 C -->|Quantitative| G[Conversion, Churn, Revenue]33 D -->|Acquisition| H[Traffic, Channels, Trends]34 B -.->|kpi_context| A35```3637Claude orchestrates multiple MCP servers. PM Copilot handles qualitative customer signals. Other servers provide quantitative business metrics. The `kpi_context` parameter is the integration point — no point-to-point integrations required.3839## Quick Start4041```bash42git clone https://github.com/dkships/pm-copilot.git43cd pm-copilot44npm install45cp .env.example .env # Edit with your credentials46npm run build47```4849### Claude Desktop5051Add to `~/Library/Application Support/Claude/claude_desktop_config.json`:5253```json54{55 "mcpServers": {56 "pm-copilot": {57 "command": "node",58 "args": ["/absolute/path/to/pm-copilot/dist/index.js"]59 }60 }61}62```6364### Claude Code6566```bash67claude mcp add pm-copilot -- node /absolute/path/to/pm-copilot/dist/index.js68```6970Or use the `.mcp.json` already in the project root — Claude Code picks it up automatically.7172## Tools7374### `synthesize_feedback`7576Cross-references HelpScout tickets and ProductLift feature requests, returns theme-matched analysis with priority scores.7778| Parameter | Type | Default | Description |79|-----------|------|---------|-------------|80| `timeframe_days` | number | 30 | Days to look back (1-90) |81| `top_voted_limit` | number | 50 | Max feature requests by vote count |82| `mailbox_id` | string | — | HelpScout mailbox filter |83| `portal_name` | string | — | ProductLift portal filter |84| `detail_level` | string | `"summary"` | `"summary"` (~19KB), `"standard"` (~68KB), or `"full"` (~563KB) |8586Returns themes sorted by priority score, each with reactive/proactive counts, convergence flag, evidence summaries, and representative customer quotes.8788### `generate_product_plan`8990Builds a prioritized product plan with evidence and customer quotes. Accepts external business metrics via `kpi_context`.9192| Parameter | Type | Default | Description |93|-----------|------|---------|-------------|94| `timeframe_days` | number | 30 | Days to look back (1-90) |95| `top_voted_limit` | number | 50 | Max feature requests by vote count |96| `mailbox_id` | string | — | HelpScout mailbox filter |97| `portal_name` | string | — | ProductLift portal filter |98| `kpi_context` | string | — | Business metrics from other MCP servers |99| `max_priorities` | number | 5 | Number of priorities to return (1-10) |100| `preview_only` | boolean | false | Audit mode: show what data *would* be sent |101| `detail_level` | string | `"summary"` | `"summary"` (~7KB), `"standard"` (~21KB), or `"full"` (~584KB) |102103### `get_feature_requests`104105Raw ProductLift data access for browsing feature requests directly.106107| Parameter | Type | Default | Description |108|-----------|------|---------|-------------|109| `portal_name` | string | — | Filter to a specific portal |110| `include_comments` | boolean | true | Include comments on each request |111112## Composability in Action113114PM Copilot is designed to work alongside other MCP servers. Here's a real example using live data from 3 AppSumo Originals products.115116**Step 1: The PM asks a single question**117118> Pull our churn and booking completion data, then use pm-copilot to create a product plan using all of that context.119120**Step 2: pm-copilot analyzes 10,424 signals and returns the top priorities**121122| # | Theme | Score | Tickets | Feature Requests | Signal |123|---|-------|------:|--------:|-----------------:|--------|124| 1 | Billing & Payment | 91.1 | 2,336 | 20 | Convergent |125| 2 | Booking & Scheduling | 87.1 | 682 | 74 | Convergent |126| 3 | Account & Licensing | 69.7 | 1,955 | 8 | Convergent |127| 4 | Team & Collaboration | 64.4 | 1,875 | 19 | Convergent |128| 5 | Whitelabel & Branding | 50.2 | 92 | 30 | Convergent |129130**Step 3: Business metrics from dashboards arrive as `kpi_context`**131132```text133TidyCal: booking completion rate dropped from 74% to 66% over last13430 days. Monthly churn increased from 3.1% to 4.2%. Organic traffic135up 22% MoM. BreezeDoc: document completion rate steady at 81%.136Churn flat at 2.8%.137```138139**Step 4: Claude synthesizes both — and overrides the formula**140141The scores say Billing & Payment is #1. But the methodology says *churn data overrides the formula*. With TidyCal's booking completion dropping 8 points and churn spiking 35%, **Booking & Scheduling becomes the real #1** — it's the core product breaking.142143BreezeDoc deprioritized (stable metrics, no fire). TidyCal's 22% organic traffic growth elevates Whitelabel & Branding as a growth play.144145> The server provides the signal ranking. KPI context provides the override judgment. Claude synthesizes both.146147## Methodology148149PM Copilot exposes a `pm-copilot://methodology` resource — David Kelly's actual product planning framework built over 7 years of launching 9 products to 1M+ users at AppSumo Originals.150151Key principles:152- **The 5% rule** — You complete ~5% of what customers ask for each month. The framework identifies which 5% matters most.153- **Convergent signals always win** — Same theme in both support tickets AND feature requests = highest confidence signal.154- **Reactive > proactive** — Broken stuff drives churn. You can survive not having a feature; you can't survive errors.155- **Business metrics override the formula** — Rising churn, dropping conversion, or revenue impact can change everything.156157The methodology is versioned (v2.0) and served as markdown content via the MCP resource protocol. Claude references it automatically when using `generate_product_plan`.158159## Security160161Customer data flows through PM Copilot on its way to Claude. All text is scrubbed before it enters the analysis pipeline or leaves the server.162163### PII scrubbing164165| Category | Method | Replacement |166|----------|--------|-------------|167| SSNs | Pattern match (`XXX-XX-XXXX`) | `[SSN REDACTED]` |168| Credit cards | 13-19 digit sequences + Luhn validation | `[CREDIT CARD REDACTED]` |169| Email addresses | Standard email pattern | `[EMAIL REDACTED]` |170| Phone numbers | US formats (+1, parens, dashes, dots) | `[PHONE REDACTED]` |171| Customer email field | Always redacted | `[REDACTED]` |172173### What we exclude entirely174175| Data | Why |176|------|-----|177| Agent/admin responses | Only customer voice matters; agent replies could leak internal process |178| Internal HelpScout notes | May contain credentials, workarounds, internal discussions |179| Attachments | Could contain screenshots with PII, invoices, medical documents |180| Voter identities | Vote counts are sufficient; individual identity adds no PM value |181182### Audit controls183184- `preview_only: true` on `generate_product_plan` shows what data *would* be sent without fetching it185- Every response includes `pii_scrubbing_applied` and `pii_categories_redacted` metadata186- Data categories logged to stderr on each call (categories only, never content)187188## Development189190```bash191npm install # Install dependencies192npm run build # Compile TypeScript193npm run dev # Watch mode194npm start # Run the server195```196197### Theme configuration198199`themes.config.json` in the project root defines what themes to look for. Edit without rebuilding — loaded at runtime.200201Ships with 16 data-driven themes across 9 categories. Add your own by appending to the `themes` array. Unmatched data points are analyzed for emerging patterns using bigram/trigram frequency detection.202203### Scoring formula204205```206priority = (frequency × 0.35 + severity × 0.35 + vote_momentum × 0.30) × convergence_boost207```208209- **Frequency** (0.35): Count of data points, normalized across themes210- **Severity** (0.35): Reactive signals only — thread depth, recency (7-day half-life decay), tag boosts211- **Vote momentum** (0.30): Proactive signals only — 80% votes + 20% comments212- **Convergence** (2x): Applied when a theme has both reactive and proactive signals213214## Contributing2152161. Fork the repository2172. Create a feature branch (`git checkout -b feature/your-feature`)2183. Ensure `npm run build` succeeds with no errors2194. Follow existing patterns: tools use `registerTool`, API clients get their own module, PII scrubbing happens at the format layer2205. Open a pull request221222## License223224[MIT](LICENSE)225
Full transparency — inspect the skill content before installing.