Planfix
Un servidor MCP para integrarse con la plataforma de gestión de proyectos y CRM Planfix.
Documentación
Servidor MCP de Planfix
Este servidor MCP proporciona integración con la API de Planfix, permitiendo que los clientes del Model Context Protocol (MCP) interactúen con el CRM de Planfix y su sistema de gestión de tareas.
Características
- Gestión de prospectos (crear, buscar, convertir en tareas)
- Las búsquedas de prospectos pueden reutilizar un
clientIdconocido para omitir búsquedas de contactos - Gestión de contactos y empresas
- Gestión de tareas (crear, buscar, comentar)
- Generación y gestión de informes
- Utiliza la API REST de Planfix v2.0 (Documentación de la API)
- Autenticación mediante token Bearer
Configuración
El servidor requiere las siguientes variables de entorno para el acceso a la API de Planfix:
PLANFIX_ACCOUNT– El nombre de tu cuenta de Planfix (p. ej.,yourcompany)PLANFIX_TOKEN– Token de API de Planfix con los permisos necesariosPLANFIX_BASE_URL– (opcional) Sobrescribe la URL base de la API REST. El valor predeterminado eshttps://<PLANFIX_ACCOUNT>.planfix.com/rest/. Configúralo para.ruy otras instalaciones regionales, p. ej.,https://yourcompany.planfix.ru/rest/PLANFIX_ACCOUNT_URL– (opcional) Sobrescribe el origen web utilizado para enlaces dirigidos a humanos (páginas de tareas/contactos/usuarios). El valor predeterminado esPLANFIX_BASE_URLsin la/rest/finalPLANFIX_FIELD_ID_EMAIL– ID de campo personalizado para correo electrónicoPLANFIX_FIELD_ID_EMAIL_ADDITIONAL– (opcional, sin valor predeterminado) ID de campo personalizado numérico utilizado para almacenar direcciones de correo electrónico adicionales (multivalor). Debe apuntar a un campo personalizado multivalor real que hayas creado en tu cuenta; el ID del campo de correo secundario del sistema124no es un destino de escritura válido. Cuando no está configurado, el almacenamiento de direcciones adicionales está deshabilitado (la coincidencia mediante el campo del sistema sigue funcionando). El campo de correo secundario del sistema de Planfix (additionalEmailAddresses) es de solo lectura a través de la API REST, por lo que las direcciones adicionales se escriben en este campo personalizado; la coincidencia utiliza tanto el campo del sistema (tipo de filtro 4221) como este campo personalizado (tipo de filtro 4101), para cualquier búsqueda de correo electrónico una vez que esto está configuradoPLANFIX_FIELD_ID_PHONE– ID de campo personalizado para teléfonoPLANFIX_FIELD_ID_TELEGRAM– Establece cualquier valor para usar el campo de Telegram del sistemaPLANFIX_FIELD_ID_TELEGRAM_CUSTOM– ID de campo personalizado para Telegram cuando se usa el campo personalizadoPLANFIX_FIELD_ID_CLIENT– ID de campo personalizado para clientePLANFIX_FIELD_ID_MANAGER– ID de campo personalizado para gerentePLANFIX_FIELD_ID_AGENCY– ID de campo personalizado para agenciaPLANFIX_FIELD_ID_LEAD_SOURCE– ID de campo personalizado para fuente de prospectoPLANFIX_FIELD_ID_LEAD_SOURCE_VALUE– ID de valor para la fuente de prospecto predeterminadaPLANFIX_FIELD_ID_PIPELINE– ID de campo personalizado para pipelinePLANFIX_FIELD_ID_TAGS– ID de campo personalizado para etiquetas de tareas- Los nombres de etiquetas faltantes se agregarán automáticamente al directorio
PLANFIX_FIELD_ID_LEAD_ID– ID de campo personalizado para ID de prospecto externoPLANFIX_LEAD_TEMPLATE_ID– ID de la plantilla de tarea de prospectoPLANFIX_TASK_TITLE_TEMPLATE– Plantilla para el título predeterminado de la tarea de prospecto (p. ej.,{name} - client's task)
config.yml
Los campos personalizados también se pueden configurar mediante config.yml. La ruta predeterminada es ./data/config.yml. Sobrescríbela con el indicador de CLI --config=/abs/path/config.yml o la variable de entorno PLANFIX_CONFIG. También puedes especificar una cuenta de Planfix diferente al usar una configuración personalizada:
PLANFIX_CONFIG=/etc/planfix-mcp.yml PLANFIX_ACCOUNT=demo \
npx @popstas/planfix-mcp-server
proxyUrl: "http://localhost:8080"
webhook:
enabled: false
url: "https://example.com/hook"
token: "<token>"
skipPlanfixApi: false
leadTaskFields:
- id: "456"
name: "id сделки"
argName: lead_id
type: number
contactFields:
- id: "123"
name: "Резидентство"
argName: resident
type: enum
values: ["резидент", "нерезидент", "иное"]
userFields:
- id: "789"
name: "Департамент"
argName: department
type: string
proxyUrl enruta todas las llamadas a la API REST de Planfix (incluidas las solicitudes de herramientas) a través del proxy HTTP especificado.
Los valores de config.yml sobrescriben las entradas correspondientes de las variables de entorno heredadas cuando se fusionan mediante id. Los campos personalizados de usuario de esta lista se solicitan individualmente mediante la herramienta planfix_search_manager para que sus valores estén disponibles en las respuestas. Los gerentes se pueden buscar ya sea por email o por id numérico a través de esta herramienta, lo que permite búsquedas cuando solo se dispone de un identificador.
API de Chat
Para crear tareas a partir de mensajes de chat, agrega un bloque chatApi a config.yml:
chatApi:
useChatApi: true
chatApiToken: "<token>"
providerId: "<id>"
baseUrl: "https://<account>.planfix.com/webchat/api"
chatApiToken– token para solicitudes a la API de Chat de Planfix.providerId– identificador del proveedor de chat configurado en Planfix.useChatApi– habilita la integración con la API de Chat. Cuandotrue, la creación de tareas procede de la siguiente manera:- Se crea un chat mediante la API de Chat con el mensaje inicial.
getTaskrecupera eltaskIdde la nueva tarea.- Las actualizaciones posteriores se realizan a través de la API REST.
baseUrl– URL base para llamadas a la API de Chat. El valor predeterminado eshttps://<account>.planfix.com/webchat/api.
Webhook
Para enviar cargas útiles de tareas de prospecto a un webhook antes de crear o actualizar una tarea, agrega un bloque webhook a config.yml:
webhook:
enabled: true
url: "https://example.com/hook"
token: "<token>"
skipPlanfixApi: false
enabled– indica si se debe enviar la carga útil de la tarea de prospecto a la URL del webhook.url– URL del endpoint del webhook.token– secreto compartido agregado a la carga útil JSON comotoken.skipPlanfixApi– cuandotrue, la respuesta del webhook debe incluirtaskId, y se omite la llamada a la API REST de Planfix.
Depuración
npx @modelcontextprotocol/inspector node d:/projects/expertizeme/planfix-mcp-server/dist/index.js
Registro de eventos
Establece LOG_LEVEL=debug para habilitar registros de caché detallados. Los registros se escriben en data/mcp.log.
Limpieza de caché
Ejecuta npm run cache-clear para eliminar todas las respuestas de la API de Planfix almacenadas en caché en data/planfix-cache.sqlite3 y eliminar el archivo de caché de objetos data/planfix-cache.yml.
Ejemplo de configuración de MCP (NPX)
{
"mcpServers": {
"planfix": {
"command": "npx",
"args": [
"-y",
"@popstas/planfix-mcp-server"
],
"env": {
"PLANFIX_ACCOUNT": "yourcompany",
"PLANFIX_TOKEN": "your-api-token",
"PLANFIX_FIELD_ID_EMAIL": "123",
"PLANFIX_FIELD_ID_PHONE": "124",
"PLANFIX_FIELD_ID_TELEGRAM": "1",
"PLANFIX_FIELD_ID_TELEGRAM_CUSTOM": "125",
"PLANFIX_FIELD_ID_CLIENT": "126",
"PLANFIX_FIELD_ID_MANAGER": "127",
"PLANFIX_FIELD_ID_AGENCY": "128",
"PLANFIX_FIELD_ID_TAGS": "129",
"PLANFIX_FIELD_ID_LEAD_ID": "130",
"PLANFIX_LEAD_TEMPLATE_ID": "42",
"PLANFIX_TASK_TITLE_TEMPLATE": "{name} - работа с клиентом"
}
}
}
}
Uso
Ejecutar el servidor
Ejecuta el servidor con las variables de entorno requeridas configuradas. Ejemplo (con npx):
PLANFIX_ACCOUNT=yourcompany \
PLANFIX_TOKEN=your-api-token \
PLANFIX_FIELD_ID_EMAIL=123 \
PLANFIX_FIELD_ID_PHONE=124 \
PLANFIX_FIELD_ID_TELEGRAM=1 \
PLANFIX_FIELD_ID_TELEGRAM_CUSTOM=125 \
PLANFIX_FIELD_ID_CLIENT=126 \
PLANFIX_FIELD_ID_MANAGER=127 \
PLANFIX_FIELD_ID_AGENCY=128 \
PLANFIX_FIELD_ID_LEAD_SOURCE=129 \
PLANFIX_FIELD_ID_LEAD_SOURCE_VALUE=130 \
PLANFIX_FIELD_ID_PIPELINE=131 \
PLANFIX_FIELD_ID_LEAD_ID=132 \
PLANFIX_FIELD_ID_TAGS=133 \
PLANFIX_LEAD_TEMPLATE_ID=42 \
PLANFIX_TASK_TITLE_TEMPLATE="{name} - работа с клиентом" \
npx @popstas/planfix-mcp-server
Para ejecutar el servidor a través de Server-Sent Events (SSE), usa el comando planfix-mcp-server-sse:
PLANFIX_ACCOUNT=yourcompany \
PLANFIX_TOKEN=your-api-token \
planfix-mcp-server-sse
Usar el cliente de Planfix
El cliente de Planfix proporciona una forma conveniente de interactuar con la API de Planfix directamente desde la línea de comandos.
Requisitos previos
Asegúrate de tener las siguientes variables de entorno configuradas en tu archivo .env:
PLANFIX_ACCOUNT=your-account
PLANFIX_TOKEN=your-api-token
Comandos básicos
-
Probar la conexión
npm run planfix test -
Realizar una solicitud GET
npm run planfix get user/current -
Realizar una solicitud POST con datos
npm run planfix post task/ --data '{"name":"Test Task","description":"Test Description"}' -
Buscar objetos
npm run planfix post object/list --data '{"filters":[{"type":1,"operator":"equal","value":"Продажа"}]}'
Referencia de herramientas
planfix_create_sell_task
- Crea una tarea de venta utilizando información textual sobre la agencia y el empleado.
- Resuelve el cliente, la tarea de prospecto principal, los asignados y los IDs de agencia automáticamente según las cadenas proporcionadas.
- Campos de entrada (todos cadenas):
name: Título de la tarea, p. ej.,"Продажа {{ название товара }} на pressfinity.com".agency: Nombre de la agencia/empresa (opcional).email: Correo electrónico del empleado utilizado para localizar el contacto de Planfix.contactName/employeeName: Nombre completo del empleado (opcional).telegram: Nombre de usuario de Telegram del empleado (opcional).description: Descripción con la lista de productos solicitados.project: Nombre del proyecto para asociar con la tarea de venta (opcional).
- Devuelve
{ taskId, url }.
planfix_create_sell_task_ids
- Crea una tarea de venta cuando los identificadores de Planfix ya son conocidos.
- Requiere
clientIdnumérico yleadTaskId,agencyIdyassigneesopcionales (IDs de usuario). - Acepta valores de cadena
name,descriptionyprojectopcional.
-
Actualizar un objeto (solicitud PUT)
npm run planfix put task/123 --data '{"name":"Updated Task Name"}' -
Eliminar un objeto
npm run planfix delete task/123
Uso en código
import { planfixClient } from './lib/planfix-client';
// Get current user
const user = await planfixClient.get('user/current');
// Create a new task
const newTask = await planfixClient.post('task/', {
name: 'New Task',
description: 'Task description',
// ... other task properties
});
// Search for objects
const objects = await planfixClient.post('object/list', {
filters: [
{
type: 1,
operator: 'equal',
value: 'Продажа'
}
]
});
Herramientas disponibles
Gestión de prospectos
leadToTask: Convierte un prospecto en una tarea creando/actualizando contacto y tareasearchLeadTask: Busca tareas de prospecto por información de contacto
Gestión de contactos
searchPlanfixContact: Busca contactos por nombre, teléfono, correo electrónico o Telegram. Cuando elemailprincipal no coincide con el campo de correo principal, también se compara con el campo de correo secundario del sistema (tipo de filtro 4221) y, cuandoPLANFIX_FIELD_ID_EMAIL_ADDITIONALestá configurado, con ese campo personalizado (tipo de filtro 4101). Ambos respaldos se aplican a una búsqueda simple deemail— el campo personalizado es donde este servidor escribe los adicionales, por lo que unemailsolitario debe coincidir con él para que un contacto creado aquí pueda encontrarse nuevamente. El argumento opcionaladditionalEmails: string[](máx. 10) agrega cada dirección a esos mismos respaldos, además del campo de correo principal.createPlanfixContact: Crea un nuevo contacto en Planfix. Acepta un argumento opcionaladditionalEmails: string[](máx. 10) que se escribe en el campo personalizado de correos adicionales (PLANFIX_FIELD_ID_EMAIL_ADDITIONAL), deduplicado y excluyendo elemailprincipal. (El campo de correo secundario del sistema es de solo lectura a través de la API).updatePlanfixContact: Actualiza la información de un contacto existente. Acepta un argumento opcionaladditionalEmails: string[](máx. 10) que se fusiona en el campo personalizado de correos adicionales. Las escrituras de campos personalizados de Planfix reemplazan todo el valor, por lo que el campo se reescribe con la unión de lo que ya está almacenado allí y las direcciones genuinamente nuevas; no se pierde nada. Las direcciones que ya están en el contacto — en el campo personalizado, en el campo de correo secundario de solo lectura del sistema, o comoemailprincipal — no se agregan nuevamente. ConforceUpdateel campo se reescribe en su lugar con exactamente las direcciones que pases, por lo que una matriz vacía lo limpia; omitiradditionalEmailsdeja el campo sin tocar en cualquier caso.searchPlanfixCompany: Busca empresas por nombre
Gestión de tareas
searchPlanfixTask: Busca tareas por título, ID de cliente ytemplateIdopcionalcreateSellTask: Resuelve IDs de contacto/agencia y crea una tarea de ventacreateSellTaskIds: Crea una tarea de venta cuando los IDs ya son conocidoscreateLeadTask: Crea una nueva tarea de prospecto. CuandochatApi.useChatApiestá habilitado, envía el mensaje inicial a través de la API de Chat, obtiene eltaskIdresultante mediantegetTask, y luego actualiza la tarea usando la API REST. Acepta camposmessageycontactName.addToLeadTask: Crea o actualiza una tarea de prospecto y actualiza los detalles del contacto. Acepta un argumento opcionaladditionalEmails: string[](máx. 10) que se propaga a través de la búsqueda, creación y actualización de contactos (coincide con el campo de correo secundario del sistema y el campo personalizadoPLANFIX_FIELD_ID_EMAIL_ADDITIONAL; se escribe en el campo personalizado). Cuandowebhook.enabledes verdadero, publica la carga útil de entrada en el endpoint del webhook, omitiendo opcionalmente la API de Planfix siskipPlanfixApiestá configurado.createTask: Crea una tarea usando campos de textocreateComment: Agrega un comentario a una tareagetChildTasks: Recupera tareas secundarias de una tarea principal. Usarecursivepara obtener todas las tareas descendientes como una lista plana; las tareas devueltas incluyenparent_task_id.updateLeadTask: Actualiza una tarea de prospecto existente (solo se actualizan los campos vacíos a menos queforceUpdatesea verdadero)
Gestión de directorios
planfix_search_directory: Busca directorios por nombreplanfix_search_directory_entry: Busca una entrada de directorio por nombre de directorio y nombre de entrada
Gestión de usuarios
searchManager: Encuentra un gerente por correo electrónico
Informes
listReports: Lista todos los informes disponiblesrunReport: Genera y recupera un informe específico
Referencias
PENDIENTE:
- Agregar herramienta
getTaskpara recuperar detalles de tareas - Agregar herramienta
getContactpara recuperar detalles de contactos - Agregar herramienta
getManagerpara recuperar detalles de gerentes - Agregar manejo de errores y registro más completo
- Agregar validación de entrada para todos los endpoints de la API
- Agregar limitación de velocidad y lógica de reintento para llamadas a la API
Licencia MIT