MCP Server

Tu CRM Completo
al Alcance de tu Agente IA

Servidor MCP que expone 96 herramientas de la API de Pine CRM para que cualquier agente de IA pueda gestionar contactos, ventas, marketing, soporte, cobranza y más.

96
Tools
4
Resources
24
Módulos
REST
API

Conexión Streamable HTTP

Un único endpoint para conectar cualquier cliente MCP compatible

POSThttps://mcp.pine.lat/mcp

Requiere tu API Key en cada petición: X-API-Key: sk_live_.... Sin ella el servidor responde 401. Ver autenticación

Toda Petición Lleva tu API Key

El servidor es multi-tenant: la key define a qué CRM entras, así que viaja en cada petición y nunca se configura en el servidor. Elige uno de estos tres métodos.

Último recurso

Query param ?apiKey=

https://mcp.pine.lat/mcp?apiKey=sk_live_...

Úsalo solo si tu cliente no permite enviar headers. La URL completa queda escrita en los logs de acceso del proxy y en el archivo de configuración del cliente.

⚠ Si usaste ?apiKey=, considera esa key expuesta: quedó en logs de acceso, en el historial de tu shell y en la config de tu cliente MCP. Revócala y crea una nueva en cuanto puedas migrar a header.
  • Dónde obtenerla: crea tu API Key en pine.lat/developers/api-keys. Empieza por sk_live_ y solo se muestra completa una vez.
  • Se puede revocar desde esa misma pantalla, con efecto inmediato. Puedes tener varias keys activas a la vez, así que rotar no implica cortar el servicio: crea la nueva, migra y revoca la anterior.
  • Permisos por módulo y expiración opcional: la key solo puede tocar lo que le habilites. Se guarda hasheada (SHA-256), nunca en claro.
  • La API REST solo acepta X-API-Key. Si además de este MCP llamas directo a pine.lat/api/external/v1/..., ahí Authorization: Bearer no funciona: es exclusivo del MCP.
  • El scope manda: cada tool dice qué permiso necesita (por ejemplo deals:read o whatsapp:send); sin él, la API responde 403. Con la key de los agentes IA de Pine, las lecturas de un cliente exigen el contacto de la conversación y la información del equipo (journeys, campañas) no se entrega.
  • Sin credencial no hay acceso: el endpoint /mcp responde 401 siempre que falte la key, sin importar cómo esté desplegado el servidor.

96 Herramientas Disponibles

Cada herramienta llama a la API REST de Pine con tu key y solo hace lo que el scope de esa key permite. Los parámetros con * son opcionales.

