Server definition
- Hash
- sha256:927bfbb6d30c75622e7e9c1ec4755386a2c919c33d28e0dcc562e3b73a0378b4
- What it is
- What a remote MCP server returned when asked what it offers: 40 tools
The blob, as servednamed by its sha256
{
"instructions": "Postari · email marketing y transaccional, AI-native. ESTRELLA AGÉNTICA: launch_campaign — describe en lenguaje natural qué comunicar + la lista, y Postari genera y arma la campaña completa (con confirm_send:true la envía de verdad). send_transactional_email para correos 1-a-1 (cotizaciones/recibos). list_campaigns/account_stats/get_campaign_stats para métricas. create_subscriber/add_subscriber_to_list/tag_subscribers para audiencia. trigger_flow para automatizaciones. Autentícate con tu API key ef_live_* (header Authorization: Bearer).",
"tools": [
{
"description": "Métricas globales de la cuenta (enviados, entregados, abrieron, hicieron clic, bajas, rebotes, contactos nuevos) en un rango de días de la zona horaria de la cuenta, ambos incluidos; la cohorte es el día de ENVÍO de cada correo, la misma fuente que /metricas. avg_open_rate y avg_click_rate en % con 2 decimales sobre ENTREGADOS (avg_*_rate_fraction: alias deprecados en fracción). Si hay días aún sin calcular responde 503 metrics_recalculating: reintenta, nunca son sumas parciales. Rebote separado: bounced_hard / bounce_rate_hard (definitivo, el que se vigila) y bounced_soft / bounce_rate_soft (temporal), en % sobre enviados (bounce_rates_base: \"sent\"); null si el período no tiene el tipo medido, nunca un 0 inventado. total_bounces = definitivos + temporales. Ojo: en la ficha de campaña (get_campaign_stats) el mismo dato se llama bounce_hard_rate.",
"inputSchema": {
"properties": {
"from": {
"description": "Fecha inicio YYYY-MM-DD (opcional).",
"type": "string"
},
"to": {
"description": "Fecha fin YYYY-MM-DD (opcional).",
"type": "string"
}
},
"type": "object"
},
"name": "account_stats",
"outputSchema": null
},
{
"description": "Pone la automatización en servicio (status active) o la pausa con paused:true. OJO: activar NO hace que envíe — para eso hace falta armarla (arm_flow).",
"inputSchema": {
"properties": {
"flow_id": {
"type": "string"
},
"paused": {
"description": "true para pausar en vez de activar.",
"type": "boolean"
}
},
"required": [
"flow_id"
],
"type": "object"
},
"name": "activate_flow",
"outputSchema": null
},
{
"description": "Añade un contacto (por email o contact_id) a una lista.",
"inputSchema": {
"properties": {
"contact_id": {
"type": "string"
},
"email": {
"type": "string"
},
"list_id": {
"description": "ID de la lista.",
"type": "string"
}
},
"required": [
"list_id"
],
"type": "object"
},
"name": "add_subscriber_to_list",
"outputSchema": null
},
{
"description": "ARMA la automatización: a partir de aquí envía correos REALES sola. Exige confirm:\"ARMAR ENVIOS\" literal, haber probado el flujo antes, y que la cuenta permita envíos por agente. NO es retroactivo: solo entra quien cumpla el disparador de ahora en adelante.",
"inputSchema": {
"properties": {
"acknowledge_no_list_filter": {
"description": "Obligatorio si el disparador es \"cualquier lista\".",
"type": "boolean"
},
"confirm": {
"description": "Tiene que ser exactamente \"ARMAR ENVIOS\".",
"type": "string"
},
"flow_id": {
"type": "string"
}
},
"required": [
"flow_id",
"confirm"
],
"type": "object"
},
"name": "arm_flow",
"outputSchema": null
},
{
"description": "Saca de circulación a los contactos activos que tienen un rebote PERMANENTE (la dirección no existe) o 3 rebotes temporales seguidos sin ninguna señal de vida entre medio (ni entregado, ni abierto, ni clic). Un rebote temporal suelto, como un buzón lleno, nunca saca a nadie. Deja escrito el motivo en el contacto. Sin `aplicar:true` solo devuelve el recuento por motivo, no cambia nada.",
"inputSchema": {
"properties": {
"aplicar": {
"description": "false (por defecto) = simulacro, devuelve el recuento sin tocar nada. true = ejecuta la supresión.",
"type": "boolean"
},
"list_id": {
"description": "Limitar la limpieza a una lista. Si se omite, aplica a toda la cuenta.",
"type": "string"
}
},
"type": "object"
},
"name": "clean_bounced_subscribers",
"outputSchema": null
},
{
"description": "Crea una automatización. NACE EN BORRADOR Y DESARMADA: no envía nada hasta que se pruebe, se active y se arme a propósito. El `graph` es el mismo formato que devuelve get_flow.",
"inputSchema": {
"properties": {
"graph": {
"additionalProperties": true,
"description": "Pasos: {\"nodes\":[{\"id\":\"1\",\"type\":\"email\",\"label\":\"...\",\"config\":{\"subject\":\"...\",\"blocks\":[...]},\"next\":\"2\"}],\"edges\":[]}.",
"type": "object"
},
"name": {
"type": "string"
},
"trigger_config": {
"additionalProperties": true,
"description": "Config del disparador (p. ej. {\"list_id\":\"...\"}).",
"type": "object"
},
"trigger_type": {
"description": "list_subscribe | tag_added | form_submit | date_relative | birthday | abandoned_cart | api | manual…",
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"name": "create_flow",
"outputSchema": null
},
{
"description": "Crea un formulario de captación y devuelve su URL pública y su código para embeber. Si no pasas campos, lleva uno de correo.",
"inputSchema": {
"properties": {
"display_mode": {
"description": "inline | popup.",
"type": "string"
},
"double_optin": {
"type": "boolean"
},
"fields": {
"description": "Campos: [{name,type,label,required}]. Debe incluir uno \"email\".",
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array"
},
"list_id": {
"description": "Lista donde caen las altas.",
"type": "string"
},
"name": {
"type": "string"
},
"thank_you_message": {
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"name": "create_form",
"outputSchema": null
},
{
"description": "Crea una página de aterrizaje y devuelve su URL pública. `kind`: blocks (bloques de Postari) · code (HTML propio) · ai (desde un prompt) · iframe · external_url. Conéctale un formulario con form_id para que capte suscriptores.",
"inputSchema": {
"properties": {
"ai_prompt": {
"description": "Instrucción si kind=ai.",
"type": "string"
},
"blocks": {
"description": "Contenido si kind=blocks.",
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array"
},
"external_url": {
"type": "string"
},
"form_id": {
"description": "Formulario que se muestra en la página.",
"type": "string"
},
"html_code": {
"description": "HTML si kind=code.",
"type": "string"
},
"iframe_url": {
"type": "string"
},
"kind": {
"description": "blocks | code | ai | iframe | external_url. Default: blocks.",
"type": "string"
},
"name": {
"type": "string"
},
"slug": {
"description": "Va en la URL /l/<slug>: minúsculas, números y guiones.",
"type": "string"
}
},
"required": [
"name",
"slug"
],
"type": "object"
},
"name": "create_landing",
"outputSchema": null
},
{
"description": "Crea un LANZAMIENTO (curso, infoproducto, evento…) con sus etapas: es la unidad que agrupa los correos de una campaña con fechas. Si no pasas `stages` y el tipo es curso/infoproducto, siembra 8 etapas estándar (lead magnet → webinar → apertura de carrito → cierre).",
"inputSchema": {
"properties": {
"ends_at": {
"description": "Fecha de cierre en ISO 8601.",
"type": "string"
},
"kind": {
"description": "curso | membresía | infoproducto | evento | servicio | otro. Default: curso.",
"type": "string"
},
"name": {
"description": "Nombre del lanzamiento.",
"type": "string"
},
"seed_default_stages": {
"description": "false para crearlo SIN etapas. Default: true en curso/infoproducto.",
"type": "boolean"
},
"stages": {
"description": "Etapas explícitas: [{kind,title,scheduled_at}].",
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array"
},
"starts_at": {
"description": "Fecha de inicio en ISO 8601.",
"type": "string"
},
"target_revenue_cents": {
"description": "Objetivo de facturación en céntimos (opcional).",
"type": "number"
}
},
"required": [
"name"
],
"type": "object"
},
"name": "create_launch",
"outputSchema": null
},
{
"description": "Crea una nueva lista de contactos.",
"inputSchema": {
"properties": {
"description": {
"type": "string"
},
"name": {
"description": "Nombre de la lista.",
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"name": "create_list",
"outputSchema": null
},
{
"description": "Crea un segmento: una regla de \"quién entra\" que se recalcula sola. Es lo que se usa para segmentar un lanzamiento sin duplicar listas.",
"inputSchema": {
"properties": {
"definition": {
"additionalProperties": true,
"description": "Reglas del segmento (mismo JSON que la UI de /segmentos).",
"type": "object"
},
"description": {
"type": "string"
},
"name": {
"type": "string"
}
},
"required": [
"name",
"definition"
],
"type": "object"
},
"name": "create_segment",
"outputSchema": null
},
{
"description": "Crea o actualiza (upsert) un contacto/suscriptor. Si ya existe, lo actualiza sin duplicar.",
"inputSchema": {
"properties": {
"country": {
"description": "Código ISO de país, ej \"CO\".",
"type": "string"
},
"email": {
"description": "Correo del contacto (requerido).",
"type": "string"
},
"first_name": {
"type": "string"
},
"last_name": {
"type": "string"
},
"metadata": {
"additionalProperties": true,
"description": "Campos personalizados.",
"type": "object"
},
"phone": {
"type": "string"
},
"tags": {
"description": "Etiquetas a aplicar.",
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"email"
],
"type": "object"
},
"name": "create_subscriber",
"outputSchema": null
},
{
"description": "Crea una etiqueta (idempotente: si ya existe devuelve la que hay, no la duplica).",
"inputSchema": {
"properties": {
"color": {
"type": "string"
},
"name": {
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"name": "create_tag",
"outputSchema": null
},
{
"description": "Crea una plantilla propia de la cuenta, opcionalmente duplicando una del catálogo con from_template_id. Las del catálogo son compartidas y no se editan.",
"inputSchema": {
"properties": {
"blocks": {
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array"
},
"category": {
"type": "string"
},
"description": {
"type": "string"
},
"from_template_id": {
"description": "Duplica esta plantilla como punto de partida.",
"type": "string"
},
"name": {
"type": "string"
},
"preheader": {
"type": "string"
},
"subject": {
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"name": "create_template",
"outputSchema": null
},
{
"description": "Diagnóstico de ENTREGABILIDAD de la cuenta (últimos 28 días): rebotes, quejas de spam, aperturas y salud del dominio (DNS). Devuelve un veredicto (sano/a_vigilar/en_riesgo) + acciones priorizadas. El rebote que se juzga (`bounce_rate`) es el DEFINITIVO; el temporal (buzón lleno) va aparte en `bounce_rate_temporal`. Tasas en % con 2 decimales: rebotes y quejas sobre ENVIADOS (umbrales sanos <2 % y <0,1 %); open_rate sobre ENTREGADOS, como account_stats. Úsalo antes de un envío grande o si los correos no llegan.",
"inputSchema": {
"properties": {},
"type": "object"
},
"name": "diagnose_deliverability",
"outputSchema": null
},
{
"description": "Transparencia \"qué hizo la IA\": lista las acciones de la cuenta originadas por un agente/IA (chat Atelier, API de agente, A2A) — qué se hizo, sobre qué y cuándo. Para auditar lo que un agente ejecutó.",
"inputSchema": {
"properties": {
"limit": {
"description": "1-100, default 50.",
"type": "number"
}
},
"type": "object"
},
"name": "get_agent_activity",
"outputSchema": null
},
{
"description": "¿A cuánta gente le va a llegar este correo? Devuelve los destinatarios REALES aplicando el filtro guardado, por el mismo camino que el envío: base = activos de la lista hoy, excluidos = los que quita el filtro, audience_live_total = el público de HOY. Si ya empezó a enviarse trae además recipients_snapshot (la foto del primer tick), excluded_on_send (tope de frecuencia y dominios bloqueados) y remaining_to_send. total_recipients es un alias deprecado de audience_live_total.",
"inputSchema": {
"properties": {
"campaign_id": {
"type": "string"
}
},
"required": [
"campaign_id"
],
"type": "object"
},
"name": "get_campaign_audience",
"outputSchema": null
},
{
"description": "Métricas reales de una campaña leídas de los eventos en vivo: enviados, entregados, abrieron (únicos y aperturas registradas), clics únicos y registrados, clics de sistema, rebotes (bounce_hard_rate = definitivo, el que se vigila), bajas, quejas, ingresos USD atribuidos y by_link (clics de contenido por URL). maturity: sending/paused = parcial, settling = enviada hace menos de 24 h. stale true = la lectura falló y las cifras no son de fiar. Definiciones: enviados = correos con sent_at; entregados = enviados − rebotados; abrieron = correos con apertura (píxel, webhook o clic); clics únicos = correos con clic en un enlace de contenido (baja, preferencias y pie aparte en clicked_system). Tasas en % con 2 decimales: entrega y rebote sobre ENVIADOS; apertura, clic, bajas y quejas sobre ENTREGADOS (rate_base \"delivered\"); ctor = clics únicos / abrieron. null = sin denominador, nunca 0 inventado. *_fraction son alias heredados en fracción 0-1 (deprecados).",
"inputSchema": {
"properties": {
"campaign_id": {
"description": "ID de la campaña.",
"type": "string"
}
},
"required": [
"campaign_id"
],
"type": "object"
},
"name": "get_campaign_stats",
"outputSchema": null
},
{
"description": "Un formulario con sus campos y sus KPIs reales (form_kpis_v1): submissions = inscripciones, views, views_measured y conversion_rate (% con 1 decimal, null si las vistas no están medidas). Mismas definiciones que list_forms. Si form_kpis_v1 falla, devuelve los contadores del formulario (misma definición), sin marca de error.",
"inputSchema": {
"properties": {
"form_id": {
"description": "ID del formulario.",
"type": "string"
}
},
"required": [
"form_id"
],
"type": "object"
},
"name": "get_form",
"outputSchema": null
},
{
"description": "Un lanzamiento con sus etapas y las MÉTRICAS REALES de cada una (enviados, entregados, abrieron, clics únicos, bajas, ingresos USD) más el total; cada campaña se suma una sola vez. stages_sent de stages_total = etapas ya enviadas. metrics null en una etapa = todavía no tiene correo (no es 0). Es la forma de saber cómo va un lanzamiento. Definiciones: enviados = correos con sent_at; entregados = enviados − rebotados; abrieron = correos con apertura (píxel, webhook o clic); clics únicos = correos con clic en un enlace de contenido (baja, preferencias y pie aparte en clicked_system). Tasas en % con 2 decimales: entrega y rebote sobre ENVIADOS; apertura, clic, bajas y quejas sobre ENTREGADOS (rate_base \"delivered\"); ctor = clics únicos / abrieron. null = sin denominador, nunca 0 inventado. *_fraction son alias heredados en fracción 0-1 (deprecados).",
"inputSchema": {
"properties": {
"launch_id": {
"type": "string"
}
},
"required": [
"launch_id"
],
"type": "object"
},
"name": "get_launch",
"outputSchema": null
},
{
"description": "Busca un contacto por su correo y devuelve sus datos, estado, etiquetas e historial básico. Si está rebotado trae `bounce: {tipo, subtipo, fecha, motivo, dominio_sugerido}` (tipo permanente o temporal; motivo rebote_permanente, rebote_temporal_repetido, rebote_temporal o rebote_sin_evento; dominio_sugerido si la dirección parece mal escrita, p. ej. gmail.co → gmail.com); si no, `bounce: null`.",
"inputSchema": {
"properties": {
"email": {
"description": "Correo a buscar.",
"type": "string"
}
},
"required": [
"email"
],
"type": "object"
},
"name": "get_subscriber",
"outputSchema": null
},
{
"description": "AGÉNTICA · Lanza una campaña de correo COMPLETA desde un brief en lenguaje natural. Postari GENERA el correo (asunto + diseño con la voz y el color de marca del tenant), lo arma sobre una lista y devuelve un BORRADOR con preview (preview_html). Por defecto NO envía: para enviar de verdad, vuelve a llamar con los mismos campos + confirm_send:true (o scheduled_at para agendar). Es la forma de \"dile el objetivo y Postari lo logra\". Requiere scope `write` (borrador) o `send` (enviar).",
"inputSchema": {
"properties": {
"blocks": {
"description": "Bloques de contenido propios (opcional · alternativa a brief).",
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array"
},
"brief": {
"description": "Qué comunicar, en lenguaje natural. Ej: \"Black Friday 30% OFF en todos los cursos, tono urgente, cierra el viernes\". Postari escribe el correo.",
"type": "string"
},
"confirm_send": {
"description": "false (default) = solo borrador + preview, no envía. true = ENVÍA de verdad a la lista (requiere scope send + que el tenant tenga habilitados los envíos por agente).",
"type": "boolean"
},
"cta_label": {
"description": "Texto del botón (opcional).",
"type": "string"
},
"cta_url": {
"description": "URL del botón principal (opcional).",
"type": "string"
},
"from_name": {
"description": "Nombre del remitente (opcional).",
"type": "string"
},
"goal": {
"description": "Objetivo opcional: ventas, reactivación, anuncio, evento…",
"type": "string"
},
"html_body": {
"description": "HTML libre (opcional · alternativa a brief/blocks).",
"type": "string"
},
"list_id": {
"description": "UUID de la lista destino (usa list_lists para verlas).",
"type": "string"
},
"scheduled_at": {
"description": "ISO8601 para agendar el envío (opcional · requiere confirm_send).",
"type": "string"
},
"subject": {
"description": "Asunto exacto (opcional · si lo das, no se genera).",
"type": "string"
},
"tone": {
"description": "Tono opcional: cálido, urgente, divertido, profesional…",
"type": "string"
},
"variables": {
"additionalProperties": true,
"description": "Variables mustache {{var}} (opcional).",
"type": "object"
}
},
"required": [
"list_id"
],
"type": "object"
},
"name": "launch_campaign",
"outputSchema": null
},
{
"description": "Conecta un correo YA ESCRITO a una etapa del lanzamiento (o lo desconecta con campaign_id null). Sin esto la etapa no mide nada: sus KPIs dependen de este vínculo. También sirve para cambiar título, fecha o estado de la etapa.",
"inputSchema": {
"properties": {
"campaign_id": {
"description": "ID de la campaña a conectar. null para desconectar.",
"type": "string"
},
"launch_id": {
"type": "string"
},
"scheduled_at": {
"description": "ISO 8601.",
"type": "string"
},
"stage_id": {
"type": "string"
},
"status": {
"description": "planned | sent | done | skipped.",
"type": "string"
},
"title": {
"type": "string"
}
},
"required": [
"launch_id",
"stage_id"
],
"type": "object"
},
"name": "link_campaign_to_launch_stage",
"outputSchema": null
},
{
"description": "Lista las campañas/correos del tenant con sus métricas (metrics.*, desde los contadores que mantiene el reconciliador: durante un envío pueden ir unos minutos detrás de get_campaign_stats). En este listado opened_total, clicked_total, clicked_system, delivered_confirmed, failed, bounced_hard, bounced_soft y bounce_hard_rate llegan en null (los contadores no los guardan; null = no medido, no 0): pídelos a get_campaign_stats. audience_count = «¿a cuántos?»: si ya empezó, la foto del envío; en borrador o programada, los ACTIVOS de la lista hoy ANTES del filtro guardado (audience_basis \"list_active_before_filters\"); el neto exacto lo da get_campaign_audience. Filtrable por estado (draft, scheduled, sending, sent). Definiciones: enviados = correos con sent_at; entregados = enviados − rebotados; abrieron = correos con apertura (píxel, webhook o clic); clics únicos = correos con clic en un enlace de contenido (baja, preferencias y pie aparte en clicked_system). Tasas en % con 2 decimales: entrega y rebote sobre ENVIADOS; apertura, clic, bajas y quejas sobre ENTREGADOS (rate_base \"delivered\"); ctor = clics únicos / abrieron. null = sin denominador, nunca 0 inventado. *_fraction son alias heredados en fracción 0-1 (deprecados).",
"inputSchema": {
"properties": {
"limit": {
"description": "1-500, default 20.",
"type": "number"
},
"status": {
"description": "Filtro de estado (opcional).",
"type": "string"
}
},
"type": "object"
},
"name": "list_campaigns",
"outputSchema": null
},
{
"description": "Los correos de una automatización, cada uno con su node_id, su asunto y su URL propia para compartir con el cliente. Antes estos correos no tenían dirección: vivían enterrados en el flujo.",
"inputSchema": {
"properties": {
"flow_id": {
"type": "string"
}
},
"required": [
"flow_id"
],
"type": "object"
},
"name": "list_flow_emails",
"outputSchema": null
},
{
"description": "Lista los formularios de captación con sus KPIs: submissions = inscripciones (respuestas sin papelera; la unidad de un formulario), views = cargas del formulario (1 por navegador cada 24 h), views_measured false = la página que envía las inscripciones no avisa de las visitas, conversion_rate = inscripciones / vistas en % con 1 decimal (null si las vistas no están medidas). Los mismos números que la app.",
"inputSchema": {
"properties": {
"is_active": {
"description": "true = solo activos · false = solo inactivos (opcional).",
"type": "boolean"
},
"limit": {
"description": "1-200, default 100.",
"type": "number"
}
},
"type": "object"
},
"name": "list_forms",
"outputSchema": null
},
{
"description": "Lista las páginas de aterrizaje con sus visitas, conversiones y tasa de conversión (conversion_rate = conversiones / visitas en % con 2 decimales; 0 si aún no hubo visitas).",
"inputSchema": {
"properties": {
"limit": {
"type": "number"
}
},
"type": "object"
},
"name": "list_landings",
"outputSchema": null
},
{
"description": "Lista los lanzamientos de la cuenta, con cuántas etapas tiene cada uno y cuántas ya están conectadas a un correo.",
"inputSchema": {
"properties": {
"limit": {
"type": "number"
},
"status": {
"description": "planning | active | closed | archived.",
"type": "string"
}
},
"type": "object"
},
"name": "list_launches",
"outputSchema": null
},
{
"description": "Lista todas las listas de contactos con su tamaño: active_count = contactos ACTIVOS (a quienes les llega un envío) y total_count = todas las membresías (cualquier estado), de list_sizes_v1, la misma fuente que la app. Una lista inteligente se mide evaluando su filtro (hoy no se envía a listas inteligentes); size_ok false = no se pudo medir y los conteos vienen en null. contacts_count es un alias deprecado de total_count.",
"inputSchema": {
"properties": {},
"type": "object"
},
"name": "list_lists",
"outputSchema": null
},
{
"description": "Devuelve a tus envíos a un contacto que salió por un rebote TEMPORAL suelto (buzón lleno, servidor ocupado). Solo funciona si el rebote fue temporal, el dominio no está bloqueado ni mal escrito (gmail.co, hormail.com: corrige la dirección; el 409 trae dominio_sugerido) y no se dio de baja ni marcó spam; si no, responde 409 con el motivo (por ejemplo, rebote definitivo: la dirección no existe). No reanuda flujos viejos ni envía la bienvenida. Úsalo en vez de update_subscriber con status \"active\".",
"inputSchema": {
"properties": {
"email": {
"description": "Correo (o id) del contacto rebotado.",
"type": "string"
}
},
"required": [
"email"
],
"type": "object"
},
"name": "reactivate_bounced_subscriber",
"outputSchema": null
},
{
"description": "Envía un correo transaccional 1-a-1 (cotización, recibo, bienvenida, recordatorio) a UNA dirección, usando una plantilla y variables. Síncrono. Requiere scope `send`.",
"inputSchema": {
"properties": {
"confirm_send": {
"description": "Obligatorio en true para enviar de verdad (acción sensible: además la cuenta debe tener habilitados los envíos por agente). Sin él no se envía nada.",
"type": "boolean"
},
"from_name": {
"description": "Nombre del remitente (opcional).",
"type": "string"
},
"html_body": {
"description": "HTML libre (opcional, alternativa a template_id).",
"type": "string"
},
"subject": {
"description": "Asunto (opcional si la plantilla lo trae).",
"type": "string"
},
"template_id": {
"description": "ID de la plantilla en Postari (opcional si mandas subject+html_body).",
"type": "string"
},
"to_email": {
"description": "Correo del destinatario.",
"type": "string"
},
"variables": {
"additionalProperties": true,
"description": "Variables mustache {{var}} para rellenar la plantilla. Ej: {\"first_name\":\"María\"}.",
"type": "object"
}
},
"required": [
"to_email"
],
"type": "object"
},
"name": "send_transactional_email",
"outputSchema": null
},
{
"description": "Define A QUIÉN se le manda un correo y a quién NO: excluir por etiqueta, por lista entera o por haber recibido otra campaña. Devuelve el número REAL de destinatarios para confirmar antes de enviar. Si alguna referencia no existe, falla con 400 en vez de guardar a medias.",
"inputSchema": {
"properties": {
"campaign_id": {
"type": "string"
},
"exclude_campaigns": {
"description": "Fuera quien ya recibió estas campañas · no repetir el envío.",
"items": {
"type": "string"
},
"type": "array"
},
"exclude_lists": {
"description": "Fuera los miembros de estas listas · \"manda a A menos los de B\".",
"items": {
"type": "string"
},
"type": "array"
},
"exclude_tags": {
"description": "Fuera quien tenga estas etiquetas (nombre o UUID).",
"items": {
"type": "string"
},
"type": "array"
},
"include_tags": {
"description": "Solo quien tenga estas etiquetas (nombre o UUID).",
"items": {
"type": "string"
},
"type": "array"
},
"tag_on_delivery": {
"description": "Etiqueta que se pone a quien RECIBA el correo, para poder excluirlo la próxima vez.",
"type": "string"
}
},
"required": [
"campaign_id"
],
"type": "object"
},
"name": "set_campaign_audience",
"outputSchema": null
},
{
"description": "Añade o quita una etiqueta a varios contactos (por emails o contact_ids).",
"inputSchema": {
"properties": {
"contact_ids": {
"items": {
"type": "string"
},
"type": "array"
},
"emails": {
"items": {
"type": "string"
},
"type": "array"
},
"operation": {
"description": "add (default) o remove.",
"enum": [
"add",
"remove"
],
"type": "string"
},
"tag": {
"description": "Nombre de la etiqueta.",
"type": "string"
}
},
"required": [
"tag"
],
"type": "object"
},
"name": "tag_subscribers",
"outputSchema": null
},
{
"description": "Prueba una automatización enviándola de verdad a UN miembro de la cuenta (por defecto el dueño). Es OBLIGATORIO antes de armar. No se puede usar para mandar correo a terceros: to_email tiene que ser de un miembro.",
"inputSchema": {
"properties": {
"flow_id": {
"type": "string"
},
"to_email": {
"description": "Correo de un miembro de la cuenta. Por defecto, el dueño.",
"type": "string"
}
},
"required": [
"flow_id"
],
"type": "object"
},
"name": "test_flow",
"outputSchema": null
},
{
"description": "Mete un contacto (por email o contact_id) en un flujo automático para que reciba esa secuencia.",
"inputSchema": {
"properties": {
"contact_id": {
"type": "string"
},
"email": {
"type": "string"
},
"flow_id": {
"description": "ID del flujo.",
"type": "string"
},
"trigger_data": {
"additionalProperties": true,
"type": "object"
}
},
"required": [
"flow_id"
],
"type": "object"
},
"name": "trigger_flow",
"outputSchema": null
},
{
"description": "Edita una automatización: nombre, disparador, pasos (graph) o estado. NO sirve para armar (eso es arm_flow, que exige confirmación); sí para DESARMAR con armed:false.",
"inputSchema": {
"properties": {
"armed": {
"description": "Solo false (desarmar). Para armar usa arm_flow.",
"type": "boolean"
},
"flow_id": {
"type": "string"
},
"graph": {
"additionalProperties": true,
"type": "object"
},
"name": {
"type": "string"
},
"status": {
"description": "draft | active | paused.",
"type": "string"
},
"trigger_config": {
"additionalProperties": true,
"type": "object"
}
},
"required": [
"flow_id"
],
"type": "object"
},
"name": "update_flow",
"outputSchema": null
},
{
"description": "Edita UN correo de una automatización (asunto, preheader, bloques o etiqueta) sin tocar el resto del flujo. Más seguro que reescribir el graph entero.",
"inputSchema": {
"properties": {
"blocks": {
"description": "Bloques del correo.",
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array"
},
"flow_id": {
"type": "string"
},
"label": {
"type": "string"
},
"node_id": {
"type": "string"
},
"preheader": {
"type": "string"
},
"subject": {
"type": "string"
}
},
"required": [
"flow_id",
"node_id"
],
"type": "object"
},
"name": "update_flow_email",
"outputSchema": null
},
{
"description": "Edita un formulario: título, campos, lista donde caen las altas, doble opt-in, mensaje de gracias o activarlo/desactivarlo.",
"inputSchema": {
"properties": {
"double_optin": {
"type": "boolean"
},
"fields": {
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array"
},
"form_id": {
"type": "string"
},
"is_active": {
"type": "boolean"
},
"list_id": {
"type": "string"
},
"name": {
"type": "string"
},
"redirect_url": {
"type": "string"
},
"thank_you_message": {
"type": "string"
}
},
"required": [
"form_id"
],
"type": "object"
},
"name": "update_form",
"outputSchema": null
},
{
"description": "Edita una página de aterrizaje: contenido, slug, formulario conectado o activarla/desactivarla. Cambiar el slug rompe la URL que ya se haya compartido (la respuesta avisa).",
"inputSchema": {
"properties": {
"ai_prompt": {
"type": "string"
},
"blocks": {
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array"
},
"form_id": {
"type": "string"
},
"html_code": {
"type": "string"
},
"is_active": {
"type": "boolean"
},
"landing_id": {
"type": "string"
},
"name": {
"type": "string"
},
"slug": {
"type": "string"
}
},
"required": [
"landing_id"
],
"type": "object"
},
"name": "update_landing",
"outputSchema": null
},
{
"description": "Actualiza datos de un contacto existente (nombre, país, teléfono, etiquetas). Solo envía esos campos: no cambia su estado de suscripción. Para devolver a alguien que salió por un rebote usa reactivate_bounced_subscriber. Quien se dio de baja o marcó spam solo vuelve por decisión propia (centro de preferencias del pie de los correos); un agente no puede resuscribirlo: el PUT /api/v1/subscribers/{email} con confirmar_resuscripcion:true es solo para una persona con su llave, queda auditado y desde el puente MCP responde 403 resuscripcion_no_disponible_para_agentes.",
"inputSchema": {
"properties": {
"country": {
"type": "string"
},
"email": {
"type": "string"
},
"first_name": {
"type": "string"
},
"last_name": {
"type": "string"
},
"phone": {
"type": "string"
},
"tags": {
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"email"
],
"type": "object"
},
"name": "update_subscriber",
"outputSchema": null
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:927bfbb6d30c75622e7e9c1ec4755386a2c919c33d28e0dcc562e3b73a0378b4 | sha256sum