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.

TypeScript License: MIT MCP SDK Node.js


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_rate por tema.
  • Componibilidad. Pasa datos de abandono o tráfico desde otros servidores MCP a generate_product_plan mediante kpi_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.

VariableRequeridaDescripción
HELPSCOUT_APP_IDNoID de aplicación OAuth de https://secure.helpscout.net/apps/custom/ (configura ambos o ninguno)
HELPSCOUT_APP_SECRETNoSecreto de la aplicación OAuth
PRODUCTLIFT_PORTALSNoMulti-portal: name|url|key,name2|url2|key2
PRODUCTLIFT_PORTAL_URLNoURL de portal único
PRODUCTLIFT_API_KEYNoToken Bearer de portal único
PRODUCTLIFT_PORTAL_NAMENoNombre visible del portal (predeterminado: default)
CHATBASE_API_KEYNoClave secreta a nivel de cuenta de Chatbase → Configuración → Claves API
CHATBASE_AGENTSNoMulti-agente: name|agentId,name2|agentId2
CHATBASE_AGENT_IDNoID de agente único
CHATBASE_AGENT_NAMENoNombre 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ámetroTipoPredeterminadoDescripción
timeframe_daysnúmero30Días hacia atrás (1-90)
top_voted_limitnúmero50Solicitudes más votadas por portal (1-200). Las solicitudes recientes dentro del período siempre se incluyen al principio
mailbox_idcadena—ID de buzón de HelpScout
mailbox_namecadena—Nombre de buzón de HelpScout (sin distinción de mayúsculas), resuelto a un ID
portal_namecadena—Portal de ProductLift
agent_namecadena—Agente de Chatbase
source_filtercadena—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_commentsbooleanofalsoTambié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_levelcadena"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ámetroTipoPredeterminadoDescripción
kpi_contextcadena—Métricas de negocio de otros servidores MCP, pasadas textualmente
max_prioritiesnúmero5Número de prioridades a devolver (1-10)
preview_onlybooleanofalsoModo auditoría: muestra qué datos se enviarían, sin obtenerlos
formatcadena"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ámetroTipoPredeterminadoDescripción
theme_idcadena—El theme_id del análisis, p. ej., booking-scheduling
sourcecadena"all""all", "tickets", "feature_requests" o "chats"
limitnúmero25Registros 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ámetroTipoPredeterminadoDescripción
portal_namecadena—Filtrar a un portal
include_commentsbooleanoverdaderoIncluir comentarios en cada solicitud
statuscadena—Filtrar por estado (sin distinción de mayúsculas), p. ej., open, planned, completed
limitnú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
sortcadena—"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

ClaseFuenteQué significaAlimenta
ReactivaTickets de HelpScoutAlgo está rotoFrecuencia, severidad, convergencia
ProactivaSolicitudes de ProductLiftAlgo se deseaFrecuencia, impulso de votos, convergencia
DesviadaConversaciones de ChatbaseAlgo se preguntó, y el autoservicio lo manejó o noSolo 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 tema
  • self_serve_failure_rate: proporción de aquellas donde la confianza más baja de respuesta del agente cayó por debajo de 0.5
  • mean_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: true en generate_product_plan muestra lo que se enviaría sin obtener datos.
  • Cada respuesta incluye pii_scrubbing_applied y pii_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 .env exista 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 de HELPSCOUT_*.
  • Los cambios no surten efecto. El cliente ejecuta el dist/ compilado. Ejecuta npm run build y reinicia el cliente.
  • No HelpScout mailbox named "…". Ejecuta list_sources para nombres exactos, o pasa mailbox_id.
  • No portal found with name "…" / No ProductLift portal named "…". El portal debe estar en PRODUCTLIFT_PORTALS (o las variables de portal único). Ejecuta list_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_agents está vacío en list_sources. Establece ambos CHATBASE_API_KEY y uno de CHATBASE_AGENTS / CHATBASE_AGENT_ID. Una clave por sí sola no configura nada.

Contribuciones

Consulta CONTRIBUTING.md.

Licencia

MIT