⚠ Las escrituras tienen efectos reales: un WhatsApp le llega a la persona, se cobra y queda en el inbox; crear un pedido o marcarlo pagado dispara journeys, webhooks y envíos; los pagos de cobranza mueven saldos; el opt-out bloquea cobranza y marketing en todos los canales por defecto. Con la key de los agentes IA, varias lecturas exigen el contacto de la conversación o responden solo para el equipo.
👤
contacts_list
Busca contactos por texto (nombre, email, teléfono), estado y rango de fecha de creación. Paginado. Scope: contacts:read
search*status*createdAfter*createdBefore*page*limit*
👤
contacts_create
Crea un contacto (firstName obligatorio). Si el email o el teléfono ya existen responde 409, salvo upsert=true, que actualiza al existente. Scope: contacts:write
firstNamelastName*email*phone*phoneCountryCode*whatsappOptIn*documentId*+16 opcionales
👤
contacts_get
Detalle de un contacto con tags, empresas asociadas y campos personalizados. Scope: contacts:read
id
👤
contacts_update
Actualiza un contacto; solo cambia lo enviado. Los customFields van con los códigos de contacts_custom_fields_list. Scope: contacts:write
idfirstName*lastName*email*phone*phoneCountryCode*whatsappOptIn*+14 opcionales
🗑️
contacts_delete
Elimina un contacto. Irreversible; si tiene registros asociados responde 409 (mejor pasarlo a INACTIVE). Scope: contacts:write
id
📦
contacts_batch_create
Crea hasta 500 contactos en una llamada, sin audiencias ni campos personalizados. Scope: contacts:write
contactsskipDuplicates*
🧩
contacts_custom_fields_list
Qué campos personalizados acepta un contacto: code, tipo, opciones (se manda options[].value) y si se puede escribir (writable:false = calculado). Solo lectura. Scope: contacts:read
includeInactive*
🏢
companies_list
Lista empresas con filtros por texto, estado, industria, tamaño y ciudad. Paginado. Scope: companies:read
search*status*industry*size*city*page*+1 opcionales
🏢
companies_create
Crea una empresa. Solo name (razón social) es obligatorio; el taxId (NIT) se verifica para no duplicar. Scope: companies:write
nametradeName*taxId*legalRepresentative*email*phone*website*+13 opcionales
🏢
companies_get
Detalle de una empresa con conteos de oportunidades, cotizaciones y tickets, y sus contactos paginados (principal primero). Scope: companies:read
idcontactsPage*contactsLimit*
🏢
companies_update
Actualiza una empresa. Solo cambia los campos enviados. Scope: companies:write
idname*tradeName*taxId*legalRepresentative*email*phone*+14 opcionales
💰
deals_list
Lista oportunidades por etapa, contacto, empresa, prioridad y rango de valor (el asesor asignado no es filtrable). Scope: deals:read
page*limit*search*stageId*status*contactId*+4 opcionales
💰
deals_create
Crea una oportunidad (title obligatorio) en el pipeline del tipo, el pipelineId enviado o el por defecto; la etapa debe ser de ese pipeline. Scope: deals:write
titlepipelineStageId*pipelineId*dealTypeId*dealSubtypeId*value*currency*+7 opcionales
💰
deals_get
Detalle de una oportunidad: etapa, contacto, empresa, productos y actividades paginadas. Scope: deals:read
idactivitiesPage*activitiesLimit*
💰
deals_update
Actualiza datos de una oportunidad; la etapa se cambia con deals_update_stage. Scope: deals:write
idtitle*description*value*currency*priority*source*+4 opcionales
🔄
deals_update_stage
Mueve una oportunidad a otra etapa activa del MISMO pipeline. Ganado registra la venta y sus efectos (metas, tipo de cliente). Scope: deals:write
idpipelineStageId*reason*
🧭
pipelines_list
Ciclos de venta con sus etapas reales (probabilidad, ganado, perdido). De aquí salen pipelineId y pipelineStageId. Solo lectura. Scope: deals:read
includeStages*onlyActive*
🏷️
deal_types_list
Tipos y subtipos de oportunidad con su pipeline propio: los dealTypeId y dealSubtypeId de deals_create. Solo lectura. Scope: deals:read
includeSubtypes*onlyActive*
🛒
products_list
Catálogo de productos y servicios con precio, impuesto y existencias: el productId de orders_create. El costo solo sale con products:write. Solo lectura. Scope: products:read
page*limit*search*sku*barcode*categoryId*+5 opcionales
🛒
products_get
Detalle de un producto o servicio: precios, impuesto, unidad, existencias y categoría. Solo lectura. Scope: products:read
id
🗂️
product_categories_list
Categorías del catálogo (hasta 3 niveles), plana o en árbol, con conteo de productos. Solo lectura. Scope: products:read
type*isActive*tree*
🧾
quotations_list
Cotizaciones con estado, totales, vigencia y fechas de envío y respuesta. Paginado. Solo lectura. Scope: quotations:read
page*limit*search*status*contactId*dateFrom*+1 opcionales
🧾
quotations_get
Una cotización con sus ítems, contacto, empresa, oportunidad y asesor. Solo lectura. Scope: quotations:read
idcontactId*
📦
orders_list
Lista pedidos por estado, contacto, fechas (días del negocio) e ID externo. Para totales de venta usa orders_sales_summary. Scope: orders:read
search*status*contactId*dateFrom*dateTo*dateField*+4 opcionales
📊
orders_sales_summary
Ventas de un periodo en una llamada: transacciones pagadas, monto, ticket promedio y serie diaria. Excluye cancelados, reembolsados y devueltos. Scope: orders:read
preset*dateFrom*dateTo*dateField*
📦
orders_create
Crea un pedido REAL: emite order.created (journeys que escriben al cliente, webhooks, envíos AveOnline) y reserva inventario. Crea el comprador si no existe. Scope: orders:write
itemscontactId*contactEmail*contactName*contactPhone*contactCountry*externalId*+17 opcionales
📦
orders_get
Detalle de un pedido: ítems, totales, pagado y pendiente, pagos, envío y campos adicionales. Scope: orders:read
id
📦
orders_update
Actualiza un pedido. Ítems, comprador e importes solo en DRAFT; notas, envío y campos adicionales en cualquier estado. Scope: orders:write
idcontactId*contactEmail*contactName*contactPhone*items*notes*+11 opcionales
🔄
orders_update_status
Cambia el estado un paso a la vez. PAID no registra ningún pago; PAID, SHIPPED, DELIVERED y CANCELLED disparan eventos y journeys. Scope: orders:write
idstatusreason*
💵
orders_add_payment
Registra un pago real (total o parcial) con método y referencia. Al completar el total pasa a PAID y emite order.paid. Cada llamada es otro pago. Scope: orders:write
idamountmethodreference*receiptUrl*notes*paidAt*
👥
audiences_list
Lista audiencias con su tamaño real (lo que recibiría una campaña, con el tope aplicado). Scope: campaigns:read
page*limit*search*estado*
👥
audiences_get_contacts
Contactos de una audiencia tal como los recibe una campaña (filtros + asignados, con tope). Paginado. Scope: campaigns:read + contacts:read
idpage*limit*
➕
audiences_add_contacts
Asigna contactos a una audiencia por ID (lotes automáticos hasta 1.000). Scope: campaigns:write
idcontactIdssource*
📱
audiences_add_contacts_by_phone
Asigna contactos por teléfono; con createIfNotExists=true crea los que falten. Scope: campaigns:write + contacts:read
idphonescreateIfNotExists*source*
➖
audiences_remove_contacts
Quita la asignación directa; quien cumpla los filtros sigue dentro y el contacto sigue en el CRM. Scope: campaigns:write
idcontactIds
✂️
audiences_split
Divide una audiencia en N partes o en grupos de tamaño máximo. La audiencia padre queda intacta. Scope: campaigns:write
idmodevaluenamePrefix*distributeEvenly*
🎚️
audiences_set_limit
Tope reversible: usa solo los primeros N contactos. null quita el tope. Scope: campaigns:write
idlimitedTo
📣
campaigns_list
Lista campañas por estado, canal, tipo y propósito, con estadísticas de envío. Solo lectura. Scope: campaigns:read
page*limit*search*status*canal*tipo*+1 opcionales
📣
campaigns_get
Detalle de una campaña: estado, canal, programación, plantilla y audiencias, sin el contenido del mensaje. Scope: campaigns:read
id
📊
campaigns_get_stats
Entregas, aperturas, clics, respuestas y fallidos por canal (sin ventas atribuidas a la campaña). Scope: campaigns:read
id
🧬
journeys_list
Lista journeys (automatizaciones por pasos) con disparador y estadísticas. Por defecto solo los activos. Solo lectura. Scope: campaigns:read
page*limit*status*search*
🧬
journeys_get
Detalle de un journey: disparador, reingreso y resumen de sus pasos. Solo lectura. Scope: campaigns:read
id
🧬
journeys_enrollments_list
Quién está en un journey, en qué paso va y por qué salió. Filtra por contacto. Solo lectura. Scope: campaigns:read
idpage*limit*status*contactId*
🎪
events_list
Lista eventos por estado, ciudad, categoría y fechas. Scope: events:read
page*limit*status*city*category*search*+3 opcionales
🎪
events_get
Detalle de un evento con cupos y conteos por estado; la lista de inscritos con includeRegistrations=true. Scope: events:read
idincludeRegistrations*registrationsPage*registrationsLimit*
✅
events_register
Inscribe a una persona (busca o crea el contacto por email y teléfono). Idempotente. Scope: events:write
idcontactEmailcontactNamecontactPhone*
📋
surveys_list
Lista encuestas (satisfacción, NPS, formularios) por estado y visibilidad. Scope: surveys:read
page*limit*status*isPublic*
📋
surveys_get
Detalle de una encuesta con sus preguntas (questionId, tipo, opciones). Scope: surveys:read
id
📊
surveys_submit_response
Envía la respuesta de una persona. La API no permite leer respuestas ya enviadas. Scope: surveys:write
idemailanswerssyncToProfile*metadata*
🎫
tickets_list
Lista tickets por estado, prioridad, contacto, asesor y texto. Scope: tickets:read
search*status*priority*contactId*assignedToId*page*+1 opcionales
🎫
tickets_create
Crea un ticket. Si no encuentra el contacto, la categoría o el asesor, lo crea igual y lo dice en warnings. Scope: tickets:write
subjectdescriptionpriority*contactId*contactEmail*contactPhone*assignedToId*assignedToName*+2 opcionales
🎫
tickets_get
Detalle de un ticket con historial de estados y comentarios públicos paginados (sin notas internas). Scope: tickets:read
idcommentsPage*commentsLimit*
💬
tickets_add_comment
Comenta un ticket. Público: el cliente lo ve en su portal pero no recibe correo. Interno: solo el equipo. Scope: tickets:write
idcontentisInternal*
💬
conversations_list
Lista conversaciones del centro de contacto con canal, estado, contacto y asesor. Sin mensajes. Scope: conversations:read
page*limit*channelType*channel*status*priority*+2 opcionales
💬
conversations_get
Una conversación con sus últimos mensajes (hasta 50) y quién escribió cada uno. Scope: conversations:read
idmessagesLimit*
💬
conversations_get_messages
Lee los mensajes de una conversación página por página hacia atrás, con cursor. Scope: conversations:read
idlimit*before*
🤖
voice_ai_call_context_get
Contexto de una llamada de Voice AI (contacto, campaña, instrucciones), con warnings sobre lo inferido. Solo lectura: las llamadas salen de campañas y journeys. Scope: voice-ai:read
callId
📈
analytics_contacts
Contactos nuevos por día en 7d/30d/90d; los desgloses por estado, país y ciudad son de toda la base. Scope: analytics:read
period*
📈
analytics_deals
Ganados, perdidos, winRate y nuevos del periodo; pipeline por etapa de toda la base. Scope: analytics:read
period*
📈
analytics_summary
KPIs del CRM del periodo e históricos; metricScopes dice la ventana de cada cifra. Scope: analytics:read
period*
📞
collection_actions_list
Lista gestiones de cobranza por contacto, portafolio, canal y tipificación. Scope: collection:read
page*limit*contactId*portfolioId*disposition*channel*
📞
collection_actions_create
Registra una gestión hecha a un deudor (canal y tipificación obligatorios). Scope: collection:write
contactIdchanneldispositionportfolioId*actor*notes*promiseAmount*promiseDate*callDuration*
📄
collection_agreements_list
Lista acuerdos de pago con su plan de cuotas. Scope: collection:read
page*limit*status*contactId*portfolioId*
📄
collection_agreements_create
Crea un acuerdo de pago; las cuotas se generan solas y nace en PROPOSED. Scope: collection:write
contactIdoriginalAmountagreedAmountinstallmentsfrequencystartDateportfolioId*debtAccountId*discountPercent*currency*negotiatedById*negotiationChannel*
📄
collection_agreements_get
Detalle de un acuerdo con cuotas, pagos y estado. Scope: collection:read
id
📄
collection_agreements_update
Cambia solo el estado de un acuerdo (montos y cuotas quedan igual). Scope: collection:write
idstatus
📄
collection_agreements_installments
Todas las cuotas de un acuerdo, con el installmentId para registrar pagos. Scope: collection:read
id
💵
collection_agreements_pay
Registra el pago de una cuota con efectos contables: baja el saldo de la deuda y recalcula portafolios. Idempotente con paymentRef. Scope: collection:write
idinstallmentIdamountpaymentMethodpaymentRef*paidAt*
✅
collection_compliance_check
Verifica si se puede contactar a un deudor por un canal (horario, frecuencia, consentimiento). Scope: collection:read
contactIdchannelcountryCode*
📋
collection_compliance_consents_get
Consentimientos por canal y propósito, y noContactar con las revocaciones. Scope: collection:read
contactId
📋
collection_compliance_consents_create
Registra o actualiza un consentimiento con evidencia de cómo se obtuvo. Scope: collection:write
contactIdchannelisAuthorizedpurpose*grantedVia*grantedEvidence*
🚫
collection_compliance_opt_out
No contactar: por defecto (ALL) revoca cobranza y marketing, apaga el opt-in de WhatsApp y da de baja el correo. warnings dice qué envíos aún no lo respetan. Scope: collection:write
contactIdalcance*channel*revokedVia*reason*
📁
collection_portfolios_list
Lista portafolios con cartera, recuperado, tasa y saldo calculados al consultar. Scope: collection:read
page*limit*status*search*
📁
collection_portfolios_create
Crea un portafolio; la estrategia va por strategyId. Scope: collection:write
namedescription*currency*cutoffDate*strategyId*
📁
collection_portfolios_get
Detalle de un portafolio con sus cifras, gestiones por tipificación y acuerdos. Scope: collection:read
id
📁
collection_portfolios_update
Actualiza un portafolio; solo cambia lo enviado. Scope: collection:write
idname*description*currency*cutoffDate*strategyId*status*
➕
collection_portfolios_add_contacts
Agrega hasta 1.000 deudores existentes y separa agregados, repetidos e inválidos. Scope: collection:write
idcontactIds
➖
collection_portfolios_remove_contacts
Saca UN deudor del portafolio (sus deudas dejan de estar ligadas); sigue en el CRM. Scope: collection:write
idcontactId
👥
collection_portfolios_debtors
Deudores del portafolio con sus deudas en él, resumen y última gestión. Paginado. Scope: collection:read
idpage*limit*search*
📥
collection_portfolios_import
Importa cartera desde CSV con mapeo de columnas. Los saldos quedan en el perfil, no como cuentas de deuda. Scope: collection:write
idcsvDatacolumnMappingupdateExisting*
🏨
hotels_list
Hoteles con sus tipos de habitación: los hotelId y roomTypeId para reservar. Scope: hotels:read
page*limit*status*
🏨
hotels_availability
Disponibilidad y cotización completa de un hotel para unas fechas, con la misma lógica de la reserva. Scope: hotels:read
hotelIdcheckIncheckOutadults*children*
🏨
hotels_reservations_list
Lista reservas de hotel por hotel, contacto, estado y fecha de check-in. Scope: hotels:read
page*limit*hotelId*contactId*status*checkInAfter*+1 opcionales
🏨
hotels_reservations_create
Crea una reserva en BOOKING_PENDING (no bloquea habitación). Dispara hotel.booking.created y cada llamada crea otra reserva. Scope: hotels:write
hotelIdroomTypeIdcheckIn*checkOut*adults*children*guestContactId*guestEmail*+9 opcionales
🏨
hotels_reservations_get
Detalle de una reserva de hotel: habitaciones, servicios, pagos y huésped. Scope: hotels:read
bookingId*id*
🍽️
restaurants_list
Restaurantes con turnos, tamaño máximo de grupo y capacidad reservable. Scope: restaurants:read
page*limit*
🍽️
restaurants_reservations_list
Lista reservas de restaurante por sede, contacto, estado y fechas. Scope: restaurants:read
page*limit*restaurantId*contactId*status*dateAfter*+1 opcionales
🍽️
restaurants_reservations_create
Crea una reserva en PENDING dentro de un turno activo; cada llamada crea otra reserva. Scope: restaurants:write
datetimepartySizerestaurantId*guestContactId*guestName*guestEmail*guestPhone*specialRequests*+1 opcionales
🍽️
restaurants_reservations_get
Detalle de una reserva de restaurante. Scope: restaurants:read
id
🔐
otp_send
Envía un código OTP por WhatsApp y/o email y devuelve el otpId. Si no sale por ningún canal, responde error. Scope: otp:write
channelpurposephone*phoneCountryCode*email*metadata*variables*
🔐
otp_verify
Verifica el código con el otpId; si no es válido dice por qué y cuántos intentos quedan. Scope: otp:write
otpIdcode
🔐
otp_status
Estado de un OTP (enviado, verificado, vencido, fallido) y entrega por canal. Scope: otp:read
otpId*id*
📅
appointments_create
Agenda una cita (lun-sáb 7:00-19:00, sin choques). Puede crear el contacto, enlaza su oportunidad y dispara journeys e invitación. Scope: appointments:write
scheduledDatescheduledTimetypecontactPhone*contactId*contactName*contactEmail*timezone*duration*+8 opcionales
💬
whatsapp_list_lines
Todas las líneas (Cloud API y Evolution) con estado real y canSend. Con includeGroups trae los grupos. Scope: whatsapp:read o whatsapp:send
connectedOnly*includeGroups*lineId*
💬
whatsapp_send_message
Envía un texto 1:1 REAL: le llega a la persona, se cobra y queda en el inbox. Respeta opt-out y la ventana de 24 h de Cloud API. Scope: whatsapp:send
textlineId*credentialId*contactId*number*contactName*senderName*+1 opcionales
👥
whatsapp_send_group_message
Envía un texto a un grupo por una línea de Evolution. Lo reciben todos; no queda en el inbox. Scope: whatsapp:send
groupJidtextlineId*credentialId*senderName*

