PM Copilot
Triangula tickets de soporte al cliente y solicitudes de funciones para generar planes de producto priorizados con puntuación de convergencia y limpieza de PII.
Documentación
PM Copilot
Un servidor MCP que triangula tickets de soporte al cliente, solicitudes de funciones y conversaciones de agentes de soporte con IA para ayudar a los gerentes de producto a decidir qué construir a continuación.
Resultados reales: Se analizaron 3,353 señales en una ventana de 30 días: 1,678 tickets de soporte, 276 solicitudes de funciones y 1,399 conversaciones de agentes de soporte con IA en 4 productos.
Los chats son una señal que un análisis basado solo en tickets nunca ve.
Lee la historia completa: Construí un servidor MCP que cambió la forma en que priorizo productos
Qué lo hace diferente
- Triangulación de señales. Compara tickets de soporte con solicitudes de funciones para encontrar temas convergentes, y otorga a los temas convergentes un impulso de prioridad 2x.
- El punto ciego de la desviación. Un agente de soporte con IA responde preguntas que nunca se convierten en tickets, por lo que la priorización basada en tickets subestima cada tema que el bot maneja. Las conversaciones de Chatbase entran como una tercera clase de señal, con un
self_serve_failure_ratepor tema. - Componibilidad. Pasa datos de abandono o tráfico desde otros servidores MCP a
generate_product_planmediantekpi_context, y la metodología ajusta las prioridades.
Arquitectura
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
Inicio rápido
Requiere Node 20+. No está publicado en npm, así que instala desde el código fuente:
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 vive en la raíz del repositorio. El servidor lo carga desde allí independientemente del directorio de trabajo desde el que se lance.
Credenciales
Configura al menos una fuente; el análisis se adapta a la que configures. Sin HelpScout no hay tickets de soporte, por lo que los temas no obtienen puntuación de severidad ni impulso de convergencia; ProductLift y Chatbase aún clasifican los temas por frecuencia y votos.
| Variable | Requerida | Descripción |
|---|---|---|
HELPSCOUT_APP_ID | No | ID de aplicación OAuth de https://secure.helpscout.net/apps/custom/ (configura ambos o ninguno) |
HELPSCOUT_APP_SECRET | No | Secreto de la aplicación OAuth |
PRODUCTLIFT_PORTALS | No | Multi-portal: name|url|key,name2|url2|key2 |
PRODUCTLIFT_PORTAL_URL | No | URL de portal único |
PRODUCTLIFT_API_KEY | No | Token Bearer de portal único |
PRODUCTLIFT_PORTAL_NAME | No | Nombre visible del portal (predeterminado: default) |
CHATBASE_API_KEY | No | Clave secreta a nivel de cuenta de Chatbase → Configuración → Claves API |
CHATBASE_AGENTS | No | Multi-agente: name|agentId,name2|agentId2 |
CHATBASE_AGENT_ID | No | ID de agente único |
CHATBASE_AGENT_NAME | No | Nombre visible del agente único (predeterminado: default) |
El acceso a la API de Chatbase requiere un plan Standard o superior; en un plan inferior, la señal de desviación se convierte en una advertencia. Un agente por producto proporciona una atribución a nivel de producto que un buzón compartido no ofrece.
Claude Desktop
Agrega a ~/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
O abre Claude Code en el repositorio: te pedirá que apruebes el .mcp.json del proyecto.
Verificación
Reinicia el cliente y pídele que ejecute list_sources. Debería listar las fuentes que configuraste: buzones de HelpScout, portales de ProductLift y agentes de Chatbase.
Herramientas
Filtros comunes
Compartidos por synthesize_feedback y generate_product_plan.
| Parámetro | Tipo | Predeterminado | Descripción |
|---|---|---|---|
timeframe_days | número | 30 | Días hacia atrás (1-90) |
top_voted_limit | número | 50 | Solicitudes más votadas por portal (1-200). Las solicitudes recientes dentro del período siempre se incluyen al principio |
mailbox_id | cadena | — | ID de buzón de HelpScout |
mailbox_name | cadena | — | Nombre de buzón de HelpScout (sin distinción de mayúsculas), resuelto a un ID |
portal_name | cadena | — | Portal de ProductLift |
agent_name | cadena | — | Agente de Chatbase |
source_filter | cadena | — | Fuente de conversación de Chatbase, separada por comas para múltiples (p. ej., Widget or Iframe o WhatsApp,API). Sin distinción de mayúsculas |
include_comments | booleano | falso | También obtener el texto de comentarios de clientes en solicitudes de funciones (depurado; se eliminan nombres y respuestas de administradores) para coincidencia de temas y citas. Una ganancia modesta por una llamada adicional por solicitud con comentarios; puede tomar casi un minuto en portales grandes |
detail_level | cadena | "summary" | "summary", "standard" o "full". La salida crece con cada paso |
Ejecuta list_sources para ver nombres válidos de buzones, portales, agentes y fuentes.
synthesize_feedback
Devuelve temas ordenados por puntuación de prioridad, cada uno con recuentos por clase, un indicador de convergencia, un resumen de evidencia y citas representativas. Aproximadamente 15KB en summary, varios cientos de KB en full. Solo filtros comunes.
generate_product_plan
Construye un plan priorizado con evidencia y citas de clientes. Toma los filtros comunes más:
| Parámetro | Tipo | Predeterminado | Descripción |
|---|---|---|---|
kpi_context | cadena | — | Métricas de negocio de otros servidores MCP, pasadas textualmente |
max_priorities | número | 5 | Número de prioridades a devolver (1-10) |
preview_only | booleano | falso | Modo auditoría: muestra qué datos se enviarían, sin obtenerlos |
format | cadena | "json" | "json" (estructurado) o "markdown" (informe listo para leer) |
get_theme_evidence
Profundiza en un tema: los tickets individuales, solicitudes de funciones y chats detrás de él, del más reciente al más antiguo, con números de ticket, URLs de solicitudes, votos, canales y fechas. Pasa los mismos filtros comunes dentro de unos minutos de la llamada de análisis y reutiliza los datos en caché, por lo que no realiza nuevas llamadas API. Devuelve identificadores, metadatos y títulos depurados (para un chat, su mensaje de apertura del cliente, truncado a 200 caracteres), no conversaciones completas.
| Parámetro | Tipo | Predeterminado | Descripción |
|---|---|---|---|
theme_id | cadena | — | El theme_id del análisis, p. ej., booking-scheduling |
source | cadena | "all" | "all", "tickets", "feature_requests" o "chats" |
limit | número | 25 | Registros por fuente (1-200), para que una fuente ocupada no desplace a las demás |
Más los filtros comunes.
get_feature_requests
Acceso directo a ProductLift. Cada solicitud incluye su url público.
| Parámetro | Tipo | Predeterminado | Descripción |
|---|---|---|---|
portal_name | cadena | — | Filtrar a un portal |
include_comments | booleano | verdadero | Incluir comentarios en cada solicitud |
status | cadena | — | Filtrar por estado (sin distinción de mayúsculas), p. ej., open, planned, completed |
limit | número | — | Solicitudes a devolver por portal (1-500), después del filtro de estado y la ordenación. Los comentarios se obtienen solo para lo que se conserva |
sort | cadena | — | "votes" o "recent". Omite para mantener el orden del portal |
list_sources
Lista los buzones, portales y agentes configurados, más chatbase_conversation_sources (los valores que acepta source_filter) cuando Chatbase está configurado. Nunca devuelve claves ni datos de clientes. Sin parámetros.
Clases de señal
| Clase | Fuente | Qué significa | Alimenta |
|---|---|---|---|
| Reactiva | Tickets de HelpScout | Algo está roto | Frecuencia, severidad, convergencia |
| Proactiva | Solicitudes de ProductLift | Algo se desea | Frecuencia, impulso de votos, convergencia |
| Desviada | Conversaciones de Chatbase | Algo se preguntó, y el autoservicio lo manejó o no | Solo frecuencia |
Las señales desviadas nunca afectan la severidad, el impulso de votos ni el impulso de convergencia. Cada tema lleva:
deflected_count: conversaciones que coinciden con el temaself_serve_failure_rate: proporción de aquellas donde la confianza más baja de respuesta del agente cayó por debajo de 0.5mean_answer_confidence: media de esa misma puntuación
Chatbase no documenta qué mide su min_score, por lo que estos son evidencia para que el LLM los pondere, no parte de la puntuación. El análisis también cuenta conversaciones por canal (chatbase_sources). Un valor de source_filter no reconocido se pasa con una advertencia, no se rechaza. Sin Chatbase, los campos de desviación están ausentes.
Ejemplo de salida
Una respuesta synthesize_feedback recortada con detalle summary. Los valores son ilustrativos. Observa el correo electrónico depurado en la primera cita.
{
"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
}
}
Componibilidad
Pide a Claude que obtenga datos de abandono y conversión de tus otros servidores MCP y los pase como 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%.
La metodología dice que el abandono anula la fórmula, por lo que un tema vinculado a la caída de la tasa de finalización del Producto A puede saltar al #1 incluso cuando otro tema puntúa más alto. El servidor clasifica la señal; el contexto de KPI aporta el juicio.
Metodología
El recurso pm-copilot://methodology es mi marco de planificación de productos de 7 años lanzando 9 productos a más de 1M de usuarios. Las reglas centrales:
- La regla del 5%. Completas alrededor del 5% de lo que los clientes piden cada mes. El marco elige ese 5%.
- Las señales convergentes ganan. Un tema presente tanto en tickets como en solicitudes de funciones es la señal de mayor confianza.
- Reactiva > proactiva. Lo roto impulsa el abandono. Puedes sobrevivir a una función faltante; no puedes sobrevivir a errores.
- Las métricas de negocio anulan la fórmula. El aumento del abandono o la caída de la conversión lo cambia todo.
Está versionado (v2.2). Cada respuesta de generate_product_plan enlaza a él y le dice a Claude que lo aplique cuando kpi_context está configurado. Que se lea o no depende de que el cliente exponga los recursos.
Evaluación
Los temas se comparan con listas de palabras clave, no con embeddings ni un clasificador LLM. El texto del cliente nunca sale del servidor, y la misma entrada siempre produce los mismos temas, por lo que una clasificación puede auditarse. El costo es el recuerdo.
npm run eval lo mide. En el fixture confirmado de 86 ejemplos, la configuración v3 puntúa precisión micro 96.1%, recuerdo 99.0%, F1 97.5%, con una tasa de omisión del 1.3%. Ese número es dentro de la muestra (la configuración se ajustó contra él), por lo que es una puerta de regresión. En datos reales de chat retenidos, un tercio de las conversaciones aún no coincide con ningún tema.
Resultados completos, lo que encontró la primera ejecución y límites conocidos: docs/evaluation.md.
Seguridad
Todo el texto del cliente se depura antes de entrar al análisis o salir del servidor:
- SSN, tarjetas de crédito (validadas con Luhn), direcciones de correo electrónico y números de teléfono (formatos de EE. UU. e internacionales con prefijo
+) se redactan, y también se depuran de las URLs de solicitudes de funciones. El campo de correo electrónico del cliente siempre es[REDACTED]. - Respuestas de agentes/administradores, notas internas, adjuntos, identidades de votantes, nombres de comentaristas y turnos de asistente de Chatbase, formularios de contacto, IDs de usuario y país se excluyen por completo.
preview_only: trueengenerate_product_planmuestra lo que se enviaría sin obtener datos.- Cada respuesta incluye
pii_scrubbing_appliedypii_categories_redacted.
Detalles, limitaciones conocidas y el proceso de reporte: SECURITY.md.
Configuración de temas
themes.config.json en la raíz del repositorio define los temas. Se lee en tiempo de ejecución, por lo que las ediciones no requieren recompilación. Incluye 18 temas en 12 categorías; agrega los tuyos al arreglo themes. Los puntos de datos no coincidentes se extraen para patrones emergentes con frecuencia de bigramas/trigramas.
Las palabras clave de una sola palabra coinciden en un límite de palabra con un plural regular opcional. Las palabras clave de varias palabras también coinciden en límites de palabra. Después de editar, ejecuta npm run eval para detectar palabras clave que se activan en el tema equivocado.
Fórmula de puntuación
priority = (frequency × 0.35 + severity × 0.35 + vote_momentum × 0.30) × convergence_boost
- Frecuencia (0.35): recuento de puntos de datos, normalizado entre temas. Incluye señales desviadas.
- Severidad (0.35): solo señales reactivas. Recuento de hilos, recencia (decaimiento de vida media de 7 días) y un impulso de la etiqueta coincidente de mayor severidad.
- Impulso de votos (0.30): solo señales proactivas. 80% votos, 20% comentarios.
- Convergencia (2x): se aplica cuando un tema tiene señales tanto reactivas como proactivas. Las señales desviadas no lo activan.
La frecuencia y el impulso de votos se normalizan contra el tema principal en la misma llamada, por lo que las puntuaciones son relativas a una ventana de análisis. Compara clasificaciones entre llamadas, no puntuaciones brutas.
Solución de problemas
No data sources configured. Verifica que.envexista en la raíz del repositorio y defina al menos una fuente.HELPSCOUT_APP_SECRET is missing(o_ID). Establece ambos valores de HelpScout, o elimínalos ambos para ejecutar sin HelpScout.HelpScout auth expired or invalid (403)en cada llamada. Si la solicitud de token tiene éxito pero las llamadas a la API devuelven 403, el usuario de HelpScout que posee la aplicación OAuth fue desactivado o perdió el acceso. Rotar el secreto no ayudará; crea una nueva aplicación desde el perfil de un usuario activo y actualiza ambos valores deHELPSCOUT_*.- Los cambios no surten efecto. El cliente ejecuta el
dist/compilado. Ejecutanpm run buildy reinicia el cliente. No HelpScout mailbox named "…". Ejecutalist_sourcespara nombres exactos, o pasamailbox_id.No portal found with name "…"/No ProductLift portal named "…". El portal debe estar enPRODUCTLIFT_PORTALS(o las variables de portal único). Ejecutalist_sources.- Advertencia de Chatbase:
API access needs a Chatbase Standard plan or higher. El resto del análisis aún se ejecuta; solo faltan los campos de desvío. chatbase_agentsestá vacío enlist_sources. Establece ambosCHATBASE_API_KEYy uno deCHATBASE_AGENTS/CHATBASE_AGENT_ID. Una clave por sí sola no configura nada.
Contribuciones
Consulta CONTRIBUTING.md.