关于 PM Copilot
PM Copilot 是一个 MCP 服务,将 HelpScout 工单、ProductLift 功能请求和 Chatbase AI 客服对话汇总分析,帮助产品经理确定下一步开发方向。它面向产品经理,区别在于把 AI 客服中被自助解决的问题也纳入信号来源。
主要功能
- 01汇总工单、功能请求与 AI 客服对话三类信号
- 02工单与功能请求匹配后提升收敛主题的优先级
- 03输出每个主题的自助失败率与平均回答置信度
- 04按主题返回原始记录与引用的追溯工具
- 05支持将外部 MCP 服务的业务指标作为上下文输入
适用场景
- 01根据客户反馈排列季度产品开发优先级
- 02查找同时出现在工单和功能请求中的共同问题
- 03评估 AI 客服未能解决的问题并决定是否开发对应功能
MCP 相关
该项目是 MCP 服务,通过 synthesize_feedback、generate_product_plan 等工具向 MCP 客户端提供分析结果,并可接收其他 MCP 服务提供的指标数据。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
PM Copilot
一个 MCP 服务,可交叉分析客户支持工单、功能请求和 AI 支持 Agent 对话,帮助 PM 决定接下来要开发什么。
实际结果: 在一个为期 30 天的时间段内分析了 3,353 条信号:1,678 个支持工单、276 个功能请求,以及来自 4 款产品的 1,399 段 AI 支持 Agent 对话。
仅分析工单永远无法发现这些聊天中的信号。
阅读完整故事: 我构建了一个改变产品优先级排序方式的 MCP 服务
有何不同
- 信号交叉分析。 将支持工单与功能请求进行匹配,找出趋同主题,并将这些主题的优先级提高 2 倍。
- 遗漏的拦截信号。 AI 支持 Agent 会回答那些永远不会转化为工单的问题,因此,基于工单的优先级排序会低估机器人处理的所有主题。Chatbase 对话作为第三类信号纳入分析,并为每个主题提供
self_serve_failure_rate。 - 可组合性。 通过
kpi_context将其他 MCP 服务中的流失率或流量数据传入generate_product_plan,方法会据此调整优先级。
架构
graph TD
A[Claude Desktop / Code] -->|stdio| B[pm-copilot]
A -->|stdio| C[Metabase MCP]
A -->|stdio| D[Google Analytics MCP]
B -->|Reactive| E[HelpScout: tickets]
B -->|Proactive| F[ProductLift: feature requests]
B -->|Deflected| I[Chatbase: AI agent chats]
C -->|Quantitative| G[Conversion, Churn, Revenue]
D -->|Acquisition| H[Traffic, Channels, Trends]
B -.->|kpi_context| A
快速开始
需要 Node 20+。项目未发布到 npm,请从源代码安装:
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
.env 文件位于仓库根目录。无论从哪个工作目录启动服务,它都会从那里加载该文件。
凭据
至少配置一个数据源;分析会根据你配置的数据源进行调整。如果没有 HelpScout,就没有支持工单,因此主题不会获得严重程度评分或趋同加权;ProductLift 和 Chatbase 仍会按频次和投票数对主题排序。
| 变量 | 必需 | 说明 |
|---|---|---|
HELPSCOUT_APP_ID | 否 | 来自 https://secure.helpscout.net/apps/custom/ 的 OAuth 应用 ID(两项要么都设置,要么都不设置) |
HELPSCOUT_APP_SECRET | 否 | OAuth 应用密钥 |
PRODUCTLIFT_PORTALS | 否 | 多门户:name|url|key,name2|url2|key2 |
PRODUCTLIFT_PORTAL_URL | 否 | 单个门户 URL |
PRODUCTLIFT_API_KEY | 否 | 单个门户的 Bearer 令牌 |
PRODUCTLIFT_PORTAL_NAME | 否 | 门户显示名称(默认值:default) |
CHATBASE_API_KEY | 否 | Chatbase → Settings → API keys 中的账户级密钥 |
CHATBASE_AGENTS | 否 | 多个 Agent:name|agentId,name2|agentId2 |
CHATBASE_AGENT_ID | 否 | 单个 Agent ID |
CHATBASE_AGENT_NAME | 否 | 单个 Agent 显示名称(默认值:default) |
Chatbase API 需要 Standard 套餐或更高级别;如果套餐较低,拦截信号会显示为警告。每款产品使用一个 Agent,能提供产品级归因;而共用邮箱则无法做到这一点。
Claude Desktop
添加到 ~/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
或者在仓库中打开 Claude Code:它会提示你批准项目的 .mcp.json。
验证
重启客户端,并让它运行 list_sources。它应列出你配置的数据源:HelpScout 邮箱、ProductLift 门户和 Chatbase Agent。
工具
常用筛选条件
synthesize_feedback 和 generate_product_plan 共用。
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
timeframe_days | number | 30 | 回溯天数(1-90) |
top_voted_limit | number | 50 | 每个门户中获票数最高的请求(1-200)。时间范围内的近期请求始终会额外包含在内 |
mailbox_id | string | — | HelpScout 邮箱 ID |
mailbox_name | string | — | HelpScout 邮箱名称(不区分大小写),会解析为 ID |
portal_name | string | — | ProductLift 门户 |
agent_name | string | — | Chatbase Agent |
source_filter | string | — | Chatbase 对话来源,多个来源以逗号分隔(例如 Widget or Iframe 或 WhatsApp,API)。不区分大小写 |
include_comments | boolean | false | 同时获取功能请求中的客户评论文本(已清理;会移除姓名和管理员回复),用于主题匹配和引用。每条含评论的请求需额外调用一次,效果会略有提升;大型门户可能需要近一分钟 |
detail_level | string | "summary" | "summary"、"standard" 或 "full"。输出内容会逐级增加 |
运行 list_sources 查看有效的邮箱、门户、Agent 和来源名称。
synthesize_feedback
返回按优先级分数排序的主题,每个主题包含各类别的数量、收敛标记、证据摘要和代表性引文。summary 模式下约为 15 KB,full 模式下为数百 KB。仅支持常用筛选条件。
generate_product_plan
生成包含证据和客户引文的优先级计划。除常用筛选条件外,还支持:
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
kpi_context | string | — | 来自其他 MCP 服务的业务指标,按原样传入 |
max_priorities | number | 5 | 返回的优先事项数量(1-10) |
preview_only | boolean | false | 审核模式:显示将要发送的数据,但不获取数据 |
format | string | "json" | "json"(结构化)或 "markdown"(可直接阅读的简报) |
get_theme_evidence
深入查看某个主题:查看该主题背后的单条工单、功能请求和聊天记录,按时间从新到旧排列,并包含工单编号、请求 URL、投票数、渠道和日期。在分析调用后的几分钟内传入相同的常用筛选条件,即可复用缓存数据,不会发起新的 API 调用。返回标识符、元数据和已清理的标题(对于聊天记录,是截断至 200 个字符的客户开场消息),不返回完整对话。
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
theme_id | string | — | 分析结果中的 theme_id,例如 booking-scheduling |
source | string | "all" | "all"、"tickets"、"feature_requests" 或 "chats" |
limit | number | 25 | 每个来源返回的记录数(1-200),避免某个繁忙来源挤占其他来源的结果 |
此外还支持常用筛选条件。
get_feature_requests
直接访问 ProductLift 原始数据。每个请求都包含其公开的 url。
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
portal_name | string | — | 筛选单个门户 |
include_comments | boolean | true | 包含每条请求的评论 |
status | string | — | 按状态筛选(不区分大小写),例如 open、planned、completed |
limit | number | — | 每个门户返回的请求数(1-500),在状态筛选和排序后应用。仅获取保留请求的评论 |
sort | string | — | "votes" 或 "recent"。省略则保留门户原有顺序 |
list_sources
列出已配置的邮箱、门户和 Agent;如果已配置 Chatbase,还会列出 chatbase_conversation_sources(即 source_filter 接受的值)。不会返回密钥或客户数据。无需参数。
信号类别
| 类别 | 来源 | 含义 | 影响 |
|---|---|---|---|
| 响应式 | HelpScout 工单 | 某些功能出了问题 | 频率、严重程度、信号汇聚 |
| 主动式 | ProductLift 请求 | 用户想要某些功能 | 频率、投票势头、信号汇聚 |
| 已化解 | Chatbase 对话 | 用户提出了问题,自助服务可能解决了,也可能没有 | 仅频率 |
已化解信号不会影响严重程度、投票势头或信号汇聚加成。每个主题都会包含:
deflected_count:与该主题匹配的对话数量self_serve_failure_rate:这些对话中 Agent 的最低答案置信度低于 0.5 的占比mean_answer_confidence:同一置信度分数的平均值
Chatbase 没有说明其 min_score 衡量的是什么,因此这些数据只是供大模型权衡的证据,不属于评分的一部分。分析还会统计各渠道的对话数量(chatbase_sources)。无法识别的 source_filter 值会在发出警告后直接传递,不会被拒绝。没有 Chatbase 时,不会包含这些已化解信号字段。
输出示例
以下是 summary 详细程度下经过精简的 synthesize_feedback 响应。数值仅供参考。请注意,第一条引述中的电子邮件地址已脱敏。
{
"timeframe_days": 30,
"detail_level": "summary",
"pii_scrubbing_applied": true,
"pii_categories_redacted": ["email", "phone", "credit_card"],
"analysis": {
"total_data_points": 924,
"reactive_count": 548,
"proactive_count": 64,
"deflected_count": 312,
"themes": [
{
"theme_id": "booking-scheduling",
"label": "Booking & Scheduling",
"priority_score": 78.4,
"convergent": true,
"reactive_count": 211,
"proactive_count": 19,
"deflected_count": 96,
"self_serve_failure_rate": 0.41,
"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\"",
"[AI chat, answer confidence 0.31] \"how do i stop people booking on weekends\""
]
}
],
"emerging_themes": [{ "pattern": "csv export", "frequency": 12 }],
"unmatched_count": 38
}
}
组合使用
让 Claude 从其他 MCP 服务中提取流失率和转化率数据,并将其作为 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%.
方法论指出,流失率会覆盖公式,因此,即使另一个主题得分更高,与 Product A 完成率下降相关的主题也可能跃升至第 1 位。服务会对信号排序;KPI 上下文则提供判断依据。
方法论
pm-copilot://methodology 资源是我的产品规划框架,源自 7 年间将 9 款产品推向市场、服务超过 100 万用户的经验。核心规则如下:
- 5% 规则。 每个月,你大约只能完成客户所提需求的 5%。该框架会帮你挑选这 5%。
- 信号汇聚者胜出。 同时出现在工单和功能请求中的主题,是置信度最高的信号。
- 响应式 > 主动式。 故障会导致用户流失。缺少某项功能还能撑过去;错误则不行。
- 业务指标优先于公式。 流失率上升或转化率下降会改变一切。
该方法论采用版本控制(v2.2)。每个 generate_product_plan 响应都会链接到该方法论,并在设置了 kpi_context 时告知 Claude 应用它。是否会读取,取决于客户端是否展示资源。
评估
主题通过关键词列表进行匹配,不使用嵌入或大模型分类器。客户文本不会离开服务,并且相同输入始终会产生相同主题,因此可以审计排序结果。代价是召回率较低。
npm run eval 用于衡量这一指标。在已提交的 86 个示例测试集中,配置 v3 的微平均精确率为 96.1%,召回率为 99.0%,F1 分数为 97.5%,漏判率为 1.3%。这个数值来自样本内数据(配置就是根据这些数据调优的),因此它是一个回归测试门槛。在留出的真实聊天数据中,仍有三分之一的对话无法匹配任何主题。
完整结果、首次运行的发现及已知限制:docs/evaluation.md。
安全
所有客户文本在进入分析流程或离开服务之前都会经过脱敏处理:
- 社会安全号码、信用卡号(通过 Luhn 算法验证)、电子邮件地址和电话号码(美国格式及以
+开头的国际号码)都会被屏蔽,功能请求 URL 中的信息也会经过脱敏。客户电子邮件字段始终显示为[REDACTED]。 - Agent/管理员回复、内部备注、附件、投票者身份、评论者姓名,以及 Chatbase 助手轮次、潜在客户表单、用户 ID 和国家/地区信息都会被完全排除。
- 在
generate_product_plan中设置preview_only: true,即可查看将要发送的内容,而不获取数据。 - 每个响应都会包含
pii_scrubbing_applied和pii_categories_redacted。
详情、已知限制及报告流程:SECURITY.md。
主题配置
仓库根目录中的 themes.config.json 定义了主题。该文件会在运行时读取,因此修改后无需重新构建。文件内置了涵盖 12 个类别的 18 个主题;你可以将自己的主题添加到 themes 数组中。未匹配的数据点会通过二元组和三元组频率挖掘新兴模式。
单词关键字会按单词边界匹配,并可选匹配规则复数形式。多词关键字也会按单词边界匹配。编辑后,运行 npm run eval,检查是否有关键字错误地触发了其他主题。
评分公式
priority = (frequency × 0.35 + severity × 0.35 + vote_momentum × 0.30) × convergence_boost
- 频率(0.35):数据点数量,按主题归一化。包括转移信号。
- 严重程度(0.35):仅限响应式信号。线程数量、近期程度(按 7 天半衰期衰减),以及最高严重程度匹配标签带来的加权提升。
- 投票趋势(0.30):仅限主动信号。80% 计入投票,20% 计入评论。
- 聚合度(2 倍):当某个主题同时具有响应式和主动信号时应用。转移信号不会触发此项。
频率和投票趋势会根据同一次调用中的最高主题进行归一化,因此分数仅在单次分析窗口内具有相对意义。请比较不同调用之间的排名,而不是原始分数。
故障排除
No data sources configured。 检查仓库根目录中是否存在.env,并确认其中至少配置了一个数据源。HELPSCOUT_APP_SECRET is missing(或_ID)。 设置两个 HelpScout 值,或同时移除二者,以便在不使用 HelpScout 的情况下运行。- 每次调用都出现
HelpScout auth expired or invalid (403)。 如果令牌请求成功,但 API 调用返回 403,则拥有 OAuth 应用的 HelpScout 用户已停用或失去访问权限。更换密钥无济于事;请使用仍在使用的用户账号创建新应用,并更新两个HELPSCOUT_*值。 - 更改未生效。 客户端运行的是已编译的
dist/。运行npm run build并重启客户端。 No HelpScout mailbox named "…"。 运行list_sources查看准确名称,或传入mailbox_id。No portal found with name "…"/No ProductLift portal named "…"。 门户必须位于PRODUCTLIFT_PORTALS中(或配置在单门户变量中)。运行list_sources。- Chatbase 警告:
API access needs a Chatbase Standard plan or higher。 其余分析仍会运行;只有转移字段缺失。 list_sources中的chatbase_agents为空。 设置CHATBASE_API_KEY,并设置CHATBASE_AGENTS或CHATBASE_AGENT_ID中的一个。仅设置密钥不会配置任何内容。
贡献
请参阅 CONTRIBUTING.md。
许可证
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。