Integra con tu Plataforma

Selecciona tu cliente MCP y sigue las instrucciones para conectarte en minutos

Claude Desktop

Conecta Pine CRM a Claude Desktop usando mcp-remote

1

Crea tu API Key en pine.lat/developers/api-keys y cópiala (empieza por sk_live_).

2

Abre el archivo de configuración de Claude Desktop:

%APPDATA%\Claude\claude_desktop_config.json
3

Agrega la configuración del servidor MCP con tu API Key:

{ "mcpServers": { "pine-crm": { "command": "npx", "args": [ "mcp-remote", "https://mcp.pine.lat/mcp", "--header", "X-API-Key:sk_live_tu_api_key" ] } } }

Sin espacio después de los dos puntos: Claude Desktop parte los argumentos por espacios y perdería la key.

4

Reinicia Claude Desktop. Los tools de Pine CRM aparecerán automáticamente.

✓ Pine CRM conectado, 96 tools disponibles

Claude Code

Conecta Pine CRM directamente desde la terminal

1

Crea tu API Key en pine.lat/developers/api-keys.

2

Agrega el servidor con tu credencial en el header:

$ claude mcp add --transport http pine-crm https://mcp.pine.lat/mcp \ --header "X-API-Key: sk_live_tu_api_key"
3

O agrega a tu archivo .mcp.json en la raíz del proyecto:

{ "mcpServers": { "pine-crm": { "type": "http", "url": "https://mcp.pine.lat/mcp", "headers": { "X-API-Key": "sk_live_tu_api_key" } } } }
4

Claude Code detectará automáticamente los tools disponibles.

✓ Pine CRM conectado, 96 tools disponibles

Cursor

Conecta Pine CRM al IDE Cursor

1

Crea tu API Key en pine.lat/developers/api-keys.

2

Abre Settings → MCP Servers → Add new MCP Server y selecciona tipo HTTP

3

Ingresa la URL y el header de autenticación. Si prefieres editar el archivo, es ~/.cursor/mcp.json:

{ "mcpServers": { "pine-crm": { "url": "https://mcp.pine.lat/mcp", "headers": { "X-API-Key": "sk_live_tu_api_key" } } } }
4

Guarda y los tools estarán disponibles en el chat de Cursor.

✓ Pine CRM conectado, 96 tools disponibles

Windsurf

Conecta Pine CRM al IDE Windsurf (Codeium)

1

Crea tu API Key en pine.lat/developers/api-keys.

2

Abre Settings → MCP → Add server y selecciona HTTP Streamable

3

Ingresa la URL y el header. En archivo es ~/.codeium/windsurf/mcp_config.json:

{ "mcpServers": { "pine-crm": { "serverUrl": "https://mcp.pine.lat/mcp", "headers": { "X-API-Key": "sk_live_tu_api_key" } } } }
4

