Back to MCP Servers

Pm Copilot

Triangulates HelpScout support tickets and ProductLift feature requests to generate prioritized product plans. Scores themes by convergence (same signal in both sources = 2x boost), scrubs PII, and accepts business metrics from other MCP servers via `kpi_context` for composable …

product-management
By dkships
269Updated 1 week agoTypeScriptMIT

Installation

npx -y pm-copilot

Configuration

{
  "mcpServers": {
    "pm-copilot": {
      "command": "npx",
      "args": ["-y", "pm-copilot"]
    }
  }
}

How to use

  1. Run the installation command above (if needed)
  2. Open your Claude Code settings file (~/.claude/settings.json)
  3. Add the configuration to the mcpServers section
  4. Restart Claude Code to apply changes

PM Copilot

An MCP server that triangulates customer support tickets and feature requests to help PMs decide what to build next.

TypeScript License: MIT MCP SDK Node.js


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.

Read the full story: I built an MCP server that changed how I prioritize products — why I built this, how convergent signals work in practice, and what I learned building with Claude Code.


What Makes This Different

  • 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 churn data from Metabase or traffic trends from Google Analytics into generate_product_plan via kpi_context, and the methodology adjusts priorities accordingly.
  • 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.
  • 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.

Architecture

graph TD
    A[Claude Desktop / Code] -->|stdio| B[pm-copilot]
    A -->|stdio| C[Metabase MCP]
    A -->|stdio| D[Google Analytics MCP]
    B -->|Qualitative| E[HelpScout: tickets]
    B -->|Qualitative| F[ProductLift: feature requests]
    C -->|Quantitative| G[Conversion, Churn, Revenue]
    D -->|Acquisition| H[Traffic, Channels, Trends]
    B -.->|kpi_context| A

Claude 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.

Quick Start

git clone https://github.com/dkships/pm-copilot.git
cd pm-copilot
npm install
cp .env.example .env   # Edit with your credentials
npm run build

Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "pm-copilot": {
      "command": "node",
      "args": ["/absolute/path/to/pm-copilot/dist/index.js"]
    }
  }
}

Claude Code

claude mcp add pm-copilot -- node /absolute/path/to/pm-copilot/dist/index.js

Or use the .mcp.json already in the project root — Claude Code picks it up automatically.

Tools

synthesize_feedback

Cross-references HelpScout tickets and ProductLift feature requests, returns theme-matched analysis with priority scores.

ParameterTypeDefaultDescription
timeframe_daysnumber30Days to look back (1-90)
top_voted_limitnumber50Max feature requests by vote count
mailbox_idstringHelpScout mailbox filter (raw ID)
mailbox_namestringHelpScout mailbox name (case-insensitive); auto-resolved to an ID. Run list_sources to see names
portal_namestringProductLift portal filter
detail_levelstring"summary""summary", "standard", or "full". Output size scales with data volume — for one 30-day mailbox, roughly 15KB / 60KB / 360KB

Returns themes sorted by priority score, each with reactive/proactive counts, convergence flag, evidence summaries, and representative customer quotes.

generate_product_plan

Builds a prioritized product plan with evidence and customer quotes. Accepts external business metrics via kpi_context.

ParameterTypeDefaultDescription
timeframe_daysnumber30Days to look back (1-90)
top_voted_limitnumber50Max feature requests by vote count
mailbox_idstringHelpScout mailbox filter (raw ID)
mailbox_namestringHelpScout mailbox name (case-insensitive); auto-resolved to an ID. Run list_sources to see names
portal_namestringProductLift portal filter
kpi_contextstringBusiness metrics from other MCP servers
max_prioritiesnumber5Number of priorities to return (1-10)
preview_onlybooleanfalseAudit mode: show what data would be sent
detail_levelstring"summary""summary", "standard", or "full". Output size scales with data volume — for one 30-day mailbox, roughly 5KB / 21KB / 375KB
formatstring"json""json" (structured, composable) or "markdown" (ready-to-read product brief)

get_feature_requests

Raw ProductLift data access for browsing feature requests directly. Each request includes its public url.

ParameterTypeDefaultDescription
portal_namestringFilter to a specific portal
include_commentsbooleantrueInclude comments on each request
statusstringFilter to requests with this status (case-insensitive), e.g. open, planned, completed

list_sources

Lists the data sources the server is connected to — HelpScout mailboxes (id + name) and ProductLift portals (name + url) — so you can discover the names to pass to mailbox_name / portal_name. Read-only; never returns API keys or customer data. Takes no parameters.

Example output

A trimmed synthesize_feedback response at the default summary detail level. Values are illustrative; note the PII scrubbing applied to the customer quote.

