Mensajes
| Tool | Endpoint REST | Anotaciones |
|---|---|---|
send_message | POST /v1/messages | escritura, no destructiva |
send_template_message | POST /v1/messages/template | escritura, no destructiva |
list_scheduled_messages | GET /v1/messages/scheduled | lectura, idempotente |
get_scheduled_message | GET /v1/messages/scheduled/{messageId} | lectura, idempotente |
reschedule_scheduled_message | PATCH /v1/messages/scheduled/{messageId} | escritura, no destructiva |
cancel_scheduled_message | DELETE /v1/messages/scheduled/{messageId} | escritura, destructiva, idempotente |
Los fallos REST se entregan como errores de ejecución; consulta Errores MCP .
send_message
Envía un mensaje personalizado dentro de una conversación existente. La herramienta resuelve la conversación por conversationId y channelId; si hay varias conversaciones para el mismo teléfono, usa la más reciente que coincide con el canal. canSendDirectMessage solo puede ser false en WhatsApp, Instagram y Messenger/Facebook y se calcula desde el último mensaje del usuario.
Argumentos
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
channelId | string | sí | Canal del agente que enviará el mensaje. |
conversationId | string | sí | Teléfono o identificador de conversación del cliente. |
content | string \| object | sí | Texto simple, contenido estructurado para media/interactivos o instrucción al agente. |
type | "text" \| "image" \| "video" \| "file" \| "audio" \| "interactive" \| "email" \| "instruction" | no | Tipo del mensaje cuando content es objeto. Si content es string, se usa text. |
client | objeto | no | Datos del cliente (name, email, customFields, owners, …) para crearlo/enriquecerlo. |
campaignId | string | no | Agrupa el envío en una campaña. Default "api". |
delay | number ms | no | Programar con delay (3000-86 400 000 ms; máximo 24 horas). |
scheduleTime | ISO 8601 | no | Programar con fecha futura exacta, máximo 30 días después de la solicitud. Mutuamente exclusivo con delay. |
Ejemplo de invocación
{
"name": "send_message",
"arguments": {
"channelId": "wb-12345",
"conversationId": "+521234567890",
"content": "Hola, te escribo desde Platica API",
"client": {
"name": "Ana López",
"customFields": {
"placas": "ABC123"
}
}
}
} Ejemplo con media
{
"name": "send_message",
"arguments": {
"channelId": "wb-12345",
"conversationId": "+521234567890",
"type": "image",
"content": {
"image": {
"url": "https://cdn.assets.com/foto.jpg",
"caption": "Aquí está la foto"
}
}
}
} Ejemplo de instrucción al agente
Una instrucción no llega al cliente: se aplica sobre el agente que opera la conversación. Usa mode: "wait" para que el agente espere al próximo mensaje del cliente con la instrucción registrada como contexto, o mode: "resume" para reanudar al agente para que continúe el flujo.
{
"name": "send_message",
"arguments": {
"channelId": "wb-12345",
"conversationId": "+521234567890",
"type": "instruction",
"content": {
"text": "Continúa con el flujo de venta y ofrece un descuento del 10%.",
"mode": "resume"
}
}
} Si canSendDirectMessage es false en WhatsApp, usa send_template_message. En Instagram y
Messenger/Facebook aplica la política del canal. En chats internos platica siempre es true: usa un channelId workspace-{workspaceId}-agent-{agentId} y el conversationId chat_*. Soportan texto, imagen,
video, archivo, audio e instrucciones wait/resume; no soportan interactive, email ni plantillas.
send_template_message
Envía un mensaje basado en una plantilla aprobada de WhatsApp al cliente identificado por conversationId (número de teléfono internacional). Crea la conversación y/o el cliente si no existen. Se puede enviar inmediatamente, con delay (de 3000 ms a 24 horas) o con scheduleTime (ISO 8601, máximo 30 días después de la solicitud; hora de México si no incluye zona).
Argumentos
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
channelId | string | sí | Canal emisor (prefixedChannelId recomendado; teléfono/ID legacy aceptado). |
responderAgentId | string | no | Agente que atenderá respuestas; no necesita tener asignado el canal. |
conversationId | string | sí | Teléfono destinatario en formato E.164. |
template.name | string | sí | Nombre exacto de la plantilla. |
template.type | "image" \| "video" \| "document" | no | Si la plantilla tiene header multimedia. |
template.file | string (URL) | no | URL pública del archivo cuando type está presente. |
template.params | string[] | no | Valores ordenados para las variables del body. |
template.buttons[] | objeto | no | Override de parámetros de botones dinámicos (máx 3). |
template.components[] | objeto | no | Componentes adicionales (raramente necesario). |
client | objeto | no | Datos del cliente (name, email, …) para crearlo/enriquecerlo. |
campaignId | string | no | Agrupa el envío en una campaña. Default "api". |
delay | number ms | no | Programar con delay (3000-86 400 000 ms; máximo 24 horas). |
scheduleTime | ISO 8601 | no | Programar con fecha futura exacta, máximo 30 días después de la solicitud. Mutuamente exclusivo con delay. |
Ejemplo de invocación
{
"name": "send_template_message",
"arguments": {
"channelId": "wb-12345",
"conversationId": "+521234567890",
"template": {
"name": "bienvenida_v1",
"params": ["Ana", "10%"]
},
"client": {
"name": "Ana López",
"email": "ana@example.com"
}
}
} Usa list_templates o get_template antes de invocar send_template_message para descubrir el shape exacto de params, buttons y components. La respuesta de get_template incluye un campo api_example con el payload listo para pegar como arguments.
Si omites responderAgentId con un canal canónico, la conversación nueva
queda initiated y sin agente. El default del canal no se hereda. Un input
legacy (teléfono del agente) sí conserva ese agente. Un contacto con status: "blocked" devuelve CONTACT_BLOCKED y no recibe el mensaje.
Cuando send_message o send_template_message recibe delay o scheduleTime, su resultado HTTP 202 incluye messageId, kind, status, executeAt en UTC, timestamp y delayMs o scheduledTime. Ese messageId basta para usar las cuatro herramientas siguientes; no necesitas campaignId, runId ni un ID interno de tarea.
list_scheduled_messages
Lista mensajes de servicio y plantillas programadas. Sin status, devuelve los activos: creating, delayed, scheduled y processing.
Argumentos
| Campo | Tipo | Default | Descripción |
|---|---|---|---|
workspace | string | — | Workspace a consultar. Solo es obligatorio para credenciales multi-workspace. |
status | string CSV | creating,delayed,scheduled,processing | Estados a incluir: creating, delayed, scheduled, processing, sent, cancelled, failed. |
kind | "service" \| "template" | — | Filtra por clase de mensaje. |
campaignId | string | — | Filtra por campaña; no es necesario para administrar el resultado. |
from | ISO 8601 | — | Inicio del rango de executeAt. |
to | ISO 8601 | — | Fin del rango de executeAt. |
limit | 1-200 | 50 | Máximo de resultados por página. |
pageToken | string | — | Token opaco devuelto por la página anterior. |
Ejemplo de invocación
{
"name": "list_scheduled_messages",
"arguments": {
"status": "scheduled,processing",
"kind": "template",
"from": "2026-10-01T00:00:00Z",
"to": "2026-11-01T00:00:00Z",
"limit": 50
}
} Resultado
{
"messages": [
{
"messageId": "msg_01JQ91AB7C4D8E2F6G0H",
"kind": "template",
"status": "scheduled",
"channelId": "wb-12345",
"conversationId": "5215512345678",
"campaignId": "api",
"messageType": null,
"templateName": "recordatorio_cita",
"preview": "Hola Ana, te recordamos tu cita...",
"phoneNumber": "5215512345678",
"name": "Ana López",
"executeAt": "2026-10-15T15:45:00.000Z",
"createdAt": "2026-09-20T20:00:00.000Z",
"updatedAt": "2026-09-20T20:00:00.000Z",
"cancelledAt": null,
"sentAt": null,
"failedAt": null,
"error": null,
"reschedulable": true
}
],
"count": 1,
"nextPageToken": "eyJleGVjdXRlQXQiOiIyMDI2LTEwLTE1VDE1OjQ1OjAwLjAwMFoifQ"
} Para continuar, conserva los filtros y pasa nextPageToken como pageToken. Si no aparece, no hay
más páginas.
get_scheduled_message
Obtiene un mensaje programado por su identificador público.
Argumentos
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
messageId | string | sí | ID devuelto por una herramienta de envío programado. |
workspace | string | no¹ | Workspace del mensaje. |
¹ Obligatorio cuando la credencial tiene acceso a varios workspaces.
Ejemplo de invocación
{
"name": "get_scheduled_message",
"arguments": {
"messageId": "msg_01JQ91AB7C4D8E2F6G0H"
}
} El resultado es un recurso con los mismos campos públicos que un elemento de list_scheduled_messages. conversationId, campaignId, messageType, templateName, preview, phoneNumber, name, cancelledAt, sentAt, failedAt y error pueden ser null. Nunca incluye
el payload completo ni taskId.
reschedule_scheduled_message
Cambia la ejecución de un mensaje que todavía tiene reschedulable: true. Envía exactamente uno de scheduleTime o delay.
Argumentos
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
messageId | string | sí | ID público del mensaje. |
scheduleTime | ISO 8601 | sí¹ | Nueva fecha futura, máximo 30 días después de la solicitud. |
delay | number ms | sí¹ | Nuevo retraso de 3000 a 86400000 ms (24 horas). |
workspace | string | no² | Workspace del mensaje. |
¹ Envía exactamente uno. ² Obligatorio para credenciales multi-workspace.
Ejemplo de invocación
{
"name": "reschedule_scheduled_message",
"arguments": {
"messageId": "msg_01JQ91AB7C4D8E2F6G0H",
"scheduleTime": "2026-10-16T10:30:00-06:00"
}
} El resultado devuelve el recurso actualizado. Con scheduleTime queda scheduled; con delay, delayed. Las fechas públicas, incluido executeAt, siempre están normalizadas a UTC. Un mensaje processing, sent, cancelled o failed ya no se puede reprogramar; el error REST 409 se
entrega como error de ejecución MCP.
cancel_scheduled_message
Cancela un mensaje antes de que empiece a procesarse.
Argumentos
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
messageId | string | sí | ID público del mensaje. |
workspace | string | no¹ | Workspace del mensaje. |
¹ Obligatorio para credenciales multi-workspace.
Ejemplo de invocación
{
"name": "cancel_scheduled_message",
"arguments": {
"messageId": "msg_01JQ91AB7C4D8E2F6G0H"
}
} La herramienta devuelve el recurso con status: "cancelled", cancelledAt y reschedulable: false. Es idempotente: repetirla devuelve el mismo recurso cancelado. Los estados processing, sent y failed producen 409.
Consulta el contrato completo, los estados y todos los campos en Mensajes Programados .
send_chat_message usa scheduleAt para programar un turno del cliente con un agente. Ese flujo es
independiente y no se administra con las herramientas de mensajes programados.