Activa el servidor. Los tools aparecerán en Cascade.

✓ Pine CRM conectado, 96 tools disponibles

Python SDK

Conecta desde cualquier aplicación Python

1

Instala el SDK de MCP:

$ pip install mcp
2

Conéctate al servidor de Pine CRM enviando tu API Key en el header:

import os from mcp import ClientSession from mcp.client.streamable_http import streamablehttp_client # La key se lee del entorno: no la dejes escrita en el código. async with streamablehttp_client( "https://mcp.pine.lat/mcp", headers={"X-API-Key": os.environ["PINE_CRM_API_KEY"]}, ) as (read, write, _): async with ClientSession(read, write) as session: await session.initialize() tools = await session.list_tools() print(f"Tools: {len(tools.tools)}")
3
✓ Pine CRM conectado, 96 tools disponibles

Node.js SDK

Conecta desde cualquier aplicación Node.js/TypeScript

1

Instala el SDK de MCP:

$ npm install @modelcontextprotocol/sdk
2

Conéctate al servidor de Pine CRM enviando tu API Key en el header:

import { Client } from "@modelcontextprotocol/sdk/client/index.js"; import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"; const client = new Client({ name: "my-app", version: "1.0.0" }); // La key se lee del entorno: no la dejes escrita en el código. const transport = new StreamableHTTPClientTransport( new URL("https://mcp.pine.lat/mcp"), { requestInit: { headers: { "X-API-Key": process.env.PINE_CRM_API_KEY } } } ); await client.connect(transport); const tools = await client.listTools(); console.log(`Tools: ${tools.tools.length}`);
3
✓ Pine CRM conectado, 96 tools disponibles

