PM Copilot について
PM Copilot は、HelpScout のチケット、ProductLift の機能リクエスト、Chatbase の AI アシスタントとの会話を分析し、優先順位付きのプロダクト計画を作成する MCP サーバーです。プロダクトマネージャー向けで、AI アシスタントが自己解決した問い合わせも独立したシグナルとして扱う点が特徴です。
主な機能
- 01チケット、機能リクエスト、チャット会話の3種類のシグナルを統合
- 02チケットと機能リクエストに共通するテーマの優先度を引き上げ
- 03テーマごとの自己解決失敗率を出力
- 04テーマの根拠となる記録を追跡できるツール
- 05他の MCP サーバーの KPI データを入力として受け付け
活用シーン
- 01顧客フィードバックに基づく四半期の開発優先順位の決定
- 02チケットと機能リクエストの両方に現れる問題の特定
- 03AI アシスタントが解決できなかった質問の確認
MCP 対応
MCP サーバーとして synthesize_feedback や generate_product_plan などのツールを MCP クライアントに提供します。他の MCP サーバーから渡されたビジネス指標も受け付けます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
PM Copilot
カスタマーサポートのチケット、機能リクエスト、AI サポートエージェントの会話を突き合わせて、PM が次に何を作るべきかを判断できるようにする MCP サーバーです。
実際の成果: ある 30 日間の期間で 3,353 件のシグナルを分析しました。内訳は 1,678 件のサポートチケット、276 件の機能リクエスト、4 つのプロダクトにまたがる 1,399 件の AI サポートエージェントの会話です。
チャットこそが、チケットのみの分析では決して見えないシグナルです。
詳しい経緯はこちら: I built an MCP server that changed how I prioritize products
このツールの違い
- シグナルの突き合わせ。 サポートチケットと機能リクエストを照合して収束するテーマを見つけ出し、収束するテーマには優先度を 2 倍に引き上げます。
- デフレクションの盲点。 AI サポートエージェントはチケットにならない質問に回答するため、チケットベースの優先順位付けではボットが対応するすべてのテーマを過小評価してしまいます。Chatbase の会話は 3 つ目のシグナルクラスとして取り込まれ、テーマごとの
self_serve_failure_rateが算出されます。 - コンポーザビリティ。 他の MCP サーバーからチャーンやトラフィックのデータを
kpi_context経由で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 はリポジトリのルートに置きます。サーバーは起動時の作業ディレクトリに関係なく、そこから読み込みます。
認証情報
少なくとも 1 つのソースを設定してください。分析は設定したものに合わせて適応します。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 | いいえ | マルチエージェント: name|agentId,name2|agentId2 |
CHATBASE_AGENT_ID | いいえ | 単一エージェントの ID |
CHATBASE_AGENT_NAME | いいえ | 単一エージェントの表示名(デフォルト: default) |
Chatbase API へのアクセスには Standard プラン以上が必要です。それより下のプランでは、デフレクションのシグナルは警告になります。プロダクトごとに 1 つのエージェントを割り当てると、共有メールボックスでは得られないプロダクト単位のアトリビューションが得られます。
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 のエージェントが一覧表示されるはずです。
ツール
共通フィルター
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 エージェント |
source_filter | string | — | Chatbase 会話ソース。複数の場合はカンマ区切り (例: Widget or Iframe または WhatsApp,API)。大文字と小文字を区別しません |
include_comments | boolean | false | 機能リクエストに対する顧客コメントのテキストも取得します (スクラブ済み。名前と管理者の返信は除外) 。テーマのマッチングと引用に使用します。コメント付きリクエストごとに 1 回追加呼び出しが必要で、わずかな効果がありますが、大規模なポータルでは 1 分近くかかることがあります |
detail_level | string | "summary" | "summary"、"standard"、または "full"。出力は各段階で増加します |
list_s を実行すると、有効なメールボックス、ポータル、エージェント、ソース名を確認できます。
synthesize_feedback
優先度スコアでソートされたテーマを返します。各テーマにはクラスごとのカウント、収束フラグ、エビデンスの要約、代表的な引用が含まれます。summary では約 15KB、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
1 つのテーマを詳しく調べます。その背後にある個々のチケット、機能リクエスト、チャットを新しい順に、チケット番号、リクエスト 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 | — | 1 つのポータルにフィルタリング |
include_comments | boolean | true | 各リクエストのコメントを含める |
status | string | — | ステータスでフィルタリング (大文字と小文字を区別しません)。例: open、planned、completed |
limit | number | — | ステータスフィルターとソート後に、ポータルごとに返すリクエスト数 (1〜500)。コメントは保持されたものに対してのみ取得されます |
sort | string | — | "votes" または "recent"。省略するとポータルの順序が保持されます |
list_sources
設定されているメールボックス、ポータル、エージェントを一覧表示します。また、Chatbase が設定されている場合は chatbase_conversation_sources (source_filter が受け入れる値) も表示します。キーや顧客データは決して返しません。パラメーターはありません。
シグナルのクラス
| クラス | ソース | 意味 | 反映先 |
|---|---|---|---|
| リアクティブ | HelpScout チケット | 何かが壊れている | 頻度、深刻度、収束性 |
| プロアクティブ | ProductLift リクエスト | 何かが求められている | 頻度、投票の勢い、収束性 |
| ディフレクテッド | Chatbase の会話 | 何かが質問され、セルフサービスで対応できたか、できなかったか | 頻度のみ |
ディフレクテッドシグナルは、深刻度、投票の勢い、収束性ブーストに一切影響しません。各テーマには以下が含まれます。
deflected_count: テーマに一致する会話self_serve_failure_rate: それらのうち、エージェントの最低回答信頼度が 0.5 を下回った割合mean_answer_confidence: 同じスコアの平均
Chatbase はその min_score が何を測定しているかを文書化していないため、これらは LLM が判断材料として重み付けするための証拠であり、スコアの一部ではありません。分析ではチャネルごとの会話数 (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 リソースは、9 つの製品を 100 万人以上のユーザーに届けた 7 年間の経験から生まれた私の製品計画フレームワークです。核心となるルールは以下のとおりです。
- 5% のルール。 毎月、顧客が求めるもののおよそ 5% を実現することになります。このフレームワークは、どの 5% を選ぶかを決めます。
- 収束するシグナルが勝つ。 チケットと機能リクエストの両方に現れるテーマは、最も信頼度の高いシグナルです。
- リアクティブ > プロアクティブ。 壊れたものはチャーンを招きます。欠けている機能があっても生き残れますが、エラーがあっては生き残れません。
- ビジネスメトリクスが数式を上書きする。 チャーンの増加やコンバージョンの低下はすべてを変えます。
これはバージョン管理されています (v2.2)。すべての generate_product_plan レスポンスはこれにリンクし、kpi_context が設定されている場合に適用するよう Claude に指示します。実際に読まれるかどうかは、クライアントがリソースを提示するか次第です。
評価
テーマは、埋め込みや LLM 分類器ではなく、キーワードリストでマッチングされます。顧客のテキストがサーバーから出ることはなく、同じ入力は常に同じテーマを生成するため、ランキングを監査できます。その代償は再現率です。
npm run eval がそれを測定します。コミットされている 86 例のフィクスチャでは、設定 v3 はマイクロ適合率 96.1%、再現率 99.0%、F1 97.5% で、ミス率は 1.3% です。この数値はインサンプル (設定はこれに対してチューニングされています) であるため、回帰ゲートとなります。ホールドアウトされた実チャットデータでは、会話の 3 分の 1 が依然としてどのテーマにも一致しません。
完全な結果、初回実行でわかったこと、既知の限界: docs/evaluation.md。
セキュリティ
すべての顧客テキストは、分析に入る前、またはサーバーから出る前にスクラブされます。
- SSN、クレジットカード (Luhn 検証済み)、メールアドレス、電話番号 (米国の形式および
+接頭辞の国際形式) は秘匿化され、機能リクエストの URL からもスクラブされます。顧客のメールフィールドは常に[REDACTED]です。 - エージェント/管理者の返信、内部メモ、添付ファイル、投票者の身元、コメント者名、Chatbase のアシスタントのターン、リードフォーム、ユーザー ID、国は完全に除外されます。
generate_product_planのpreview_only: trueは、データを取得せずに送信される内容を表示します。- すべてのレスポンスには
pii_scrubbing_appliedとpii_categories_redactedが含まれます。
詳細、既知の制限、報告プロセス: SECURITY.md。
テーマ設定
リポジトリルートの themes.config.json がテーマを定義します。これは実行時に読み込まれるため、編集に再ビルドは不要です。12 カテゴリにわたる 18 のテーマが同梱されています。themes 配列に独自のテーマを追加してください。一致しなかったデータポイントは、バイグラム/トライグラム頻度を用いて新たなパターンの抽出対象となります。
単語 1 つのキーワードは、省略可能な規則的な複数形を伴う単語境界で一致します。複数単語のキーワードも単語境界で一致します。編集後は 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% がコメント。
- 収束 (2x): テーマにリアクティブシグナルとプロアクティブシグナルの両方がある場合に適用されます。偏向シグナルはこれを発火させません。
頻度と投票モメンタムは、同じ呼び出し内の最上位テーマに対して正規化されるため、スコアは 1 つの分析ウィンドウに対して相対的です。呼び出し間で比較するのは順位であり、生のスコアではありません。
トラブルシューティング
No data sources configured。 リポジトリルートに.envが存在し、少なくとも 1 つのソースを設定していることを確認してください。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 サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。