SuperAPI AI Directory

pm-copilot

Combine Help Scout tickets and ProductLift feature requests into prioritized product plans, scoring themes by cross-source convergence and scrubbing PII.

Open website

About this tool

pm-copilot is an MCP (Model Context Protocol) server that helps product managers decide what to build next by triangulating customer support tickets, feature requests, and AI support agent conversations. It is designed to address the blind spot in ticket-driven prioritization that misses issues handled by AI support agents (deflection).

Main capabilities:

  • Signal triangulation: matches support tickets with feature requests, identifies convergent themes, and gives convergent themes a 2x priority boost.
  • Deflection blind spot handling: questions answered by AI support agents never become tickets, so ticket-based prioritization underestimates every topic handled by the bot. Chatbase conversations are introduced as a third type of signal and provide a self_serve_failure_rate (self-serve failure rate) for each topic.
  • Composability: pass churn or traffic data from other MCP servers into generate_product_plan via kpi_context, and the methodology adjusts priorities accordingly.

Main MCP tools provided:

  • synthesize_feedback: returns themes sorted by priority score, with each theme including category counts, convergence flags, evidence summaries, and representative quotes. About 15KB under summary details, and up to hundreds of KB under full. Supports general filtering.
  • generate_product_plan: builds a prioritized plan with evidence and customer quotes. Accepts general filter conditions and additional parameters.
  • get_theme_evidence: drills into a single theme and returns the specific tickets, feature requests, and chat records behind it, sorted by most recent first, including ticket numbers, request URLs, votes, channels, and dates. Passing the same general filter conditions within a few minutes after an analysis call can reuse cached data and will not initiate new API calls. Returns identifiers, metadata, and cleaned titles (for chats, the opening customer message truncated to 200 characters), rather than full conversations.
  • get_feature_requests: raw ProductLift access. Each request includes its public url.
  • list_sources: lists the configured mailboxes, portals, and agents, as well as chatbase_conversation_sources when Chatbase is set up (that is, the values accepted by source_filter). Never returns secrets or customer data.No parameters.

Usage:

  • Requires Node 20+. Not published to npm; install from source.
  • The .env file is located in the repository root; the server loads it from there no matter which working directory it is started from.
  • Configure at least one data source; the analysis adapts to the sources that are set. Without HelpScout there are no support tickets, and topics have no severity scores or convergence boosts; ProductLift and Chatbase still rank topics by frequency and votes.
  • Chatbase API access requires the Standard plan or higher; on lower plans the deflection signal becomes a warning. One agent per product provides product-level attribution; shared inboxes do not.
  • Add to the Claude desktop configuration: ~/Library/Application Support/Claude/claude_desktop_config.json. Or open Claude Code in the repository, and it will prompt you to approve the project .mcp.json. After restarting the client, have it run list_sources, and it should list the configured sources.

Use cases:

  • A product manager needs to decide what to build next based on customer feedback.
  • Need to analyze a large number of signals across multiple products (e.g., 4 products) (e.g., 3,353 signals in a 30-day window: 1,678 support tickets, 276 feature requests, 1,399 AI support agent conversations).
  • Want to prioritize using a coverage formula with KPI context (churn, conversion data).

Limitations:

  • Topic matching uses keyword lists rather than embeddings or an LLM classifier, so recall comes at a cost. On the 86 submitted example fixtures, configuration v3 scored a micro precision of 96.1%, recall of 99.0%, F1 of 97.5%, and a miss rate of 1.3%; that number is in-sample (the configuration was tuned for it), and serves only as a regression gate. On held-out real chat data, one third of conversations still fail to match any topic.
  • All customer text is scrubbed before it enters the analysis or leaves the server: Social Security numbers, credit cards (Luhn-validated), email addresses, and phone numbers (US format and +-prefixed international format) are redacted, and URLs in feature requests are also scrubbed. The customer email field is always [REDACTED]. Agent/admin replies, internal notes, attachments, voter identities, commenter names, Chatbase assistant turns, lead forms, user IDs, and countryHome completely excluded. preview_only: true on generate_product_plan shows what would be sent without fetching data. Every response includes pii_scrubbing_applied and pii_categories_redacted.
  • Deflection signals never affect severity, vote momentum, or convergence bonus. Each theme carries deflected_count (conversations matching that theme), self_serve_failure_rate (the proportion of those where the agent's lowest answer confidence is below 0.5), mean_answer_confidence (the mean of those same scores). Chatbase does not document what its min_score measures, so these are evidence for the LLM to weigh, not part of the scoring. The analysis also counts conversations by channel (chatbase_sources). Unrecognized source_filter values are passed through with a warning rather than rejected. Without Chatbase, the deflection fields are absent.

Methodology (pm-copilot://methodology, version v2.2, from the author's product planning framework of shipping 9 products to 1M+ users over 7 years) Core rules:

  • The 5% rule: roughly 5% of what customers ask for gets done each month; the framework picks which 5%.
  • Convergent signals win: themes appearing in both tickets and feature requests are the highest-confidence signal.
  • Reactive > proactive: broken things drive churn. A missing feature can be tolerated; a bug cannot.
  • Business metrics override the formula: rising churn or falling conversion changes everything. Every generate_product_plan response links to it and tells Claude to apply it when setting kpi_context. Whether it is read depends on whether the client surfaces the resource.

Theme configuration: themes.config.json in the repository root defines themes, is read at runtime, and requires no rebuild to edit. It ships with 18 themes across 12 categories; add more in the themes array. Unmatched data points use bigram/trigram frequency mining to surface emerging patterns. Single-word keywords are matched on word boundaries with optional regular plurals. Multi-word keywords are also matched on word boundaries. After editing, run npm run eval to catch keywords firing on the wrong theme.

Scoring formula:

  • Frequency (0.35): data point counts, across themesNormalization. Includes deflection signals.
  • Severity (0.35): reactive signals only. Thread count, recency (7-day half-life decay), and a bonus for the highest-severity matching label.
  • Vote momentum (0.30): proactive signals only. 80% votes, 20% comments.
  • Convergence (2x): applied when a topic has both reactive and proactive signals. Deflection signals do not trigger it. Frequency and vote momentum are normalized against the top topic in the same invocation, so scores are relative to the same analysis window. Compare rankings across invocations, not raw scores.

Troubleshooting:

  • No data sources configured: Check that .env exists at the repository root and sets at least one source.
  • Missing HELPSCOUT_APP_SECRET (or _ID): Set both HelpScout values, or remove both to run without HelpScout.
  • HelpScout authentication expires or is invalid on every invocation (403): If the token request succeeds but API calls return 403, the HelpScout user who owns the OAuth app is deactivated or has lost access. Rotating keys will not help; create a new app from an active user profile and update both HELPSCOUT_* values.
  • Changes not taking effect: The client runs the compiled dist/. Run npm run build and restart the client.
  • No HelpScout mailbox named "...": Run list_sources to get the exact name, or pass mailbox_id.
  • No portal named "..." found / No ProductLift portal named "...": The portal must be in PRODUCTLIFT_PORTALS (or the single-portal variable). Run list_sources.
  • Chatbase warning: API access requires a Chatbase Standard plan or higher. The rest of the analysis will still run; only the deflection fields are missing.
  • chatbase_agents is empty in list_sources: Set both CHATBASE_API_KEY and one of CHATBASE_AGENTS / CHATBASE_AGENT_ID. The key alone does not configure anything.

Contributing: See CONTRIBUTING.md.