Recursos Disponibles

Esquemas y datos de referencia que el agente IA puede consultar para entender el modelo de datos

pine://schema/modules
Los 24 módulos con lo que hacen sus tools y cuántas hay, contadas del registro real del servidor.
pine://schema/contact-statuses
Los 5 estados de un contacto: PROSPECT, LEAD, ACTIVE, INACTIVE y CHURNED.
pine://schema/deal-priorities
Prioridades (HOT, WARM, COLD) y urgencias de una oportunidad. La urgencia se lee, pero la API no la escribe.
pine://schema/deal-stages
Dónde están las etapas: son propias de cada cuenta y se consultan con pipelines_list, sin nombres genéricos.

Qué Puede Hacer tu Agente

Ejemplos de flujos completos que un agente IA puede ejecutar con Pine CRM

👥

Gestión de Contactos

Buscar, crear y actualizar contactos y empresas, cargar listas en lote y llenar sus campos personalizados con los códigos reales de la cuenta.

💰

Pipeline de Ventas

Crear oportunidades en el pipeline y la etapa correctos, moverlas, consultar catálogo y cotizaciones, registrar pedidos y pagos, y medir ventas y tasa de cierre.

📣

Campañas Marketing

Armar y dividir audiencias, revisar campañas y journeys con sus métricas de entrega, y ver quién está en cada automatización.

🎫

Soporte al Cliente

Crear y comentar tickets, leer conversaciones completas del inbox y responder por WhatsApp dentro de las reglas del canal.

💵

Cobranza Inteligente

Gestionar portafolios de deuda, crear acuerdos de pago, registrar cobros y verificar compliance.

📊

Analíticas y KPIs

Resúmenes ejecutivos, métricas del pipeline y tendencias de contactos por periodo (7, 30 o 90 días), diciendo qué cifra es del periodo y cuál histórica.

🏨

Reservaciones

Consultar hoteles, restaurantes y disponibilidad con precio, y crear o revisar reservas.

🤖

Voice AI

Leer el contexto de una llamada de Voice AI (contacto, campaña e instrucciones). Las llamadas se lanzan desde campañas o journeys de Pine.