{
  "timeframe_days": 30,
  "detail_level": "summary",
  "portal_name": "all",
  "fetched_at": "2026-06-01T16:00:00.000Z",
  "pii_scrubbing_applied": true,
  "pii_categories_redacted": ["email", "phone"],
  "analysis": {
    "total_data_points": 612,
    "reactive_count": 548,
    "proactive_count": 64,
    "themes": [
      {
        "theme_id": "booking-scheduling",
        "label": "Booking & Scheduling",
        "category": "Core Product",
        "priority_score": 87.1,
        "convergent": true,
        "signal_type": "convergent",
        "reactive_count": 211,
        "proactive_count": 19,
        "evidence_summary": "230 signals (211 tickets, 19 requests). Convergent across both sources.",
        "representative_quotes": [
          "[Support ticket] \"Double-booked slots again after the timezone change — reach me at [EMAIL REDACTED]\"",
          "[Feature request, 47 votes] \"Let me block buffer time between meetings\""
        ]
      },
      {
        "theme_id": "billing-payment",
        "label": "Billing & Payment",
        "category": "Monetization",
        "priority_score": 64.3,
        "convergent": false,
        "signal_type": "reactive",
        "reactive_count": 188,
        "proactive_count": 0,
        "evidence_summary": "188 signals (188 tickets, 0 requests). Reactive only.",
        "representative_quotes": [
          "[Support ticket] \"Charged twice for the annual plan\""
        ]
      }
    ],
    "emerging_themes": [
      { "pattern": "csv export", "frequency": 12 }
    ],
    "unmatched_count": 38
  }
}

Composability in Action

PM Copilot is designed to work alongside other MCP servers. Here's a worked example showing how a kpi_context override changes the ranking. Numbers are illustrative.

Step 1: The PM asks a single question

Pull our churn and booking completion data, then use pm-copilot to create a product plan using all of that context.

Step 2: pm-copilot analyzes the signals and returns the top priorities

#ThemeScoreTicketsFeature RequestsSignal
1Billing & Payment91.12,33620Convergent
2Booking & Scheduling87.168274Convergent
3Account & Licensing69.71,9558Convergent
4Team & Collaboration64.41,87519Convergent
5Whitelabel & Branding50.29230Convergent

Step 3: Business metrics from dashboards arrive as kpi_context

Product A: booking completion rate dropped from 74% to 66% over last
30 days. Monthly churn increased from 3.1% to 4.2%. Organic traffic
up 22% MoM. Product B: document completion rate steady at 81%.
Churn flat at 2.8%.

Step 4: Claude synthesizes both, and overrides the formula

The scores say Billing & Payment is #1. But the methodology says churn data overrides the formula. With Product A's booking completion dropping 8 points and churn spiking 35%, Booking & Scheduling becomes the real #1 — it's the core product breaking.

Product B deprioritized (stable metrics, no fire). Product A's 22% organic traffic growth elevates Whitelabel & Branding as a growth play.

The server provides the signal ranking. KPI context provides the override judgment. Claude synthesizes both.

Methodology

PM Copilot exposes a pm-copilot://methodology resource — David Kelly's product planning framework, built over 7 years of launching 9 products to 1M+ users.

Key principles:

  • The 5% rule — You complete ~5% of what customers ask for each month. The framework identifies which 5% matters most.
  • Convergent signals always win — Same theme in both support tickets AND feature requests = highest confidence signal.
  • Reactive > proactive — Broken stuff drives churn. You can survive not having a feature; you can't survive errors.
  • Business metrics override the formula — Rising churn, dropping conversion, or revenue impact can change everything.

The methodology is versioned (v2.0) and served as markdown content via the MCP resource protocol. Claude references it automatically when using generate_product_plan.

Security

Customer data flows through PM Copilot on its way to Claude. All text is scrubbed before it enters the analysis pipeline or leaves the server.

PII scrubbing

CategoryMethodReplacement
SSNsPattern match (XXX-XX-XXXX)[SSN REDACTED]
Credit cards13-19 digit sequences + Luhn validation[CC REDACTED]
Email addressesStandard email pattern[EMAIL REDACTED]
Phone numbersUS formats (+1, parens, dashes, dots)[PHONE REDACTED]
Customer email fieldAlways redacted[REDACTED]

What we exclude entirely

DataWhy
Agent/admin responsesOnly customer voice matters; agent replies could leak internal process
Internal HelpScout notesMay contain credentials, workarounds, internal discussions
AttachmentsCould contain screenshots with PII, invoices, medical documents
Voter identitiesVote counts are sufficient; individual identity adds no PM value

Audit controls

  • preview_only: true on generate_product_plan shows what data would be sent without fetching it
  • Every response includes pii_scrubbing_applied and pii_categories_redacted metadata
  • Data categories logged to stderr on each call (categories only, never content)

Development

npm install          # Install dependencies
npm run build        # Compile TypeScript
npm run dev          # Watch mode
npm start            # Run the server
npm test             # Run the test suit

…
View source on GitHub