{"serverId":"mcp-registry/io.github.wilmendezofficial/postari","tools":[{"name":"account_stats","fixed":{"name":"account_stats","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","inputSchema":{"type":"object","properties":{"to":{"type":"string","description":"Fecha fin YYYY-MM-DD (opcional)."},"from":{"type":"string","description":"Fecha inicio YYYY-MM-DD (opcional)."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":205,"tokensAfter":205},{"name":"add_subscriber_to_list","fixed":{"name":"add_subscriber_to_list","description":"Añade un contacto (por email o contact_id) a una lista.","inputSchema":{"type":"object","required":["list_id"],"properties":{"email":{"type":"string"},"list_id":{"type":"string","description":"ID de la lista."},"contact_id":{"type":"string"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":82,"tokensAfter":82},{"name":"create_flow","fixed":{"name":"create_flow","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":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"graph":{"type":"object","description":"Pasos: {\"nodes\":[{\"id\":\"1\",\"type\":\"email\",\"label\":\"...\",\"config\":{\"subject\":\"...\",\"blocks\":[...]},\"next\":\"2\"}],\"edges\":[]}.","additionalProperties":true},"trigger_type":{"type":"string","description":"list_subscribe | tag_added | form_submit | date_relative | birthday | abandoned_cart | api | manual…"},"trigger_config":{"type":"object","description":"Config del disparador (p. ej. {\"list_id\":\"...\"}).","additionalProperties":true}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":226,"tokensAfter":226},{"name":"create_form","fixed":{"name":"create_form","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":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"fields":{"type":"array","items":{"type":"object","additionalProperties":true},"description":"Campos: [{name,type,label,required}]. Debe incluir uno \"email\"."},"list_id":{"type":"string","description":"Lista donde caen las altas."},"display_mode":{"type":"string","description":"inline | popup."},"double_optin":{"type":"boolean"},"thank_you_message":{"type":"string"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":174,"tokensAfter":174},{"name":"create_landing","fixed":{"name":"create_landing","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":{"type":"object","required":["name","slug"],"properties":{"kind":{"type":"string","description":"blocks | code | ai | iframe | external_url. Default: blocks."},"name":{"type":"string"},"slug":{"type":"string","description":"Va en la URL /l/<slug>: minúsculas, números y guiones."},"blocks":{"type":"array","items":{"type":"object","additionalProperties":true},"description":"Contenido si kind=blocks."},"form_id":{"type":"string","description":"Formulario que se muestra en la página."},"ai_prompt":{"type":"string","description":"Instrucción si kind=ai."},"html_code":{"type":"string","description":"HTML si kind=code."},"iframe_url":{"type":"string"},"external_url":{"type":"string"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":270,"tokensAfter":270},{"name":"create_launch","fixed":{"name":"create_launch","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":{"type":"object","required":["name"],"properties":{"kind":{"type":"string","description":"curso | membresía | infoproducto | evento | servicio | otro. Default: curso."},"name":{"type":"string","description":"Nombre del lanzamiento."},"stages":{"type":"array","items":{"type":"object","additionalProperties":true},"description":"Etapas explícitas: [{kind,title,scheduled_at}]."},"ends_at":{"type":"string","description":"Fecha de cierre en ISO 8601."},"starts_at":{"type":"string","description":"Fecha de inicio en ISO 8601."},"seed_default_stages":{"type":"boolean","description":"false para crearlo SIN etapas. Default: true en curso/infoproducto."},"target_revenue_cents":{"type":"number","description":"Objetivo de facturación en céntimos (opcional)."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":300,"tokensAfter":300},{"name":"create_list","fixed":{"name":"create_list","description":"Crea una nueva lista de contactos.","inputSchema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Nombre de la lista."},"description":{"type":"string"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":65,"tokensAfter":65},{"name":"create_segment","fixed":{"name":"create_segment","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":{"type":"object","required":["name","definition"],"properties":{"name":{"type":"string"},"definition":{"type":"object","description":"Reglas del segmento (mismo JSON que la UI de /segmentos).","additionalProperties":true},"description":{"type":"string"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":125,"tokensAfter":125},{"name":"create_subscriber","fixed":{"name":"create_subscriber","description":"Crea o actualiza (upsert) un contacto/suscriptor. Si ya existe, lo actualiza sin duplicar.","inputSchema":{"type":"object","required":["email"],"properties":{"tags":{"type":"array","items":{"type":"string"},"description":"Etiquetas a aplicar."},"email":{"type":"string","description":"Correo del contacto (requerido)."},"phone":{"type":"string"},"country":{"type":"string","description":"Código ISO de país, ej \"CO\"."},"metadata":{"type":"object","description":"Campos personalizados.","additionalProperties":true},"last_name":{"type":"string"},"first_name":{"type":"string"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":174,"tokensAfter":174},{"name":"create_tag","fixed":{"name":"create_tag","description":"Crea una etiqueta (idempotente: si ya existe devuelve la que hay, no la duplica).","inputSchema":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"color":{"type":"string"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":66,"tokensAfter":66},{"name":"create_template","fixed":{"name":"create_template","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":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"blocks":{"type":"array","items":{"type":"object","additionalProperties":true}},"subject":{"type":"string"},"category":{"type":"string"},"preheader":{"type":"string"},"description":{"type":"string"},"from_template_id":{"type":"string","description":"Duplica esta plantilla como punto de partida."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":163,"tokensAfter":163},{"name":"get_agent_activity","fixed":{"name":"get_agent_activity","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":{"type":"object","properties":{"limit":{"type":"number","description":"1-100, default 50."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":99,"tokensAfter":99},{"name":"get_campaign_audience","fixed":{"name":"get_campaign_audience","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":{"type":"object","required":["campaign_id"],"properties":{"campaign_id":{"type":"string"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":176,"tokensAfter":176},{"name":"get_campaign_stats","fixed":{"name":"get_campaign_stats","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 (ventas con clic o, sin clic, apertura de este correo antes de comprar; si la persona solo lo recibió la venta es «influida» y NO suma) y by_link (clics de contenido por URL). maturity: sending/paused = parcial, settling = enviad","inputSchema":{"type":"object","required":["campaign_id"],"properties":{"campaign_id":{"type":"string","description":"ID de la campaña."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":191,"tokensAfter":191},{"name":"get_form","fixed":{"name":"get_form","description":"Un formulario con sus campos y sus KPIs recontados en vivo (form_kpis_v2): primary_count en primary_unit (people en captura, submissions en encuesta), people, submissions (envíos sin papelera), views, views_measured y conversion_rate (primary_count / views, % con 1 decimal, null si las vistas no están medidas). Mismas definiciones que list_forms. Si la lectura falla responde 503 metrics_unavailable (nunca un número sin avisar).","inputSchema":{"type":"object","required":["form_id"],"properties":{"form_id":{"type":"string","description":"ID del formulario."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":167,"tokensAfter":167},{"name":"get_launch","fixed":{"name":"get_launch","description":"Un lanzamiento con sus etapas y las MÉTRICAS REALES de cada una (enviados, entregados, abrieron, clics únicos, bajas, ingresos USD atribuidos por clic o apertura, sin las ventas solo «influidas») 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 = corre","inputSchema":{"type":"object","required":["launch_id"],"properties":{"launch_id":{"type":"string"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":178,"tokensAfter":178},{"name":"get_subscriber","fixed":{"name":"get_subscriber","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":{"type":"object","required":["email"],"properties":{"email":{"type":"string","description":"Correo a buscar."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":157,"tokensAfter":157},{"name":"list_campaigns","fixed":{"name":"list_campaigns","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 borr","inputSchema":{"type":"object","properties":{"limit":{"type":"number","description":"1-500, default 20."},"status":{"type":"string","description":"Filtro de estado (opcional)."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":201,"tokensAfter":201},{"name":"list_flow_emails","fixed":{"name":"list_flow_emails","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":{"type":"object","required":["flow_id"],"properties":{"flow_id":{"type":"string"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":92,"tokensAfter":92},{"name":"list_forms","fixed":{"name":"list_forms","description":"Lista los formularios con sus KPIs. El número de cada formulario es primary_count en la unidad primary_unit: people = personas distintas (correo normalizado, sin papelera) en un formulario de captura; submissions = respuestas en una encuesta (is_survey true: una persona puede responder varias veces). people = personas distintas; submissions = envíos sin papelera (filas, repeticiones incluidas: NO es el número del formulario de captura); views = cargas del formulario (1 por navegador cada 24 h); ","inputSchema":{"type":"object","properties":{"limit":{"type":"number","description":"1-200, default 100."},"is_active":{"type":"boolean","description":"true = solo activos · false = solo inactivos (opcional)."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":209,"tokensAfter":209},{"name":"list_landings","fixed":{"name":"list_landings","description":"Lista las páginas de aterrizaje con sus visitas, conversiones y tasa de conversión (conversion_rate = conversiones / visitas en % con 2 decimales y tope 100; null si aún no hubo visitas: no medible, no es 0 · cambio de contrato del 3-oct-2026, antes devolvía 0).","inputSchema":{"type":"object","properties":{"limit":{"type":"number"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":105,"tokensAfter":105},{"name":"list_launches","fixed":{"name":"list_launches","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":{"type":"object","properties":{"limit":{"type":"number"},"status":{"type":"string","description":"planning | active | closed | archived."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":86,"tokensAfter":86},{"name":"list_lists","fixed":{"name":"list_lists","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":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":142,"tokensAfter":142},{"name":"list_subscribers","fixed":{"name":"list_subscribers","description":"Lista contactos paginados (más recientes primero, cursor keyset). Filtros: status (active|unsubscribed|bounced|complained), list_id (membresías físicas: una lista inteligente devuelve 0 filas; su tamaño está en list_lists (active_count / total_count) o en GET /api/v1/lists/{id}/count) y tag = nombre EXACTO de una etiqueta del catálogo (contact_tags, la misma fuente que /etiquetas). Desde el 3-oct-2026 tag ya no mira las etiquetas importadas (imported_tags): cada fila trae `tags` (importadas, com","inputSchema":{"type":"object","properties":{"tag":{"type":"string","description":"Nombre exacto de una etiqueta del catálogo (contact_tags)."},"limit":{"type":"number","description":"1-500 (default 100)."},"cursor":{"type":"string","description":"pagination.next_cursor de la página anterior."},"status":{"enum":["active","unsubscribed","bounced","complained"],"type":"string"},"list_id":{"type":"string","description":"Solo miembros de esta lista."},"include_count":{"type":"boolean","description":"true añade total_count (consulta aparte)."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":304,"tokensAfter":304},{"name":"send_transactional_email","fixed":{"name":"send_transactional_email","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":{"type":"object","required":["to_email"],"properties":{"subject":{"type":"string","description":"Asunto (opcional si la plantilla lo trae)."},"to_email":{"type":"string","description":"Correo del destinatario."},"from_name":{"type":"string","description":"Nombre del remitente (opcional)."},"html_body":{"type":"string","description":"HTML libre (opcional, alternativa a template_id)."},"variables":{"type":"object","description":"Variables mustache {{var}} para rellenar la plantilla. Ej: {\"first_name\":\"María\"}.","additionalProperties":true},"template_id":{"type":"string","description":"ID de la plantilla en Postari (opcional si mandas subject+html_body)."},"confirm_send":{"type":"boolean","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."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":306,"tokensAfter":306},{"name":"set_campaign_audience","fixed":{"name":"set_campaign_audience","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":{"type":"object","required":["campaign_id"],"properties":{"campaign_id":{"type":"string"},"exclude_tags":{"type":"array","items":{"type":"string"},"description":"Fuera quien tenga estas etiquetas (nombre o UUID)."},"include_tags":{"type":"array","items":{"type":"string"},"description":"Solo quien tenga estas etiquetas (nombre o UUID)."},"exclude_lists":{"type":"array","items":{"type":"string"},"description":"Fuera los miembros de estas listas · \"manda a A menos los de B\"."},"tag_on_delivery":{"type":"string","description":"Etiqueta que se pone a quien RECIBA el correo, para poder excluirlo la próxima vez."},"exclude_campaigns":{"type":"array","items":{"type":"string"},"description":"Fuera quien ya recibió estas campañas · no repetir el envío."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":304,"tokensAfter":304},{"name":"update_flow","fixed":{"name":"update_flow","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":{"type":"object","required":["flow_id"],"properties":{"name":{"type":"string"},"armed":{"type":"boolean","description":"Solo false (desarmar). Para armar usa arm_flow."},"graph":{"type":"object","additionalProperties":true},"status":{"type":"string","description":"draft | active | paused."},"flow_id":{"type":"string"},"trigger_config":{"type":"object","additionalProperties":true}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":168,"tokensAfter":168},{"name":"update_flow_email","fixed":{"name":"update_flow_email","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":{"type":"object","required":["flow_id","node_id"],"properties":{"label":{"type":"string"},"blocks":{"type":"array","items":{"type":"object","additionalProperties":true},"description":"Bloques del correo."},"flow_id":{"type":"string"},"node_id":{"type":"string"},"subject":{"type":"string"},"preheader":{"type":"string"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":148,"tokensAfter":148},{"name":"update_form","fixed":{"name":"update_form","description":"Edita un formulario: título, campos, lista donde caen las altas, doble opt-in, mensaje de gracias o activarlo/desactivarlo.","inputSchema":{"type":"object","required":["form_id"],"properties":{"name":{"type":"string"},"fields":{"type":"array","items":{"type":"object","additionalProperties":true}},"form_id":{"type":"string"},"list_id":{"type":"string"},"is_active":{"type":"boolean"},"double_optin":{"type":"boolean"},"redirect_url":{"type":"string"},"thank_you_message":{"type":"string"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":147,"tokensAfter":147},{"name":"update_landing","fixed":{"name":"update_landing","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":{"type":"object","required":["landing_id"],"properties":{"name":{"type":"string"},"slug":{"type":"string"},"blocks":{"type":"array","items":{"type":"object","additionalProperties":true}},"form_id":{"type":"string"},"ai_prompt":{"type":"string"},"html_code":{"type":"string"},"is_active":{"type":"boolean"},"landing_id":{"type":"string"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":158,"tokensAfter":158},{"name":"update_subscriber","fixed":{"name":"update_subscriber","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 ","inputSchema":{"type":"object","required":["email"],"properties":{"tags":{"type":"array","items":{"type":"string"}},"email":{"type":"string"},"phone":{"type":"string"},"country":{"type":"string"},"last_name":{"type":"string"},"first_name":{"type":"string"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":224,"tokensAfter":224}],"toolsChanged":31,"tokensSaved":0,"todo":[{"tool":"activate_flow","params":["flow_id"]},{"tool":"add_subscriber_to_list","params":["email","contact_id"]},{"tool":"arm_flow","params":["flow_id"]},{"tool":"create_flow","params":["name"]},{"tool":"create_form","params":["name","double_optin","thank_you_message"]},{"tool":"create_landing","params":["name","iframe_url","external_url"]},{"tool":"create_list","params":["description"]},{"tool":"create_segment","params":["name","description"]},{"tool":"create_subscriber","params":["phone","last_name","first_name"]},{"tool":"create_tag","params":["name","color"]},{"tool":"create_template","params":["name","blocks","subject","category","preheader","description"]},{"tool":"get_campaign_audience","params":["campaign_id"]},{"tool":"get_launch","params":["launch_id"]},{"tool":"link_campaign_to_launch_stage","params":["title","stage_id","launch_id"]},{"tool":"list_flow_emails","params":["flow_id"]},{"tool":"list_landings","params":["limit"]},{"tool":"list_launches","params":["limit"]},{"tool":"list_subscribers","params":["status"]},{"tool":"set_campaign_audience","params":["campaign_id"]},{"tool":"tag_subscribers","params":["emails","contact_ids"]},{"tool":"test_flow","params":["flow_id"]},{"tool":"trigger_flow","params":["email","contact_id","trigger_data"]},{"tool":"update_flow","params":["name","graph","flow_id","trigger_config"]},{"tool":"update_flow_email","params":["label","flow_id","node_id","subject","preheader"]},{"tool":"update_form","params":["name","fields","form_id","list_id","is_active","double_optin","redirect_url","thank_you_message"]},{"tool":"update_landing","params":["name","slug","blocks","form_id","ai_prompt","html_code","is_active","landing_id"]},{"tool":"update_subscriber","params":["tags","email","phone","country","last_name","first_name"]}],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}