{
  "name": "tilopay-insight-engine",
  "title": "Tilopay Insight Engine",
  "version": "0.3.0",
  "verified_at": "2026-10-07",
  "url": "https://mcp.tilopay.com/mcp",
  "transport": "streamable-http",
  "auth": {
    "type": "oauth",
    "note": "El manifiesto declara autenticación OAuth. El usuario dedicado del comercio se autentica por ese flujo; no son credenciales de API pegadas en el cliente."
  },
  "documentation": "https://tilopay.com/developers",
  "access_levels": {
    "read": "Solo lee. No modifica nada en la cuenta del comercio.",
    "write": "Modifica estado en la cuenta del comercio.",
    "destructive": "Modifica estado de forma sensible: mueve dinero o borra objetos. Exigir confirmación humana."
  },
  "counts": {
    "total": 117,
    "read": 63,
    "write": 34,
    "destructive": 20,
    "mutating": 54
  },
  "groups": [
    {
      "slug": "ventas",
      "title": "Ventas y transacciones",
      "tools": 8,
      "availability": "default"
    },
    {
      "slug": "enlaces-de-pago",
      "title": "Enlaces de pago",
      "tools": 7,
      "availability": "default"
    },
    {
      "slug": "catalogo",
      "title": "Catálogo de productos",
      "tools": 6,
      "availability": "default"
    },
    {
      "slug": "contactos",
      "title": "Contactos",
      "tools": 3,
      "availability": "default"
    },
    {
      "slug": "perfil",
      "title": "Perfil del negocio y recetas",
      "tools": 3,
      "availability": "default"
    },
    {
      "slug": "microtienda",
      "title": "Microtienda y pedidos",
      "tools": 13,
      "availability": "default"
    },
    {
      "slug": "avisos",
      "title": "Avisos y notificaciones",
      "tools": 2,
      "availability": "default"
    },
    {
      "slug": "comprobantes",
      "title": "Comprobantes de cobro",
      "tools": 2,
      "availability": "default"
    },
    {
      "slug": "recordatorios",
      "title": "Recordatorios",
      "tools": 3,
      "availability": "default"
    },
    {
      "slug": "recurrentes",
      "title": "Cobros recurrentes",
      "tools": 23,
      "availability": "default"
    },
    {
      "slug": "tarjetas-guardadas",
      "title": "Tarjetas guardadas y cobros masivos",
      "tools": 10,
      "availability": "default"
    },
    {
      "slug": "liquidaciones",
      "title": "Liquidaciones, depósitos y facturación",
      "tools": 7,
      "availability": "default"
    },
    {
      "slug": "cuenta",
      "title": "Cuenta, comercio y equipo",
      "tools": 8,
      "availability": "default"
    },
    {
      "slug": "soporte",
      "title": "Soporte y diagnóstico",
      "tools": 3,
      "availability": "default"
    },
    {
      "slug": "api-bancario",
      "title": "Herramientas bancarias",
      "tools": 19,
      "availability": "on-request",
      "requires": "baas-credentials",
      "requires_note": "Credenciales del API bancario de Tilopay registradas por Tilopay para ese usuario."
    }
  ],
  "tools": [
    {
      "name": "tilopay_sales_summary",
      "title": "Resumen y tendencias de ventas",
      "description": "Calcula métricas de ventas a partir de las transacciones de Tilopay: totales por moneda, ticket promedio, tasa de aprobación, ventas por día, día de la semana y hora, mejores clientes, motivos de rechazo y tendencia.",
      "group": "ventas",
      "group_title": "Ventas y transacciones",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/ventas",
      "api_endpoint": "POST /api/v1/consultTransactions (y cálculo local)",
      "input": {
        "parameters": [
          {
            "name": "startDate",
            "type": "string",
            "required": true,
            "description": "Fecha inicial \"YYYY-MM-DD HH:mm:ss\""
          },
          {
            "name": "endDate",
            "type": "string",
            "required": true,
            "description": "Fecha final \"YYYY-MM-DD HH:mm:ss\""
          },
          {
            "name": "includeDeclined",
            "type": "boolean",
            "required": false,
            "description": "Incluir transacciones rechazadas para medir tasa de aprobación (por defecto true)"
          },
          {
            "name": "environment",
            "type": "string",
            "required": false,
            "enum": [
              "production",
              "test"
            ]
          },
          {
            "name": "currency",
            "type": "array<string>",
            "required": false
          }
        ]
      },
      "output": {
        "structuredContent": "{ summary, trends, environmentNote }",
        "description": "summary trae range, timezoneNote, totalRows, payments {total, approved, declined, approvalRate}, refunds {total, approved, failed, successRate}, byCurrency por moneda con pagos, costos desglosados (commission, iva_commission, cost, cost_iva, retention_iva, retention_rent, totalDeducted, taxWithholdings, pspCost), netToLiquidate, reconciles y reconciliationDelta; reembolsos; y netForPeriod. Además daily, sample, byWeekday, byHour, topCustomers, declineReasons, refundFailureReasons y transactionTypes. byWeekday, byHour y topCustomers vienen en null si la muestra es insuficiente (menos de 30 filas o menos de 5 días distintos). trends viene en null en ese mismo caso. Las horas y días están en UTC."
      }
    },
    {
      "name": "tilopay_analyze_sales",
      "title": "Agente analista de ventas",
      "description": "Agente que analiza las transacciones de Tilopay en un rango de fechas y devuelve un informe en lenguaje natural: desempeño, tendencias, estacionalidad, calidad de aprobación, riesgos y recomendaciones accionables.",
      "group": "ventas",
      "group_title": "Ventas y transacciones",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/ventas",
      "api_endpoint": "POST /api/v1/consultTransactions (y análisis con modelo)",
      "input": {
        "parameters": [
          {
            "name": "startDate",
            "type": "string",
            "required": true,
            "description": "Fecha inicial \"YYYY-MM-DD HH:mm:ss\""
          },
          {
            "name": "endDate",
            "type": "string",
            "required": true,
            "description": "Fecha final \"YYYY-MM-DD HH:mm:ss\""
          },
          {
            "name": "question",
            "type": "string",
            "required": false,
            "description": "Pregunta o enfoque específico para el análisis (opcional)"
          },
          {
            "name": "environment",
            "type": "string",
            "required": false,
            "enum": [
              "production",
              "test"
            ]
          },
          {
            "name": "currency",
            "type": "array<string>",
            "required": false
          }
        ]
      },
      "output": {
        "structuredContent": "{ report, summary, trends, environmentNote }",
        "description": "report es el informe en lenguaje natural; summary y trends son los mismos de tilopay_sales_summary. Si no hay transacciones en el rango, devuelve solo un texto avisándolo, sin structuredContent."
      }
    },
    {
      "name": "tilopay_find_payment",
      "title": "¿Ya me pagó?",
      "description": "Busca si un cliente ya pagó: revisa los cobros de Tilopay y, si la sesión bancaria está abierta, también las entradas de la cuenta bancaria. Úsala para preguntas como '¿ya me pagó Ana?' o '¿entró el pago de ₡25.000?'.",
      "group": "ventas",
      "group_title": "Ventas y transacciones",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/ventas",
      "input": {
        "parameters": [
          {
            "name": "name",
            "type": "string",
            "required": false,
            "description": "Nombre del cliente (coincidencia parcial)"
          },
          {
            "name": "amount",
            "type": "number",
            "required": false,
            "description": "Monto del pago esperado"
          },
          {
            "name": "currency",
            "type": "string",
            "required": false,
            "description": "Moneda del monto, ej. CRC o USD"
          },
          {
            "name": "hours",
            "type": "integer",
            "required": false,
            "description": "Horas hacia atrás a revisar (por defecto 24)"
          },
          {
            "name": "reference",
            "type": "string",
            "required": false,
            "description": "Número de orden o referencia"
          }
        ]
      },
      "output": {}
    },
    {
      "name": "tilopay_list_transactions",
      "title": "Listar transacciones de Tilopay",
      "description": "Lista transacciones de Tilopay en un rango de fechas. Usa status para aprobadas/rechazadas y sort=newest para 'los últimos N' o 'la última'. Una sola llamada basta: no acortes el rango para buscar filas.",
      "group": "ventas",
      "group_title": "Ventas y transacciones",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/ventas",
      "api_endpoint": "POST /api/v1/consultTransactions",
      "input": {
        "parameters": [
          {
            "name": "startDate",
            "type": "string",
            "required": true,
            "description": "Fecha inicial, ej. \"2026-08-01 00:00:00\""
          },
          {
            "name": "endDate",
            "type": "string",
            "required": true,
            "description": "Fecha final, ej. \"2026-08-31 23:59:59\""
          },
          {
            "name": "status",
            "type": "string",
            "required": false,
            "description": "approved = solo aprobadas, declined = solo rechazadas, all = todas",
            "enum": [
              "approved",
              "declined",
              "all"
            ]
          },
          {
            "name": "sort",
            "type": "string",
            "required": false,
            "description": "newest = más recientes primero",
            "enum": [
              "newest",
              "oldest"
            ]
          },
          {
            "name": "onlyAproved",
            "type": "boolean",
            "required": false,
            "description": "Compatibilidad: false equivale a status: \"all\""
          },
          {
            "name": "environment",
            "type": "string",
            "required": false,
            "description": "Ambiente, por defecto production",
            "enum": [
              "production",
              "test"
            ]
          },
          {
            "name": "currency",
            "type": "array<string>",
            "required": false,
            "description": "Monedas, ej. [\"USD\",\"CRC\"]"
          },
          {
            "name": "orderNumber",
            "type": "string",
            "required": false,
            "description": "Filtrar por número de orden"
          },
          {
            "name": "email",
            "type": "string",
            "required": false,
            "description": "Filtrar por correo del cliente"
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Máximo de filas a devolver"
          }
        ]
      },
      "output": {
        "structuredContent": "{ total, transactions[], environmentNote }",
        "description": "total = filas encontradas antes de aplicar limit; transactions = las filas devueltas; environmentNote avisa si el ambiente consultado no trajo filas."
      }
    },
    {
      "name": "tilopay_get_transaction",
      "title": "Consultar una transacción",
      "description": "Obtiene el detalle de una transacción específica de Tilopay a partir de tu número de orden.",
      "group": "ventas",
      "group_title": "Ventas y transacciones",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/ventas",
      "api_endpoint": "POST /api/v1/consult",
      "input": {
        "parameters": [
          {
            "name": "orderNumber",
            "type": "string",
            "required": true,
            "description": "Número de orden de la transacción"
          },
          {
            "name": "merchantId",
            "type": "string",
            "required": false,
            "description": "ID de comercio (opcional)"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result }",
        "description": "Respuesta cruda del API de Tilopay bajo la llave `result`."
      }
    },
    {
      "name": "tilopay_modify_transaction",
      "title": "Capturar, reembolsar o reversar",
      "description": "Modifica una transacción de Tilopay: captura (capture), reembolso (refund) o reversión (reversal) por el monto indicado. El monto nunca puede superar el de la venta original: si el usuario pide más, díselo con el monto real de la venta y pregunta si reembolsa ese monto o una parte; no pidas confirmación de un monto mayor. Solo reembolsa ventas aprobadas, nunca una orden que ya es un reembolso (empieza con «Re-»). Cuando Tilopay confirma el reembolso se genera un comprobante en texto listo para reenviar al cliente. Operación sensible: afecta dinero real y requiere segundo factor. Llámala primero sin `confirmation_code`: se envía un código de 6 dígitos al correo del comercio y la respuesta trae `requires_confirmation`. Repite la misma llamada, con los mismos parámetros, agregando `confirmation_code`. Comunica el resultado exactamente como lo devuelve la herramienta (state): si es pendiente o no confirmado, nunca digas que el reembolso ya se hizo.",
      "group": "ventas",
      "group_title": "Ventas y transacciones",
      "access": "destructive",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/ventas",
      "api_endpoint": "POST /api/v1/processModification",
      "input": {
        "parameters": [
          {
            "name": "orderNumber",
            "type": "string",
            "required": true,
            "description": "Número de orden de la transacción"
          },
          {
            "name": "action",
            "type": "string",
            "required": true,
            "description": "Tipo de modificación",
            "enum": [
              "capture",
              "refund",
              "reversal"
            ]
          },
          {
            "name": "amount",
            "type": "number",
            "required": true,
            "description": "Monto a modificar"
          },
          {
            "name": "currency",
            "type": "string",
            "required": false,
            "description": "Moneda del movimiento, ej. CRC o USD"
          },
          {
            "name": "client_name",
            "type": "string",
            "required": false,
            "description": "Nombre del cliente, para el comprobante"
          },
          {
            "name": "client_email",
            "type": "string",
            "required": false,
            "description": "Correo del cliente, para el comprobante"
          },
          {
            "name": "confirmation_code",
            "type": "string",
            "required": false,
            "description": "Código de 6 dígitos recibido por correo para autorizar la operación"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result }",
        "description": "Respuesta cruda del API de Tilopay bajo la llave `result`."
      }
    },
    {
      "name": "tilopay_refunds_list",
      "title": "Historial de reembolsos",
      "description": "Reembolsos del comercio. pending=true devuelve los reembolsos pendientes de procesar; si no, el historial. Solo consulta: para reembolsar usa tilopay_modify_transaction.",
      "group": "ventas",
      "group_title": "Ventas y transacciones",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/ventas",
      "input": {
        "parameters": [
          {
            "name": "pending",
            "type": "boolean",
            "required": false,
            "description": "Solo pendientes"
          },
          {
            "name": "page",
            "type": "integer",
            "required": false,
            "description": "Página (por defecto 1)"
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Registros por página (por defecto 20)"
          },
          {
            "name": "search",
            "type": "string",
            "required": false,
            "description": "Texto a buscar"
          }
        ]
      },
      "output": {}
    },
    {
      "name": "tilopay_cash_close",
      "title": "Cierre de caja programado",
      "description": "Cierre de caja diario por WhatsApp: ventas del día por moneda, rechazos agrupados por motivo y la próxima liquidación de Tilopay. action 'get' muestra la configuración; 'set' la cambia (enabled, time_of_day 'HH:mm' en hora local, days 0=domingo…6=sábado; «de lunes a sábado» = [1,2,3,4,5,6]); 'preview' arma el cierre de hoy ahora. Para «apagá el cierre» usa set con enabled=false. Configurar es solo del dueño.",
      "group": "ventas",
      "group_title": "Ventas y transacciones",
      "access": "write",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/ventas",
      "input": {
        "parameters": [
          {
            "name": "action",
            "type": "string",
            "required": true,
            "enum": [
              "get",
              "set",
              "preview"
            ]
          },
          {
            "name": "enabled",
            "type": "boolean",
            "required": false
          },
          {
            "name": "time_of_day",
            "type": "string",
            "required": false,
            "description": "Hora local 'HH:mm' (24 h). 8 pm = '20:00'"
          },
          {
            "name": "days",
            "type": "array<integer>",
            "required": false,
            "description": "0=domingo … 6=sábado"
          }
        ]
      },
      "output": {}
    },
    {
      "name": "tilopay_create_charge",
      "title": "Crear cobro con enlace",
      "description": "Crea un cobro y devuelve el enlace corto de Tilopay (tilo.co/s/…) que abre directo el formulario seguro de pago; si no está disponible, el enlace propio tilopay.shop/pagar/…. La respuesta trae url (la corta cuando exista) y fallback_url (la propia); ambas sirven. En WhatsApp envía de una vez el QR como imagen junto con el enlace; no llames la herramienta de QR después. Si faltan datos del cliente, la página del enlace los pide antes de cobrar.",
      "group": "enlaces-de-pago",
      "group_title": "Enlaces de pago",
      "access": "write",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/enlaces-de-pago",
      "input": {
        "parameters": [
          {
            "name": "amount",
            "type": "number",
            "required": true,
            "description": "Monto a cobrar"
          },
          {
            "name": "currency",
            "type": "string",
            "required": false,
            "description": "Moneda, ej. USD o CRC. Si se omite se usa la del país del comercio."
          },
          {
            "name": "reference",
            "type": "string",
            "required": true,
            "description": "Referencia del cobro en texto normal, con espacios. No convertir a slug ni reemplazar espacios por guiones o guiones bajos."
          },
          {
            "name": "description",
            "type": "string",
            "required": true,
            "description": "Concepto visible para el cliente. Conserva literalmente el texto del comercio con espacios, acentos y mayúsculas; por ejemplo 'prueba link', nunca 'prueba_link'."
          },
          {
            "name": "client",
            "type": "string",
            "required": false,
            "description": "Nombre del cliente"
          },
          {
            "name": "client_email",
            "type": "string",
            "required": false,
            "description": "Correo del cliente"
          },
          {
            "name": "client_phone",
            "type": "string",
            "required": false,
            "description": "Teléfono del cliente"
          }
        ]
      },
      "output": {}
    },
    {
      "name": "tilopay_get_payment_link",
      "title": "Detalle de un enlace de pago",
      "description": "Obtiene el detalle de un enlace de pago de Tilopay por su ID.",
      "group": "enlaces-de-pago",
      "group_title": "Enlaces de pago",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/enlaces-de-pago",
      "api_endpoint": "GET /api/v1/getDetailLinkPayment/{link_payment_id}/{api_key}",
      "input": {
        "parameters": [
          {
            "name": "linkPaymentId",
            "type": "string",
            "required": true,
            "description": "ID del enlace de pago"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result }",
        "description": "Respuesta cruda del API de Tilopay bajo la llave `result`."
      }
    },
    {
      "name": "tilopay_delete_payment_link",
      "title": "Eliminar enlace de pago",
      "description": "Elimina un enlace de pago de Tilopay por su ID. Operación sensible: requiere segundo factor. Llámela primero sin `confirmation_code`: se envía un código de 6 dígitos al correo del comercio y la respuesta trae `requires_confirmation`. Repita la misma llamada agregando `confirmation_code`.",
      "group": "enlaces-de-pago",
      "group_title": "Enlaces de pago",
      "access": "destructive",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/enlaces-de-pago",
      "api_endpoint": "POST /api/v1/deleteLinkPayment",
      "input": {
        "parameters": [
          {
            "name": "id",
            "type": "string",
            "required": true,
            "description": "ID del enlace de pago a eliminar"
          },
          {
            "name": "confirmation_code",
            "type": "string",
            "required": false,
            "description": "Código de 6 dígitos recibido por correo para autorizar la operación"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result }",
        "description": "Respuesta cruda del API de Tilopay bajo la llave `result`."
      }
    },
    {
      "name": "tilopay_send_payment_link_whatsapp",
      "title": "Enviar enlace de pago por WhatsApp",
      "description": "Prepara el envío del enlace de pago por WhatsApp a un contacto: devuelve un enlace wa.me con el mensaje listo. Acepta el nombre de un contacto guardado o un teléfono.",
      "group": "enlaces-de-pago",
      "group_title": "Enlaces de pago",
      "access": "write",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/enlaces-de-pago",
      "input": {
        "parameters": [
          {
            "name": "link_url",
            "type": "string",
            "required": true,
            "description": "URL del enlace de pago"
          },
          {
            "name": "contact_name",
            "type": "string",
            "required": false,
            "description": "Nombre del contacto guardado o del cliente"
          },
          {
            "name": "phone",
            "type": "string",
            "required": false,
            "description": "Teléfono de WhatsApp, ej. +50688887777"
          },
          {
            "name": "amount",
            "type": "number",
            "required": false
          },
          {
            "name": "currency",
            "type": "string",
            "required": false
          },
          {
            "name": "description",
            "type": "string",
            "required": false
          },
          {
            "name": "message",
            "type": "string",
            "required": false,
            "description": "Texto propio del mensaje"
          },
          {
            "name": "save_contact",
            "type": "boolean",
            "required": false,
            "description": "Guardar el contacto en la agenda"
          },
          {
            "name": "send_now",
            "type": "boolean",
            "required": false,
            "description": "Obsoleto: se ignora. Siempre se devuelve el enlace wa.me para enviar con un toque."
          }
        ]
      },
      "output": {
        "structuredContent": "{ to, message, whatsapp_url }",
        "description": "No envía el mensaje: devuelve el teléfono resuelto, el texto ya redactado y un enlace wa.me para enviarlo con un toque. Si no hay teléfono ni contacto guardado con ese nombre, devuelve error pidiéndolo. Guarda el contacto salvo que save_contact sea false."
      }
    },
    {
      "name": "tilopay_send_payment_link_email",
      "title": "Enviar enlace de pago por correo",
      "description": "Envía el enlace de pago por correo electrónico al cliente. Acepta el nombre de un contacto guardado o un correo.",
      "group": "enlaces-de-pago",
      "group_title": "Enlaces de pago",
      "access": "write",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/enlaces-de-pago",
      "input": {
        "parameters": [
          {
            "name": "link_url",
            "type": "string",
            "required": true,
            "description": "URL del enlace de pago"
          },
          {
            "name": "email",
            "type": "string",
            "required": false,
            "description": "Correo del destinatario"
          },
          {
            "name": "contact_name",
            "type": "string",
            "required": false,
            "description": "Nombre del contacto guardado o del cliente"
          },
          {
            "name": "amount",
            "type": "number",
            "required": false
          },
          {
            "name": "currency",
            "type": "string",
            "required": false
          },
          {
            "name": "description",
            "type": "string",
            "required": false
          },
          {
            "name": "message",
            "type": "string",
            "required": false,
            "description": "Nota adicional para el cliente"
          },
          {
            "name": "save_contact",
            "type": "boolean",
            "required": false,
            "description": "Guardar el contacto en la agenda"
          }
        ]
      },
      "output": {
        "structuredContent": "{ sent, to }",
        "description": "sent es true y to el correo al que se envió. Si no hay correo ni contacto guardado con ese nombre, devuelve error pidiéndolo."
      }
    },
    {
      "name": "tilopay_payment_link_qr",
      "title": "QR de un enlace de pago o producto",
      "description": "Genera el QR de un enlace de pago o de un producto del catálogo y lo envía como imagen (PNG). Úsala cuando el comercio pida el QR para compartir o imprimir.",
      "group": "enlaces-de-pago",
      "group_title": "Enlaces de pago",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/enlaces-de-pago",
      "input": {
        "parameters": [
          {
            "name": "link_url",
            "type": "string",
            "required": false,
            "description": "Enlace de pago completo (https://...)"
          },
          {
            "name": "catalog_id",
            "type": "string",
            "required": false,
            "description": "ID del producto del catálogo"
          },
          {
            "name": "label",
            "type": "string",
            "required": false,
            "description": "Nombre para el pie de la imagen"
          }
        ]
      },
      "output": {}
    },
    {
      "name": "tilopay_static_payment_qr",
      "title": "QR permanente de monto abierto",
      "description": "Devuelve el enlace y el QR permanente de monto abierto del comercio (el cliente escanea, digita el monto y paga). Solo consulta: si el comercio no lo tiene activado, lo explica y no lo activa.",
      "group": "enlaces-de-pago",
      "group_title": "Enlaces de pago",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/enlaces-de-pago",
      "input": {
        "parameters": []
      },
      "output": {}
    },
    {
      "name": "tilopay_catalog_list_items",
      "title": "Listar catálogo de productos o servicios",
      "description": "Lista los productos o servicios del catálogo de Tilopay (título, precio y enlace corto). Permite buscar por nombre o descripción (sin importar acentos ni mayúsculas). El listado de Tilopay puede tardar unos minutos en reflejar cambios hechos en el panel; lo creado desde aquí aparece de inmediato y la respuesta de tilopay_catalog_create_item ya trae el ítem nuevo. Usa refresh=true para forzar lectura fresca.",
      "group": "catalogo",
      "group_title": "Catálogo de productos",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/catalogo",
      "api_endpoint": "GET /api/v1/getLinkPaymentList/{api_key}/{limit}",
      "input": {
        "parameters": [
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Máximo de ítems (por defecto 50)"
          },
          {
            "name": "search",
            "type": "string",
            "required": false,
            "description": "Texto a buscar en el nombre del producto"
          },
          {
            "name": "page",
            "type": "integer",
            "required": false,
            "description": "Página (por defecto 1)"
          },
          {
            "name": "refresh",
            "type": "boolean",
            "required": false,
            "description": "true para ignorar la memoria corta y leer de nuevo"
          },
          {
            "name": "include_qr",
            "type": "boolean",
            "required": false,
            "description": "Incluir el QR completo en base64 de cada ítem (por defecto false; el listado devuelve solo el enlace y has_qr)"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result }",
        "description": "Respuesta cruda del API de Tilopay bajo la llave `result`."
      }
    },
    {
      "name": "tilopay_catalog_get_item",
      "title": "Detalle de un ítem del catálogo",
      "description": "Obtiene el detalle de un producto o servicio del catálogo de Tilopay por su ID. El QR en base64 solo con include_qr=true.",
      "group": "catalogo",
      "group_title": "Catálogo de productos",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/catalogo",
      "api_endpoint": "GET /api/v1/getLinkPaymentById/{link_payment_id}/{api_key}",
      "input": {
        "parameters": [
          {
            "name": "itemId",
            "type": "string",
            "required": true,
            "description": "ID del ítem del catálogo"
          },
          {
            "name": "include_qr",
            "type": "boolean",
            "required": false,
            "description": "Incluir el QR en base64 (por defecto false; úsalo solo si el comercio pide el QR)"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result }",
        "description": "Respuesta cruda del API de Tilopay bajo la llave `result`."
      }
    },
    {
      "name": "tilopay_catalog_create_item",
      "title": "Agregar producto o servicio al catálogo",
      "description": "Crea un producto o servicio en el catálogo de Tilopay con su precio y devuelve el enlace corto de pago y el QR como imagen. Si el comercio envió una foto por WhatsApp en los últimos 10 minutos, la usa como imagen del producto.",
      "group": "catalogo",
      "group_title": "Catálogo de productos",
      "access": "write",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/catalogo",
      "api_endpoint": "POST /api/v1/createLinkPayment",
      "input": {
        "parameters": [
          {
            "name": "name",
            "type": "string",
            "required": true,
            "description": "Nombre del producto o servicio (título del enlace)"
          },
          {
            "name": "amount",
            "type": "number",
            "required": true,
            "description": "Precio"
          },
          {
            "name": "currency",
            "type": "string",
            "required": false,
            "description": "Moneda, ej. CRC o USD (por defecto la del comercio)"
          },
          {
            "name": "description",
            "type": "string",
            "required": false,
            "description": "Descripción corta"
          },
          {
            "name": "media_ref",
            "type": "string",
            "required": false,
            "description": "Referencia exacta de la imagen recibida por WhatsApp, si la conoce"
          },
          {
            "name": "use_last_image",
            "type": "boolean",
            "required": false,
            "description": "false para crear el producto sin foto aunque haya una imagen reciente"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result, linkId, url }",
        "description": "result = respuesta del API tal cual; linkId = id del enlace de pago que representa el producto; url = enlace de cobro del producto."
      }
    },
    {
      "name": "tilopay_catalog_update_item",
      "title": "Editar un producto del catálogo",
      "description": "Edita un producto del catálogo de Tilopay (nombre, precio, moneda, descripción o foto) sin cambiar su enlace de pago.",
      "group": "catalogo",
      "group_title": "Catálogo de productos",
      "access": "write",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/catalogo",
      "api_endpoint": "POST /api/v1/createLinkPayment",
      "input": {
        "parameters": [
          {
            "name": "itemId",
            "type": "string",
            "required": true,
            "description": "ID del ítem del catálogo"
          },
          {
            "name": "name",
            "type": "string",
            "required": false,
            "description": "Nuevo nombre"
          },
          {
            "name": "amount",
            "type": "number",
            "required": false,
            "description": "Nuevo precio"
          },
          {
            "name": "currency",
            "type": "string",
            "required": false,
            "description": "Nueva moneda"
          },
          {
            "name": "description",
            "type": "string",
            "required": false,
            "description": "Nueva descripción corta"
          },
          {
            "name": "media_ref",
            "type": "string",
            "required": false,
            "description": "Referencia exacta de la imagen recibida por WhatsApp, si la conoce"
          },
          {
            "name": "use_last_image",
            "type": "boolean",
            "required": false,
            "description": "false para no cambiar la foto aunque haya una imagen reciente"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result, linkId, url, replaced }",
        "description": "El API no permite editar un enlace: la herramienta crea el producto nuevo y borra el anterior. replaced = id del producto que se reemplazó; linkId y url = los del producto nuevo."
      }
    },
    {
      "name": "tilopay_catalog_delete_item",
      "title": "Borrar un producto del catálogo",
      "description": "Borra un producto del catálogo de Tilopay. El enlace de pago del producto deja de funcionar. Requiere código de confirmación enviado al correo.",
      "group": "catalogo",
      "group_title": "Catálogo de productos",
      "access": "destructive",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/catalogo",
      "api_endpoint": "POST /api/v1/deleteLinkPayment",
      "input": {
        "parameters": [
          {
            "name": "itemId",
            "type": "string",
            "required": true,
            "description": "ID del ítem del catálogo"
          },
          {
            "name": "confirmation_code",
            "type": "string",
            "required": false,
            "description": "Código de 6 dígitos enviado al correo del comercio"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result }",
        "description": "result = respuesta del API al borrar el enlace de pago que representa el producto."
      }
    },
    {
      "name": "tilopay_catalog_feed",
      "title": "Sincronizar catálogo con redes y buscadores",
      "description": "Entrega el enlace del catálogo sincronizado y los pasos para conectarlo en Facebook/Instagram, Google Shopping, TikTok o Pinterest (un canal a la vez, el que pida el comercio). Con send_email=true lo manda al correo del comercio.",
      "group": "catalogo",
      "group_title": "Catálogo de productos",
      "access": "write",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/catalogo",
      "input": {
        "parameters": [
          {
            "name": "platform",
            "type": "string",
            "required": false,
            "description": "Canal pedido. Si el comercio no dijo cuál, NO llames: pregúntale primero.",
            "enum": [
              "facebook",
              "google",
              "tiktok",
              "pinterest"
            ]
          },
          {
            "name": "send_email",
            "type": "boolean",
            "required": false,
            "description": "true si pidió que se lo mandes por correo"
          }
        ]
      },
      "output": {}
    },
    {
      "name": "tilopay_save_contact",
      "title": "Guardar contacto",
      "description": "Guarda o actualiza un contacto del comercio (nombre, teléfono de WhatsApp y correo) para reutilizarlo en envíos.",
      "group": "contactos",
      "group_title": "Contactos",
      "access": "write",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/contactos",
      "input": {
        "parameters": [
          {
            "name": "name",
            "type": "string",
            "required": true,
            "description": "Nombre del contacto"
          },
          {
            "name": "phone",
            "type": "string",
            "required": false,
            "description": "Teléfono de WhatsApp, ej. +50688887777"
          },
          {
            "name": "email",
            "type": "string",
            "required": false
          },
          {
            "name": "note",
            "type": "string",
            "required": false
          }
        ]
      },
      "output": {
        "structuredContent": "{ contact }",
        "description": "El contacto guardado o actualizado."
      }
    },
    {
      "name": "tilopay_list_contacts",
      "title": "Ver contactos",
      "description": "Lista los contactos guardados del comercio; opcionalmente filtra por nombre.",
      "group": "contactos",
      "group_title": "Contactos",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/contactos",
      "input": {
        "parameters": [
          {
            "name": "search",
            "type": "string",
            "required": false,
            "description": "Texto a buscar en el nombre"
          }
        ]
      },
      "output": {
        "structuredContent": "{ contacts }",
        "description": "Lista de contactos guardados del comercio."
      }
    },
    {
      "name": "tilopay_delete_contact",
      "title": "Eliminar contacto",
      "description": "Elimina un contacto guardado del comercio por su nombre.",
      "group": "contactos",
      "group_title": "Contactos",
      "access": "destructive",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/contactos",
      "input": {
        "parameters": [
          {
            "name": "name",
            "type": "string",
            "required": true,
            "description": "Nombre del contacto"
          }
        ]
      },
      "output": {
        "structuredContent": "{ removed }",
        "description": "removed es true. Si no existe un contacto con ese nombre, devuelve error."
      }
    },
    {
      "name": "tilopay_get_business_profile",
      "title": "Ver perfil del negocio",
      "description": "Devuelve el perfil del negocio: los datos que ya trae la cuenta de Tilopay (nombre, giro, ubicación, teléfono, correo de facturación, monedas, logo) y los que faltan por preguntar, con la siguiente pregunta pendiente.",
      "group": "perfil",
      "group_title": "Perfil del negocio y recetas",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/perfil",
      "input": {
        "parameters": []
      },
      "output": {
        "structuredContent": "{ profile, next_question, total_questions, is_complete }",
        "description": "profile = el perfil guardado del negocio (o null si no hay); next_question = la siguiente pregunta pendiente del onboarding; total_questions = cuántas preguntas tiene el cuestionario; is_complete = si el perfil ya está completo."
      }
    },
    {
      "name": "tilopay_save_business_profile",
      "title": "Guardar perfil del negocio",
      "description": "Guarda o completa el perfil del negocio con lo que el comercio respondió o confirmó. Puede guardar un campo a la vez; los campos que no se envían se conservan y lo guardado aquí ya no se sobrescribe con los datos de Tilopay.",
      "group": "perfil",
      "group_title": "Perfil del negocio y recetas",
      "access": "write",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/perfil",
      "input": {
        "parameters": [
          {
            "name": "business_type",
            "type": "string",
            "required": false,
            "description": "A qué se dedica el negocio"
          },
          {
            "name": "main_products",
            "type": "string",
            "required": false,
            "description": "Productos o servicios principales"
          },
          {
            "name": "sales_channels",
            "type": "string",
            "required": false,
            "description": "Canales de venta: local, en línea, redes, WhatsApp"
          },
          {
            "name": "ticket_pattern",
            "type": "string",
            "required": false,
            "description": "Cómo son los cobros: montos, frecuencia, moneda"
          },
          {
            "name": "goals",
            "type": "string",
            "required": false,
            "description": "Qué quiere mejorar el comercio"
          },
          {
            "name": "notes",
            "type": "string",
            "required": false,
            "description": "Detalles adicionales útiles"
          },
          {
            "name": "opening_hours",
            "type": "string",
            "required": false,
            "description": "Horario de atención"
          },
          {
            "name": "tone",
            "type": "string",
            "required": false,
            "description": "Tono de comunicación con los clientes"
          },
          {
            "name": "short_description",
            "type": "string",
            "required": false,
            "description": "Descripción corta del negocio"
          },
          {
            "name": "social_links",
            "type": "string",
            "required": false,
            "description": "Sitio web y redes sociales"
          },
          {
            "name": "refund_policy",
            "type": "string",
            "required": false,
            "description": "Política de devoluciones o reembolsos"
          },
          {
            "name": "business_name",
            "type": "string",
            "required": false,
            "description": "Corrección del nombre del negocio"
          },
          {
            "name": "industry",
            "type": "string",
            "required": false,
            "description": "Corrección del giro del negocio"
          },
          {
            "name": "phone",
            "type": "string",
            "required": false,
            "description": "Corrección del teléfono del negocio"
          },
          {
            "name": "address",
            "type": "string",
            "required": false,
            "description": "Corrección de la dirección"
          },
          {
            "name": "invoice_email",
            "type": "string",
            "required": false,
            "description": "Corrección del correo de facturación"
          }
        ]
      },
      "output": {
        "structuredContent": "{ profile, next_question, is_complete }",
        "description": "profile = el perfil ya actualizado (los campos que no se envían se conservan); next_question = la siguiente pregunta pendiente; is_complete = si con este guardado el perfil quedó completo."
      }
    },
    {
      "name": "tilopay_recommend_automations",
      "title": "Recetas y automatizaciones",
      "description": "Devuelve recetas y automatizaciones sugeridas para el comercio según su perfil de negocio y los módulos del MCP que tiene activos.",
      "group": "perfil",
      "group_title": "Perfil del negocio y recetas",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/perfil",
      "input": {
        "parameters": [
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Cuántas recetas devolver (por defecto 5)"
          }
        ]
      },
      "output": {
        "structuredContent": "{ profile_complete, next_question, recipes }",
        "description": "recipes = recetas y automatizaciones sugeridas según el perfil del negocio y los módulos activos (incluye las bancarias sólo si el usuario tiene BaaS habilitado); profile_complete y next_question indican si falta completar el perfil."
      }
    },
    {
      "name": "tilopay_store_create",
      "title": "Crear una microtienda con carrito",
      "description": "Crea un enlace de microtienda para compartir con un cliente: muestra los productos del catálogo, el cliente arma un carrito y al finalizar paga desde la misma página con un enlace que incluye el detalle del carrito. Por defecto incluye todo el catálogo; se puede limitar a ciertos IDs de productos.",
      "group": "microtienda",
      "group_title": "Microtienda y pedidos",
      "access": "write",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/microtienda",
      "input": {
        "parameters": [
          {
            "name": "title",
            "type": "string",
            "required": false,
            "description": "Título visible de la tienda"
          },
          {
            "name": "item_ids",
            "type": "array<string>",
            "required": false,
            "description": "IDs de productos del catálogo a mostrar; si se omite, se muestra todo el catálogo"
          }
        ]
      },
      "output": {
        "structuredContent": "{ slug, url, items }",
        "description": "slug = identificador de la microtienda; url = enlace público de la tienda con carrito; items = cuántos productos del catálogo quedaron incluidos."
      }
    },
    {
      "name": "tilopay_store_list",
      "title": "Listar microtiendas activas",
      "description": "Lista las microtiendas activas del comercio con su enlace para compartir.",
      "group": "microtienda",
      "group_title": "Microtienda y pedidos",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/microtienda",
      "input": {
        "parameters": []
      },
      "output": {
        "structuredContent": "{ stores[] }",
        "description": "stores = microtiendas activas con slug, título, enlace público y los ids de productos que incluye cada una."
      }
    },
    {
      "name": "tilopay_store_delete",
      "title": "Desactivar una microtienda",
      "description": "Desactiva una microtienda por su slug: el enlace deja de abrir. Confirma con el comercio antes de usarla.",
      "group": "microtienda",
      "group_title": "Microtienda y pedidos",
      "access": "destructive",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/microtienda",
      "input": {
        "parameters": [
          {
            "name": "slug",
            "type": "string",
            "required": true,
            "description": "Slug de la tienda (el final de su enlace)"
          }
        ]
      },
      "output": {
        "structuredContent": "{ slug, active }",
        "description": "Desactiva la microtienda: el enlace deja de mostrar productos. active queda en false; los productos del catálogo no se borran."
      }
    },
    {
      "name": "tilopay_store_domain_connect",
      "title": "Conectar un dominio propio a la tienda",
      "description": "Conecta un dominio propio del comercio (ej. tienda.minegocio.com) a su microtienda. Lo registra de inmediato y devuelve la instrucción CNAME. Úsala solo cuando el comercio dé el dominio.",
      "group": "microtienda",
      "group_title": "Microtienda y pedidos",
      "access": "write",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/microtienda",
      "input": {
        "parameters": [
          {
            "name": "hostname",
            "type": "string",
            "required": true,
            "description": "Dominio, ej. tienda.minegocio.com"
          },
          {
            "name": "slug",
            "type": "string",
            "required": false,
            "description": "Slug de la tienda; si se omite, la más reciente"
          }
        ]
      },
      "output": {}
    },
    {
      "name": "tilopay_store_domain_status",
      "title": "Estado de los dominios propios",
      "description": "Revisa en Cloudflare el estado de los dominios propios de las tiendas del comercio.",
      "group": "microtienda",
      "group_title": "Microtienda y pedidos",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/microtienda",
      "input": {
        "parameters": []
      },
      "output": {}
    },
    {
      "name": "tilopay_store_domain_remove",
      "title": "Quitar un dominio propio",
      "description": "Desconecta un dominio propio de la tienda; la tienda sigue en su dirección tilopay.shop. Confirma con el comercio antes de usarla.",
      "group": "microtienda",
      "group_title": "Microtienda y pedidos",
      "access": "destructive",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/microtienda",
      "input": {
        "parameters": [
          {
            "name": "hostname",
            "type": "string",
            "required": true
          }
        ]
      },
      "output": {}
    },
    {
      "name": "tilopay_orders_setup",
      "title": "Activar o configurar la gestión de pedidos",
      "description": "Activa el control de pedidos de la microtienda y guarda el nombre de la tienda, el logo y la hora del recordatorio diario de pedidos pagados sin entregar. Sirve también para cambiar cualquiera de esos datos después. El logo puede venir como enlace https de una imagen o como la imagen que el comercio acaba de enviar por WhatsApp (pase la referencia que aparece en el mensaje).",
      "group": "microtienda",
      "group_title": "Microtienda y pedidos",
      "access": "write",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/microtienda",
      "input": {
        "parameters": [
          {
            "name": "store_name",
            "type": "string",
            "required": false,
            "description": "Nombre visible de la tienda"
          },
          {
            "name": "logo",
            "type": "string",
            "required": false,
            "description": "Enlace https de la imagen del logo, o la referencia de la imagen enviada por WhatsApp"
          },
          {
            "name": "reminder_time",
            "type": "string",
            "required": false,
            "description": "Hora local del recordatorio diario en formato HH:mm (ej. \"18:00\"); vacío lo desactiva"
          }
        ]
      },
      "output": {
        "structuredContent": "{ orders_enabled, store_name, has_logo, reminder_time }",
        "description": "Deja la gestión de pedidos activa y devuelve la configuración resultante: nombre de la tienda que ven los clientes, si hay logo cargado y la hora del recordatorio diario de pedidos pendientes."
      }
    },
    {
      "name": "tilopay_orders_settings",
      "title": "Ver la configuración de la tienda y los pedidos",
      "description": "Muestra si la gestión de pedidos está activa, el nombre de la tienda, si hay logo y la hora del recordatorio diario.",
      "group": "microtienda",
      "group_title": "Microtienda y pedidos",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/microtienda",
      "input": {
        "parameters": []
      },
      "output": {
        "structuredContent": "{ orders_enabled, store_name, has_logo, reminder_time }",
        "description": "Configuración actual de la tienda y de los pedidos, sin cambiar nada."
      }
    },
    {
      "name": "tilopay_orders_status",
      "title": "Resumen de pedidos",
      "description": "Resumen de los pedidos de las microtiendas: cuántos están pendientes de pago, cuántos pagados sin entregar (con su monto) y cuántos se entregaron hoy.",
      "group": "microtienda",
      "group_title": "Microtienda y pedidos",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/microtienda",
      "input": {
        "parameters": []
      },
      "output": {
        "structuredContent": "{ pending, paid, delivered, ... }",
        "description": "Resumen de pedidos: cuántos están pendientes de pago, pagados sin entregar y entregados, con los montos del período."
      }
    },
    {
      "name": "tilopay_orders_list",
      "title": "Listar pedidos",
      "description": "Lista los pedidos de las microtiendas con su código, cliente, total y detalle. Se puede filtrar por estado (pending = pendiente de pago, paid = pagado sin entregar, delivered = entregado) y por los últimos días.",
      "group": "microtienda",
      "group_title": "Microtienda y pedidos",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/microtienda",
      "input": {
        "parameters": [
          {
            "name": "status",
            "type": "string",
            "required": false,
            "description": "Estado del pedido; por defecto todos",
            "enum": [
              "pending",
              "paid",
              "delivered",
              "all"
            ]
          },
          {
            "name": "days",
            "type": "integer",
            "required": false,
            "description": "Solo pedidos de los últimos N días"
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false
          }
        ]
      },
      "output": {
        "structuredContent": "{ orders[] }",
        "description": "orders = pedidos con código, cliente, total, moneda, estado y fecha. Se puede filtrar por estado (pending, paid, delivered, all) y por los últimos días."
      }
    },
    {
      "name": "tilopay_orders_pending",
      "title": "Pedidos pagados sin entregar",
      "description": "Lista los pedidos ya pagados que aún no se han entregado. Es la herramienta que usa el recordatorio diario.",
      "group": "microtienda",
      "group_title": "Microtienda y pedidos",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/microtienda",
      "input": {
        "parameters": []
      },
      "output": {
        "structuredContent": "{ pending, orders[] }",
        "description": "pending = cuántos pedidos están pagados y sin entregar; orders = esos pedidos con código, cliente, total y moneda."
      }
    },
    {
      "name": "tilopay_order_mark_delivered",
      "title": "Marcar un pedido como entregado",
      "description": "Marca uno o varios pedidos como entregados. Acepta el código del pedido (ej. \"#A3F2\", incluso varios en el mismo mensaje) o el nombre del cliente.",
      "group": "microtienda",
      "group_title": "Microtienda y pedidos",
      "access": "write",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/microtienda",
      "input": {
        "parameters": [
          {
            "name": "code",
            "type": "string",
            "required": false,
            "description": "Código del pedido, ej. \"#A3F2\"; pueden venir varios"
          },
          {
            "name": "client",
            "type": "string",
            "required": false,
            "description": "Nombre del cliente del pedido"
          }
        ]
      },
      "output": {
        "structuredContent": "{ delivered, missing }",
        "description": "delivered = cuántos pedidos quedaron marcados como entregados; missing = los códigos que no se encontraron."
      }
    },
    {
      "name": "tilopay_orders_disable",
      "title": "Apagar la gestión de pedidos",
      "description": "Apaga el control de pedidos y cancela el recordatorio diario. Los pedidos ya registrados se conservan. Pida un sí explícito antes de usarla.",
      "group": "microtienda",
      "group_title": "Microtienda y pedidos",
      "access": "destructive",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/microtienda",
      "input": {
        "parameters": []
      },
      "output": {
        "structuredContent": "{ orders_enabled: false }",
        "description": "Apaga la gestión de pedidos. Los pedidos ya registrados se conservan."
      }
    },
    {
      "name": "tilopay_get_notification_settings",
      "title": "Ver la configuración de avisos",
      "description": "Muestra cómo están configurados los avisos del comercio: si los pagos recibidos se avisan por WhatsApp y/o por correo, a qué correo, desde qué monto y si hay horario de silencio.",
      "group": "avisos",
      "group_title": "Avisos y notificaciones",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/avisos",
      "input": {
        "parameters": []
      },
      "output": {
        "structuredContent": "{ settings }",
        "description": "settings = configuración de avisos del comercio: qué avisos por WhatsApp están encendidos (cobros aprobados, cobros fallidos, resumen diario, pedidos) y a qué hora se envía el resumen."
      }
    },
    {
      "name": "tilopay_set_notification_settings",
      "title": "Configurar los avisos del comercio",
      "description": "Cambia la configuración de avisos del comercio: activar o desactivar el aviso de pago recibido por WhatsApp y por correo, el correo de destino, el monto mínimo para avisar y el horario de silencio (en la hora local del comercio). Solo envíe los campos que el usuario pidió cambiar.",
      "group": "avisos",
      "group_title": "Avisos y notificaciones",
      "access": "write",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/avisos",
      "input": {
        "parameters": [
          {
            "name": "payment_whatsapp",
            "type": "boolean",
            "required": false,
            "description": "Avisar por WhatsApp cuando se recibe un pago"
          },
          {
            "name": "payment_email",
            "type": "boolean",
            "required": false,
            "description": "Avisar por correo cuando se recibe un pago"
          },
          {
            "name": "notify_email",
            "type": "string",
            "required": false,
            "description": "Correo que recibe los avisos (si se omite, el de la cuenta)"
          },
          {
            "name": "min_amount",
            "type": "number",
            "required": false,
            "description": "Monto mínimo para avisar (0 = avisar por cualquier monto)"
          },
          {
            "name": "quiet_from",
            "type": "integer | null",
            "required": false,
            "description": "Hora local en que empieza el silencio (null para quitarlo)"
          },
          {
            "name": "quiet_to",
            "type": "integer | null",
            "required": false,
            "description": "Hora local en que termina el silencio (null para quitarlo)"
          }
        ]
      },
      "output": {
        "structuredContent": "{ settings }",
        "description": "settings = la configuración de avisos ya actualizada. Los campos que no se envían se conservan."
      }
    },
    {
      "name": "tilopay_list_receipts",
      "title": "Listar comprobantes de cobro",
      "description": "Lista los últimos comprobantes de cobro del comercio (monto, cliente, orden y código). Cada uno trae un texto listo para reenviar al cliente. No cobra nada.",
      "group": "comprobantes",
      "group_title": "Comprobantes de cobro",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/comprobantes",
      "input": {
        "parameters": [
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Cuántos comprobantes listar (5 por defecto)"
          }
        ]
      },
      "output": {
        "structuredContent": "{ receipts[] }",
        "description": "receipts = comprobantes de cobro con código, monto, moneda, cliente, número de orden, fecha de pago, enlace de la página del comprobante y enlace de la imagen."
      }
    },
    {
      "name": "tilopay_send_receipt",
      "title": "Reenviar el comprobante de un cobro al cliente",
      "description": "Envía al cliente el comprobante de un cobro, por WhatsApp (por defecto: enlace wa.me de un toque) o por correo con la marca del comercio (channel=email). Busca por código, número de orden o nombre del cliente; sin datos usa el comprobante más reciente. Si el usuario dice «el último cobro» o «el último comprobante», llámala directamente sin code ni order_number (no consultes transacciones antes). Usa send_now solo si el usuario pide que se envíe directamente por WhatsApp. Nunca inventes el correo ni el teléfono del cliente: si faltan, pídelos.",
      "group": "comprobantes",
      "group_title": "Comprobantes de cobro",
      "access": "write",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/comprobantes",
      "input": {
        "parameters": [
          {
            "name": "code",
            "type": "string",
            "required": false,
            "description": "Código del comprobante (8 caracteres)"
          },
          {
            "name": "order_number",
            "type": "string",
            "required": false,
            "description": "Número de orden del cobro"
          },
          {
            "name": "client_name",
            "type": "string",
            "required": false,
            "description": "Nombre del cliente del cobro, para buscar el comprobante"
          },
          {
            "name": "channel",
            "type": "string",
            "required": false,
            "description": "whatsapp (por defecto) o email",
            "enum": [
              "whatsapp",
              "email"
            ]
          },
          {
            "name": "email",
            "type": "string",
            "required": false,
            "description": "Correo del cliente, si se envía por correo"
          },
          {
            "name": "contact_name",
            "type": "string",
            "required": false,
            "description": "Nombre del contacto guardado o del cliente"
          },
          {
            "name": "phone",
            "type": "string",
            "required": false,
            "description": "Teléfono de WhatsApp, ej. +50688887777"
          },
          {
            "name": "message",
            "type": "string",
            "required": false,
            "description": "Texto propio para acompañar el comprobante"
          },
          {
            "name": "save_contact",
            "type": "boolean",
            "required": false,
            "description": "Guardar el contacto en la agenda"
          },
          {
            "name": "send_now",
            "type": "boolean",
            "required": false,
            "description": "true envía el comprobante directamente al cliente; por defecto se entrega el enlace wa.me"
          }
        ]
      },
      "output": {
        "structuredContent": "{ sent | code, page_url, image_url, whatsapp_url }",
        "description": "Reenvía el comprobante al cliente por WhatsApp: devuelve el código del comprobante, el enlace de su página, el de la imagen y, cuando no se envía directo, el enlace de WhatsApp listo para abrir."
      }
    },
    {
      "name": "tilopay_create_reminder",
      "title": "Crear recordatorio",
      "description": "Crea un recordatorio por WhatsApp, de una sola vez o recurrente (diario, semanal o mensual). Puede ser solo texto o ejecutar una acción del agente al enviarse (con `action`): resumen de ventas, transacciones del día, enlaces pendientes, etc. NO crea recordatorios bancarios (saldo, movimientos, estados de cuenta, transferencias): esos los configura el comercio en el calendario del portal de Banca Cliente. Si el recordatorio es para enviar un enlace de pago o cobro, SIEMPRE llega al WhatsApp del comercio que lo pidió, nunca al cliente. En los demás casos se envía al WhatsApp del comercio o a un contacto ya guardado (contact_name); si el usuario da un teléfono nuevo, hay que guardarlo primero con tilopay_save_contact. Máximo 20 recordatorios activos. El mensaje sale con un prefijo fijo que identifica al comercio. Horas en la hora local del comercio (según el país de su teléfono de WhatsApp).",
      "group": "recordatorios",
      "group_title": "Recordatorios",
      "access": "write",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/recordatorios",
      "input": {
        "parameters": [
          {
            "name": "message",
            "type": "string",
            "required": true,
            "description": "Texto del recordatorio (máx. 500 caracteres, sin HTML)"
          },
          {
            "name": "action",
            "type": "string",
            "required": false,
            "description": "Instrucción que el agente ejecutará al enviarlo, en lenguaje natural, ej. 'dame el resumen de ventas de hoy' o 'lista los enlaces de pago pendientes'. El resultado se adjunta al mensaje. Omítelo si es un recordatorio de solo texto."
          },
          {
            "name": "schedule",
            "type": "string",
            "required": true,
            "description": "Frecuencia: once = una sola vez",
            "enum": [
              "once",
              "daily",
              "weekly",
              "monthly"
            ]
          },
          {
            "name": "when",
            "type": "string",
            "required": false,
            "description": "Solo para once: fecha y hora local 'YYYY-MM-DD HH:mm'"
          },
          {
            "name": "time_of_day",
            "type": "string",
            "required": false,
            "description": "Para recurrentes: hora local 'HH:mm'"
          },
          {
            "name": "weekday",
            "type": "integer",
            "required": false,
            "description": "Para weekly: 0 = domingo ... 6 = sábado"
          },
          {
            "name": "day_of_month",
            "type": "integer",
            "required": false,
            "description": "Para monthly: día del mes (1-28)"
          },
          {
            "name": "contact_name",
            "type": "string",
            "required": false,
            "description": "Nombre de un contacto ya guardado (mcp_contact) que debe recibirlo. Si se omite, llega al WhatsApp del comercio. No se aceptan teléfonos nuevos: guárdalos primero con tilopay_save_contact."
          }
        ]
      },
      "output": {
        "structuredContent": "{ id, message, action, phone, contact_name, schedule, when, next_run_local, is_active }",
        "description": "El recordatorio creado: cuándo se envía en la hora local del comercio, a qué número, y qué acción del agente se ejecuta al enviarse. Máximo 20 recordatorios activos; los de enlaces de cobro siempre llegan al WhatsApp del comercio, nunca al cliente."
      }
    },
    {
      "name": "tilopay_list_reminders",
      "title": "Ver recordatorios",
      "description": "Lista los recordatorios activos del comercio con su próxima fecha de envío.",
      "group": "recordatorios",
      "group_title": "Recordatorios",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/recordatorios",
      "input": {
        "parameters": [
          {
            "name": "include_inactive",
            "type": "boolean",
            "required": false,
            "description": "true para incluir los ya enviados o cancelados"
          }
        ]
      },
      "output": {
        "structuredContent": "{ reminders[] }",
        "description": "reminders = recordatorios del comercio con su mensaje, frecuencia, próxima ejecución en hora local y si están activos."
      }
    },
    {
      "name": "tilopay_cancel_reminder",
      "title": "Cancelar recordatorio",
      "description": "Cancela un recordatorio por su ID o buscando parte de su texto. No borra el historial, solo deja de enviarse.",
      "group": "recordatorios",
      "group_title": "Recordatorios",
      "access": "destructive",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/recordatorios",
      "input": {
        "parameters": [
          {
            "name": "id",
            "type": "string",
            "required": false,
            "description": "ID del recordatorio"
          },
          {
            "name": "search",
            "type": "string",
            "required": false,
            "description": "Parte del texto del recordatorio"
          }
        ]
      },
      "output": {
        "structuredContent": "{ cancelled }",
        "description": "cancelled = el recordatorio que quedó desactivado."
      }
    },
    {
      "name": "tilopay_recurring_list_plans",
      "title": "Listar planes de cobro recurrente",
      "description": "Lista los planes de cobro recurrente configurados en Tilopay.",
      "group": "recurrentes",
      "group_title": "Cobros recurrentes",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/recurrentes",
      "api_endpoint": "POST /api/v1/getPlansRepeat",
      "input": {
        "parameters": []
      },
      "output": {
        "structuredContent": "{ result }",
        "description": "Respuesta cruda del API de Tilopay bajo la llave `result`."
      }
    },
    {
      "name": "tilopay_recurring_get_plan",
      "title": "Detalle de un plan recurrente",
      "description": "Obtiene el detalle de un plan de cobro recurrente por su ID.",
      "group": "recurrentes",
      "group_title": "Cobros recurrentes",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/recurrentes",
      "api_endpoint": "POST /api/v1/getPlanRepeat",
      "input": {
        "parameters": [
          {
            "name": "id",
            "type": "string",
            "required": true,
            "description": "ID del plan"
          },
          {
            "name": "include_qr",
            "type": "boolean",
            "required": false,
            "description": "Incluir el QR en base64 del plan (por defecto false; úsalo solo si el comercio pide el QR)"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result }",
        "description": "Respuesta cruda del API de Tilopay bajo la llave `result`."
      }
    },
    {
      "name": "tilopay_recurring_get_subscriber",
      "title": "Detalle de un suscriptor",
      "description": "Obtiene el detalle de un suscriptor de un plan recurrente por su ID.",
      "group": "recurrentes",
      "group_title": "Cobros recurrentes",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/recurrentes",
      "api_endpoint": "POST /api/v1/getSuscriptorRepeat",
      "input": {
        "parameters": [
          {
            "name": "id",
            "type": "string",
            "required": true,
            "description": "ID del suscriptor"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result }",
        "description": "Respuesta cruda del API de Tilopay bajo la llave `result`."
      }
    },
    {
      "name": "tilopay_recurring_find_subscriber",
      "title": "Buscar suscriptor por nombre o correo",
      "description": "Busca un suscriptor por nombre o correo en todos los planes recurrentes de una sola vez. Úsala antes de pausar, reactivar o editar a alguien cuando no tienes su ID.",
      "group": "recurrentes",
      "group_title": "Cobros recurrentes",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/recurrentes",
      "input": {
        "parameters": [
          {
            "name": "query",
            "type": "string",
            "required": true,
            "description": "Nombre o correo del suscriptor"
          }
        ]
      },
      "output": {}
    },
    {
      "name": "tilopay_recurring_subscriber_payments",
      "title": "Pagos de un suscriptor",
      "description": "Lista los pagos realizados por un suscriptor recurrente.",
      "group": "recurrentes",
      "group_title": "Cobros recurrentes",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/recurrentes",
      "api_endpoint": "POST /api/v1/getSuscriptorPayments",
      "input": {
        "parameters": [
          {
            "name": "id",
            "type": "string",
            "required": true,
            "description": "ID del suscriptor"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result }",
        "description": "Respuesta cruda del API de Tilopay bajo la llave `result`."
      }
    },
    {
      "name": "tilopay_recurring_failed_payments",
      "title": "Cobros recurrentes fallidos",
      "description": "Lista los últimos cobros recurrentes que fallaron (plan, suscriptor, monto, fecha y motivo en lenguaje simple). Una sola llamada basta.",
      "group": "recurrentes",
      "group_title": "Cobros recurrentes",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/recurrentes",
      "api_endpoint": "POST /api/v1/getSuscriptorPayments",
      "input": {
        "parameters": [
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Máximo de cobros (por defecto 10)"
          },
          {
            "name": "startDate",
            "type": "string",
            "required": false,
            "description": "Desde, \"YYYY-MM-DD HH:mm:ss\""
          },
          {
            "name": "endDate",
            "type": "string",
            "required": false,
            "description": "Hasta, \"YYYY-MM-DD HH:mm:ss\""
          }
        ]
      },
      "output": {
        "structuredContent": "{ total, source, failures[] }",
        "description": "failures = cobros recurrentes rechazados, con plan, suscriptor, monto, moneda y motivo del rechazo; total = cuántos se encontraron; source = la ruta del API de la que se obtuvieron. Combina la consulta de planes, suscriptores y sus pagos."
      }
    },
    {
      "name": "tilopay_recurring_manage_subscriber",
      "title": "Pausar, reactivar o eliminar un suscriptor",
      "description": "Pausa, reactiva o elimina un suscriptor de un plan recurrente en Tilopay. Operación sensible: afecta cobros futuros y requiere segundo factor. Llámela primero sin `confirmation_code`: se envía un código de 6 dígitos al correo del comercio y la respuesta trae `requires_confirmation`. Repita la misma llamada agregando `confirmation_code`.",
      "group": "recurrentes",
      "group_title": "Cobros recurrentes",
      "access": "destructive",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/recurrentes",
      "api_endpoint": "POST /api/v1/pauseSuscriptorRepeat, /reactiveSuscriptorRepeat o /deleteSuscriptorRepeat",
      "input": {
        "parameters": [
          {
            "name": "idSubscriber",
            "type": "string",
            "required": true,
            "description": "ID del suscriptor"
          },
          {
            "name": "action",
            "type": "string",
            "required": true,
            "description": "Acción a realizar",
            "enum": [
              "pause",
              "reactivate",
              "delete"
            ]
          },
          {
            "name": "confirmation_code",
            "type": "string",
            "required": false,
            "description": "Código de 6 dígitos recibido por correo para autorizar la operación"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result }",
        "description": "Respuesta cruda del endpoint correspondiente a la acción: pause, reactivate o delete."
      }
    },
    {
      "name": "tilopay_recurring_create_plan",
      "title": "Crear plan de suscripción",
      "description": "Crea un plan de cobro recurrente (suscripción) en Tilopay con su título, moneda, frecuencia y modalidades (nombre y monto). Devuelve el ID del plan creado; luego usa tilopay_recurring_subscription_url para obtener el enlace con el que los clientes se suscriben.",
      "group": "recurrentes",
      "group_title": "Cobros recurrentes",
      "access": "write",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/recurrentes",
      "api_endpoint": "POST /api/v1/createPlanRepeat",
      "input": {
        "parameters": [
          {
            "name": "title",
            "type": "string",
            "required": true,
            "description": "Título del plan"
          },
          {
            "name": "modality",
            "type": "array<object>",
            "required": true,
            "description": "Modalidades del plan (al menos una): nombre y monto por ciclo"
          },
          {
            "name": "frequency",
            "type": "string",
            "required": true,
            "description": "Frecuencia de cobro",
            "enum": [
              "diario",
              "semanal",
              "mensual",
              "anual",
              "quincenal",
              "bimestral",
              "trimestral",
              "cuatrimestral",
              "semestral"
            ]
          },
          {
            "name": "description",
            "type": "string",
            "required": false,
            "description": "Descripción del plan"
          },
          {
            "name": "currency",
            "type": "string",
            "required": false,
            "description": "Moneda ISO 4217, ej. USD o CRC. Si se omite se usa la del país del comercio."
          },
          {
            "name": "first_amount",
            "type": "number",
            "required": false,
            "description": "Monto del pago inicial (0 si no hay)"
          },
          {
            "name": "trial_days",
            "type": "integer",
            "required": false,
            "description": "Días de prueba gratis (0 si no hay prueba)"
          },
          {
            "name": "attempts",
            "type": "integer",
            "required": false,
            "description": "Reintentos ante un cobro fallido (1 por defecto)"
          },
          {
            "name": "end_at",
            "type": "string",
            "required": false,
            "description": "Fecha de fin del plan en formato DD-MM-YYYY (opcional)"
          },
          {
            "name": "thanks_url",
            "type": "string",
            "required": false,
            "description": "URL de agradecimiento tras suscribirse (opcional)"
          },
          {
            "name": "webhook_subscribe",
            "type": "string",
            "required": false,
            "description": "Webhook al suscribirse un cliente (opcional)"
          },
          {
            "name": "webhook_payment",
            "type": "string",
            "required": false,
            "description": "Webhook al cobrarse un pago (opcional)"
          },
          {
            "name": "webhook_rejected",
            "type": "string",
            "required": false,
            "description": "Webhook al rechazarse un cobro (opcional)"
          },
          {
            "name": "webhook_unsubscribe",
            "type": "string",
            "required": false,
            "description": "Webhook al cancelarse una suscripción (opcional)"
          },
          {
            "name": "webhook_reactive",
            "type": "string",
            "required": false,
            "description": "Webhook al reactivarse una suscripción (opcional)"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result, currency, frequency }",
        "description": "result = respuesta del API con el plan creado; currency y frequency = la moneda y la frecuencia con la que quedó el plan."
      }
    },
    {
      "name": "tilopay_recurring_edit_plan",
      "title": "Editar plan de suscripción",
      "description": "Modifica un plan de cobro recurrente existente: título, descripción, frecuencia, moneda, monto por ciclo (modality), pago inicial, prueba gratis, reintentos, estado o fecha de fin. Consulte primero tilopay_recurring_get_plan para conocer los valores actuales.",
      "group": "recurrentes",
      "group_title": "Cobros recurrentes",
      "access": "write",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/recurrentes",
      "api_endpoint": "POST /api/v1/editPlanRepeat",
      "input": {
        "parameters": [
          {
            "name": "id",
            "type": "string",
            "required": true,
            "description": "ID del plan"
          },
          {
            "name": "title",
            "type": "string",
            "required": true,
            "description": "Título del plan"
          },
          {
            "name": "frequency",
            "type": "string",
            "required": true,
            "description": "Frecuencia de cobro",
            "enum": [
              "diario",
              "semanal",
              "mensual",
              "anual",
              "quincenal",
              "bimestral",
              "trimestral",
              "cuatrimestral",
              "semestral"
            ]
          },
          {
            "name": "modality",
            "type": "array<object>",
            "required": false,
            "description": "Modalidades con su monto por ciclo; envíelas cuando cambie el precio del plan"
          },
          {
            "name": "currency",
            "type": "string",
            "required": false,
            "description": "Moneda ISO 4217"
          },
          {
            "name": "description",
            "type": "string",
            "required": false,
            "description": "Descripción del plan"
          },
          {
            "name": "first_amount",
            "type": "number",
            "required": false,
            "description": "Monto del pago inicial"
          },
          {
            "name": "trial_days",
            "type": "integer",
            "required": false,
            "description": "Días de prueba gratis"
          },
          {
            "name": "attempts",
            "type": "integer",
            "required": false,
            "description": "Reintentos ante cobro fallido"
          },
          {
            "name": "status",
            "type": "string",
            "required": false,
            "description": "Estado: inactive (inactivo), active (activo) o closed_to_new (activo sin registros nuevos)",
            "enum": [
              "inactive",
              "active",
              "closed_to_new"
            ]
          },
          {
            "name": "end_at",
            "type": "string",
            "required": false,
            "description": "Fecha de fin del plan en formato DD-MM-YYYY (opcional)"
          },
          {
            "name": "thanks_url",
            "type": "string",
            "required": false,
            "description": "URL de agradecimiento"
          },
          {
            "name": "webhook_subscribe",
            "type": "string",
            "required": false,
            "description": "Webhook al suscribirse"
          },
          {
            "name": "webhook_payment",
            "type": "string",
            "required": false,
            "description": "Webhook al cobrarse un pago"
          },
          {
            "name": "webhook_rejected",
            "type": "string",
            "required": false,
            "description": "Webhook al rechazarse un cobro"
          },
          {
            "name": "webhook_unsubscribe",
            "type": "string",
            "required": false,
            "description": "Webhook al cancelarse"
          },
          {
            "name": "webhook_reactive",
            "type": "string",
            "required": false,
            "description": "Webhook al reactivarse"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result }",
        "description": "result = respuesta del API al editar el plan. Los campos que no se envían se conservan."
      }
    },
    {
      "name": "tilopay_recurring_delete_plan",
      "title": "Eliminar plan de suscripción",
      "description": "Elimina un plan de cobro recurrente en Tilopay. Afecta los cobros futuros del plan: confirma con el comercio antes de ejecutarla.",
      "group": "recurrentes",
      "group_title": "Cobros recurrentes",
      "access": "destructive",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/recurrentes",
      "api_endpoint": "POST /api/v1/deletePlanRepeat",
      "input": {
        "parameters": [
          {
            "name": "id",
            "type": "string",
            "required": true,
            "description": "ID del plan"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result }",
        "description": "result = respuesta del API al eliminar el plan. Los suscriptores del plan dejan de cobrarse."
      }
    },
    {
      "name": "tilopay_recurring_subscription_url",
      "title": "Enlace de suscripción a un plan",
      "description": "Devuelve el enlace con el que un cliente se registra en un plan recurrente (o lo renueva si el correo ya está suscrito). Entregue la URL completa, sin recortarla.",
      "group": "recurrentes",
      "group_title": "Cobros recurrentes",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/recurrentes",
      "api_endpoint": "POST /api/v1/recurrentUrl",
      "input": {
        "parameters": [
          {
            "name": "id",
            "type": "string",
            "required": true,
            "description": "ID del plan"
          },
          {
            "name": "email",
            "type": "string",
            "required": false,
            "description": "Correo del cliente; si ya está suscrito devuelve el enlace de renovación"
          }
        ]
      },
      "output": {
        "structuredContent": "{ url, result }",
        "description": "url = enlace de suscripción al plan, para compartir con el cliente; result = respuesta del API tal cual."
      }
    },
    {
      "name": "tilopay_recurring_edit_subscriber",
      "title": "Editar suscriptor de un plan",
      "description": "Cambia el estado de un suscriptor (activo, pausado o eliminado) y/o su fecha de expiración. Afecta cobros futuros: confirma con el comercio antes de ejecutarla.",
      "group": "recurrentes",
      "group_title": "Cobros recurrentes",
      "access": "destructive",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/recurrentes",
      "api_endpoint": "POST /api/v1/editSuscriptorRepeat",
      "input": {
        "parameters": [
          {
            "name": "id",
            "type": "string",
            "required": true,
            "description": "ID del suscriptor"
          },
          {
            "name": "status",
            "type": "string",
            "required": false,
            "description": "Nuevo estado del suscriptor",
            "enum": [
              "active",
              "paused",
              "deleted"
            ]
          },
          {
            "name": "expire",
            "type": "string",
            "required": false,
            "description": "Fecha de expiración del plan para ese suscriptor en formato YYYY-MM-DD"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result }",
        "description": "result = respuesta del API al editar los datos del suscriptor (correo, teléfono, monto o fecha de vencimiento, según el plan)."
      }
    },
    {
      "name": "tilopay_recurring_create_coupon",
      "title": "Crear cupón de descuento",
      "description": "Crea un cupón de descuento para un plan de suscripción: porcentaje o monto fijo, fecha de vencimiento, correos permitidos y límites de uso.",
      "group": "recurrentes",
      "group_title": "Cobros recurrentes",
      "access": "write",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/recurrentes",
      "api_endpoint": "POST /api/v1/createCoupon",
      "input": {
        "parameters": [
          {
            "name": "planId",
            "type": "string",
            "required": true,
            "description": "ID del plan recurrente"
          },
          {
            "name": "discount_type",
            "type": "string",
            "required": true,
            "description": "Tipo de descuento: percentage (porcentaje) o fixed (monto fijo)",
            "enum": [
              "percentage",
              "fixed"
            ]
          },
          {
            "name": "discount",
            "type": "number",
            "required": true,
            "description": "Valor del descuento"
          },
          {
            "name": "expire",
            "type": "string",
            "required": true,
            "description": "Fecha de vencimiento del cupón en formato YYYY-MM-DD"
          },
          {
            "name": "allow_existing_users",
            "type": "boolean",
            "required": false,
            "description": "true si también lo pueden usar clientes ya registrados (false = solo nuevos)"
          },
          {
            "name": "emails",
            "type": "array<string>",
            "required": false,
            "description": "Correos autorizados; si se omite, cualquier correo puede usarlo"
          },
          {
            "name": "usage",
            "type": "integer",
            "required": false,
            "description": "Cantidad total de usos"
          },
          {
            "name": "renews",
            "type": "integer",
            "required": false,
            "description": "Renovaciones válidas con el cupón"
          },
          {
            "name": "renews_by_user",
            "type": "integer",
            "required": false,
            "description": "Usos por un mismo cliente"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result }",
        "description": "result = respuesta del API con el cupón de descuento creado para el plan."
      }
    },
    {
      "name": "tilopay_recurring_list_coupons",
      "title": "Cupones de un plan",
      "description": "Lista los cupones de descuento asociados a un plan de suscripción.",
      "group": "recurrentes",
      "group_title": "Cobros recurrentes",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/recurrentes",
      "api_endpoint": "POST /api/v1/getRepeatCoupons",
      "input": {
        "parameters": [
          {
            "name": "planId",
            "type": "string",
            "required": true,
            "description": "ID del plan recurrente"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result }",
        "description": "result = cupones del plan tal cual los devuelve el API."
      }
    },
    {
      "name": "tilopay_recurring_get_coupon",
      "title": "Detalle de un cupón",
      "description": "Obtiene el detalle de un cupón de descuento por su ID.",
      "group": "recurrentes",
      "group_title": "Cobros recurrentes",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/recurrentes",
      "api_endpoint": "POST /api/v1/getCoupon",
      "input": {
        "parameters": [
          {
            "name": "id",
            "type": "string",
            "required": true,
            "description": "ID del cupón"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result }",
        "description": "result = detalle de un cupón tal cual lo devuelve el API."
      }
    },
    {
      "name": "tilopay_recurring_delete_coupon",
      "title": "Eliminar un cupón",
      "description": "Elimina un cupón de descuento de un plan de suscripción.",
      "group": "recurrentes",
      "group_title": "Cobros recurrentes",
      "access": "destructive",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/recurrentes",
      "api_endpoint": "POST /api/v1/deleteCoupon",
      "input": {
        "parameters": [
          {
            "name": "id",
            "type": "string",
            "required": true,
            "description": "ID del cupón"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result }",
        "description": "result = respuesta del API al eliminar el cupón."
      }
    },
    {
      "name": "tilopay_recurring_plan_wizard_start",
      "title": "Iniciar paso a paso de un plan de suscripción",
      "description": "Inicia el paso a paso guiado para crear (mode=create) o editar (mode=edit con plan_id) un plan de suscripción. Devuelve la primera pregunta pendiente: entréguela al comercio tal cual y pase su respuesta a tilopay_recurring_plan_wizard_answer. Úselo en vez de tilopay_recurring_create_plan cuando falte algún dato.",
      "group": "recurrentes",
      "group_title": "Cobros recurrentes",
      "access": "write",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/recurrentes",
      "input": {
        "parameters": [
          {
            "name": "mode",
            "type": "string",
            "required": true,
            "description": "create para un plan nuevo, edit para modificar uno existente",
            "enum": [
              "create",
              "edit"
            ]
          },
          {
            "name": "plan_id",
            "type": "string",
            "required": false,
            "description": "ID del plan (obligatorio en mode=edit)"
          },
          {
            "name": "title",
            "type": "string",
            "required": false,
            "description": "Título, si el comercio ya lo dijo"
          },
          {
            "name": "frequency",
            "type": "string",
            "required": false,
            "description": "Frecuencia, si el comercio ya la dijo",
            "enum": [
              "diario",
              "semanal",
              "quincenal",
              "mensual",
              "bimestral",
              "trimestral",
              "cuatrimestral",
              "semestral",
              "anual"
            ]
          },
          {
            "name": "amount",
            "type": "number",
            "required": false,
            "description": "Monto por ciclo, si el comercio ya lo dijo"
          },
          {
            "name": "currency",
            "type": "string",
            "required": false,
            "description": "Moneda ISO si el comercio la indicó con símbolo o nombre ($ o dólares = USD, ₡ o colones = CRC)"
          },
          {
            "name": "description",
            "type": "string",
            "required": false,
            "description": "Descripción, si ya la dijo"
          }
        ]
      },
      "output": {
        "structuredContent": "{ draft }",
        "description": "draft = borrador del plan en proceso, con lo que ya se respondió y el siguiente paso pendiente. No crea nada en Tilopay hasta confirmar."
      }
    },
    {
      "name": "tilopay_recurring_plan_wizard_answer",
      "title": "Responder un paso del plan de suscripción",
      "description": "Guarda la respuesta del comercio al paso actual del plan de suscripción y devuelve la siguiente pregunta o el resumen para confirmar. Entregue el texto devuelto tal cual, sin agregar preguntas propias.",
      "group": "recurrentes",
      "group_title": "Cobros recurrentes",
      "access": "write",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/recurrentes",
      "input": {
        "parameters": [
          {
            "name": "answer",
            "type": "string",
            "required": true,
            "description": "Lo que respondió el comercio, tal cual"
          }
        ]
      },
      "output": {
        "structuredContent": "{ draft }",
        "description": "draft = el borrador actualizado con la respuesta del paso y el siguiente paso pendiente."
      }
    },
    {
      "name": "tilopay_recurring_plan_wizard_confirm",
      "title": "Confirmar el plan de suscripción",
      "description": "Crea o edita el plan de suscripción con los datos del paso a paso, después de que el comercio dijo sí al resumen. Al crear devuelve además el enlace de suscripción: entréguelo completo, sin recortarlo.",
      "group": "recurrentes",
      "group_title": "Cobros recurrentes",
      "access": "write",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/recurrentes",
      "api_endpoint": "POST /api/v1/createPlanRepeat",
      "input": {
        "parameters": []
      },
      "output": {
        "structuredContent": "{ plan_id, subscription_url }",
        "description": "Crea el plan con lo que se armó paso a paso: plan_id = id del plan creado; subscription_url = enlace de suscripción para compartir."
      }
    },
    {
      "name": "tilopay_recurring_plan_wizard_cancel",
      "title": "Cancelar el paso a paso del plan",
      "description": "Descarta el plan de suscripción que estaba en proceso sin crear ni cambiar nada.",
      "group": "recurrentes",
      "group_title": "Cobros recurrentes",
      "access": "write",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/recurrentes",
      "input": {
        "parameters": []
      },
      "output": {
        "description": "Descarta el borrador del plan en proceso. No crea ni cambia nada en Tilopay; devuelve sólo la confirmación en texto."
      }
    },
    {
      "name": "tilopay_recurring_settle_link",
      "title": "Enlace de pago para poner al día un cobro recurrente fallido",
      "description": "Crea un enlace de pago por el monto de un cobro recurrente que falló y lo asocia al suscriptor del plan. Cuando el cliente paga ese enlace, la suscripción queda al día automáticamente: el suscriptor se reactiva y su fecha de expiración avanza al siguiente ciclo. Úsala cuando el comercio acepte enviarle el enlace al cliente de un cobro fallido (los datos salen de tilopay_recurring_failed_payments). Devuelve la URL del enlace y, si hay teléfono, un enlace de WhatsApp listo para enviarle al cliente.",
      "group": "recurrentes",
      "group_title": "Cobros recurrentes",
      "access": "write",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/recurrentes",
      "api_endpoint": "POST /api/v1/createLinkPayment",
      "input": {
        "parameters": [
          {
            "name": "subscriber_id",
            "type": "string",
            "required": true,
            "description": "ID del suscriptor con el cobro fallido"
          },
          {
            "name": "amount",
            "type": "number",
            "required": true,
            "description": "Monto pendiente del cobro fallido"
          },
          {
            "name": "currency",
            "type": "string",
            "required": false,
            "description": "Moneda del cobro. Si se omite se usa la del país del comercio."
          },
          {
            "name": "plan_id",
            "type": "string",
            "required": false,
            "description": "ID del plan de suscripción"
          },
          {
            "name": "plan_name",
            "type": "string",
            "required": false,
            "description": "Nombre del plan, para el concepto del cobro"
          },
          {
            "name": "frequency",
            "type": "string",
            "required": false,
            "description": "Frecuencia del plan; si se omite se consulta al plan o se asume mensual",
            "enum": [
              "diario",
              "semanal",
              "quincenal",
              "mensual",
              "bimestral",
              "trimestral",
              "cuatrimestral",
              "semestral",
              "anual"
            ]
          },
          {
            "name": "client_name",
            "type": "string",
            "required": false,
            "description": "Nombre del cliente"
          },
          {
            "name": "client_email",
            "type": "string",
            "required": false,
            "description": "Correo del cliente"
          },
          {
            "name": "client_phone",
            "type": "string",
            "required": false,
            "description": "Teléfono del cliente en formato internacional, para el enlace de WhatsApp"
          },
          {
            "name": "message",
            "type": "string",
            "required": false,
            "description": "Mensaje propio para el cliente; si se omite se arma uno"
          }
        ]
      },
      "output": {
        "structuredContent": "{ url, linkId, whatsapp_url, currency, amount, subscriber_id, frequency }",
        "description": "Crea un enlace de pago de un solo uso para que el suscriptor ponga al día un cobro recurrente fallido: url = enlace de pago; whatsapp_url = enlace de WhatsApp listo para enviarlo; linkId = id del enlace creado."
      }
    },
    {
      "name": "tilopay_recurring_settle_batch",
      "title": "Enlaces para poner al día varios cobros fallidos",
      "description": "Envío en tanda (máximo 20) de enlaces para poner al día cobros recurrentes fallidos. Primero llámala SIN confirmar: devuelve el resumen (cantidad, total, quiénes no tienen teléfono) y una huella. Muestra ese resumen TAL CUAL y pide un sí explícito. Solo si el comercio responde sí, llámala de nuevo con confirm=true y la MISMA huella. Úsala cuando pida «mandales a todos»; para un solo cliente usa tilopay_recurring_settle_link.",
      "group": "recurrentes",
      "group_title": "Cobros recurrentes",
      "access": "write",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/recurrentes",
      "input": {
        "parameters": [
          {
            "name": "confirm",
            "type": "boolean",
            "required": false,
            "description": "true solo tras el sí explícito al resumen"
          },
          {
            "name": "fingerprint",
            "type": "string",
            "required": false,
            "description": "Huella devuelta por el resumen"
          },
          {
            "name": "subscriber_ids",
            "type": "array<string>",
            "required": false,
            "description": "Limitar a estos suscriptores; si se omite, todos los pendientes (máx. 20)"
          }
        ]
      },
      "output": {}
    },
    {
      "name": "tilopay_recurring_mark_settled",
      "title": "Poner al día un suscriptor",
      "description": "Marca al suscriptor como al día en su plan: lo deja activo y corre su fecha de expiración al siguiente ciclo. Úsala cuando el cobro pendiente ya se pagó por otro medio. Si el pago se hizo con el enlace de tilopay_recurring_settle_link, no hace falta: se actualiza solo. Confirma con el comercio antes de ejecutarla.",
      "group": "recurrentes",
      "group_title": "Cobros recurrentes",
      "access": "write",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/recurrentes",
      "api_endpoint": "POST /api/v1/editSuscriptorRepeat",
      "input": {
        "parameters": [
          {
            "name": "subscriber_id",
            "type": "string",
            "required": true,
            "description": "ID del suscriptor"
          },
          {
            "name": "plan_id",
            "type": "string",
            "required": false,
            "description": "ID del plan de suscripción"
          },
          {
            "name": "frequency",
            "type": "string",
            "required": false,
            "description": "Frecuencia del plan; si se omite se consulta al plan o se asume mensual",
            "enum": [
              "diario",
              "semanal",
              "quincenal",
              "mensual",
              "bimestral",
              "trimestral",
              "cuatrimestral",
              "semestral",
              "anual"
            ]
          },
          {
            "name": "expire",
            "type": "string",
            "required": false,
            "description": "Nueva fecha de expiración YYYY-MM-DD; si se omite se calcula el siguiente ciclo"
          }
        ]
      },
      "output": {
        "structuredContent": "{ ok, expire, frequency }",
        "description": "Corre la fecha de vencimiento del suscriptor según la frecuencia del plan, para dejarlo al día después de recuperar un cobro fallido. expire = la nueva fecha de vencimiento."
      }
    },
    {
      "name": "tilopay_saved_cards_list_groups",
      "title": "Listar grupos de cobro",
      "description": "Lista los grupos de cobro con tarjetas almacenadas (afiliados) en Tilopay.",
      "group": "tarjetas-guardadas",
      "group_title": "Tarjetas guardadas y cobros masivos",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/tarjetas-guardadas",
      "input": {
        "parameters": []
      },
      "output": {
        "structuredContent": "{ result }",
        "description": "Respuesta cruda del API de Tilopay bajo la llave `result`."
      }
    },
    {
      "name": "tilopay_saved_cards_list_affiliates",
      "title": "Listar afiliados con tarjeta almacenada",
      "description": "Lista los afiliados (clientes con tarjeta almacenada) de un grupo de cobro.",
      "group": "tarjetas-guardadas",
      "group_title": "Tarjetas guardadas y cobros masivos",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/tarjetas-guardadas",
      "input": {
        "parameters": [
          {
            "name": "group",
            "type": "integer",
            "required": false,
            "description": "ID del grupo (0 para todos)"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result }",
        "description": "Respuesta cruda del API de Tilopay bajo la llave `result`."
      }
    },
    {
      "name": "tilopay_saved_cards_list_collections",
      "title": "Listar cobros masivos",
      "description": "Lista los cobros masivos realizados con tarjetas almacenadas en Tilopay.",
      "group": "tarjetas-guardadas",
      "group_title": "Tarjetas guardadas y cobros masivos",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/tarjetas-guardadas",
      "input": {
        "parameters": []
      },
      "output": {
        "structuredContent": "{ result }",
        "description": "Respuesta cruda del API de Tilopay bajo la llave `result`."
      }
    },
    {
      "name": "tilopay_saved_cards_collection_detail",
      "title": "Detalle de un cobro masivo",
      "description": "Obtiene el detalle de un cobro masivo. Requiere el `code` del cobro (campo `code` devuelto por tilopay_saved_cards_list_collections).",
      "group": "tarjetas-guardadas",
      "group_title": "Tarjetas guardadas y cobros masivos",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/tarjetas-guardadas",
      "input": {
        "parameters": [
          {
            "name": "code",
            "type": "string",
            "required": true,
            "description": "Código del cobro masivo (campo `code` de la lista de cobros)"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result }",
        "description": "Respuesta cruda del API de Tilopay bajo la llave `result`."
      }
    },
    {
      "name": "tilopay_tokenize_card",
      "title": "Guardar la tarjeta de un cliente (tokenizar)",
      "description": "Genera el enlace seguro de Tilopay donde el cliente ingresa su tarjeta para dejarla guardada (tokenizada). El comercio nunca ve ni recibe los datos de la tarjeta. Una vez guardada, se le puede cobrar con tilopay_saved_cards_create_payments (esa sí pide código de confirmación por correo). Si se indica un contacto o teléfono, también devuelve un enlace de WhatsApp con el mensaje listo para enviarle al cliente.",
      "group": "tarjetas-guardadas",
      "group_title": "Tarjetas guardadas y cobros masivos",
      "access": "write",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/tarjetas-guardadas",
      "api_endpoint": "POST /api/v1/processTokenize",
      "input": {
        "parameters": [
          {
            "name": "email",
            "type": "string",
            "required": true,
            "description": "Correo del tarjetahabiente"
          },
          {
            "name": "first_name",
            "type": "string",
            "required": true,
            "description": "Nombre del tarjetahabiente"
          },
          {
            "name": "last_name",
            "type": "string",
            "required": true,
            "description": "Apellido del tarjetahabiente"
          },
          {
            "name": "language",
            "type": "string",
            "required": false,
            "description": "Idioma del formulario (es por defecto)",
            "enum": [
              "es",
              "en"
            ]
          },
          {
            "name": "redirect_url",
            "type": "string",
            "required": false,
            "description": "URL a la que vuelve el cliente al terminar (opcional)"
          },
          {
            "name": "contact_name",
            "type": "string",
            "required": false,
            "description": "Nombre del contacto guardado o del cliente, para armar el mensaje de WhatsApp"
          },
          {
            "name": "phone",
            "type": "string",
            "required": false,
            "description": "Teléfono de WhatsApp del cliente, ej. +50688887777"
          },
          {
            "name": "message",
            "type": "string",
            "required": false,
            "description": "Texto propio para el mensaje al cliente"
          },
          {
            "name": "save_contact",
            "type": "boolean",
            "required": false,
            "description": "Guardar el contacto en la agenda"
          }
        ]
      },
      "output": {
        "structuredContent": "{ tokenize_url, whatsapp_url, email, contact }",
        "description": "tokenize_url = enlace seguro donde el cliente ingresa su tarjeta para guardarla; whatsapp_url = enlace de WhatsApp listo para enviárselo. La tarjeta la digita el cliente: el agente nunca recibe el número."
      }
    },
    {
      "name": "tilopay_list_customer_cards",
      "title": "Listar las tarjetas guardadas de un cliente",
      "description": "Lista las tarjetas que un cliente ya tiene guardadas (tokenizadas) en Tilopay, identificadas por tu correo. Devuelve el token de cada tarjeta, que es lo que necesita tilopay_charge_saved_card para cobrarle. Solo se pueden cobrar tarjetas guardadas con el enlace de este asistente o del MCP. No cobra nada.",
      "group": "tarjetas-guardadas",
      "group_title": "Tarjetas guardadas y cobros masivos",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/tarjetas-guardadas",
      "input": {
        "parameters": [
          {
            "name": "email",
            "type": "string",
            "required": true,
            "description": "Correo del cliente dueño de las tarjetas"
          },
          {
            "name": "currency",
            "type": "string",
            "required": false,
            "description": "Moneda de referencia, ej. CRC o USD. Si se omite se usa la del país del comercio."
          }
        ]
      },
      "output": {
        "structuredContent": "{ cards, count }",
        "description": "cards = tarjetas ya guardadas de ese cliente, con marca, últimos dígitos y su identificador para cobrar; count = cuántas hay. Nunca devuelve el número completo de la tarjeta."
      }
    },
    {
      "name": "tilopay_payment_methods",
      "title": "Métodos de pago disponibles y cuotas",
      "description": "Lista los métodos de pago habilitados para el comercio en el checkout de Tilopay (tarjetas, SINPE Móvil, Yappy, cuotas o tasa cero cuando están activos) y si la cuenta responde en producción o en pruebas. Úsala cuando el comercio pregunte qué puede ofrecerle a su cliente o si tiene cuotas / tasa cero.",
      "group": "tarjetas-guardadas",
      "group_title": "Tarjetas guardadas y cobros masivos",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/tarjetas-guardadas",
      "input": {
        "parameters": [
          {
            "name": "amount",
            "type": "number",
            "required": false,
            "description": "Monto de referencia; algunos métodos y cuotas dependen del monto"
          },
          {
            "name": "currency",
            "type": "string",
            "required": false,
            "description": "Moneda de referencia. Si se omite se usa la del país del comercio."
          },
          {
            "name": "email",
            "type": "string",
            "required": false,
            "description": "Correo del cliente (opcional; solo para ver también tus tarjetas guardadas)"
          }
        ]
      },
      "output": {
        "structuredContent": "{ methods, installments, cards, environment, currency }",
        "description": "methods = métodos de pago habilitados para el comercio; installments = cuotas disponibles cuando el método las admite; cards = tarjetas guardadas del cliente si se envió su correo; environment = production o test."
      }
    },
    {
      "name": "tilopay_charge_saved_card",
      "title": "Cobrar a una tarjeta guardada de un cliente",
      "description": "Cobra un monto a una tarjeta ya guardada (tokenizada) de un cliente. Requiere el correo del cliente y el token de la tarjeta (se obtiene con tilopay_list_customer_cards). Operación sensible: mueve dinero real y requiere segundo factor. Llámela primero sin `confirmation_code`: se envía un código de 6 dígitos al correo del comercio y la respuesta trae `requires_confirmation`. Repita la misma llamada, con los mismos parámetros, agregando `confirmation_code`.",
      "group": "tarjetas-guardadas",
      "group_title": "Tarjetas guardadas y cobros masivos",
      "access": "destructive",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/tarjetas-guardadas",
      "api_endpoint": "POST /api/v1/processRecurrentPayment",
      "input": {
        "parameters": [
          {
            "name": "email",
            "type": "string",
            "required": true,
            "description": "Correo del tarjetahabiente"
          },
          {
            "name": "card",
            "type": "string",
            "required": true,
            "description": "Token de la tarjeta guardada (versión v2)"
          },
          {
            "name": "amount",
            "type": "number",
            "required": true,
            "description": "Monto a cobrar"
          },
          {
            "name": "currency",
            "type": "string",
            "required": false,
            "description": "Moneda del cobro. Si se omite se usa la del país del comercio."
          },
          {
            "name": "order_number",
            "type": "string",
            "required": false,
            "description": "Número de orden; si se omite se genera uno único"
          },
          {
            "name": "capture",
            "type": "boolean",
            "required": false,
            "description": "Capturar de inmediato (por defecto true)"
          },
          {
            "name": "confirmation_code",
            "type": "string",
            "required": false,
            "description": "Código de 6 dígitos recibido por correo para autorizar la operación"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result, approved, orderNumber, currency, receipt_code, receipt_url, receipt_image_url }",
        "description": "Cobra a una tarjeta ya guardada del cliente: approved = si el cobro fue aprobado; orderNumber = número de orden generado; receipt_* = comprobante del cobro cuando se generó. Exige segundo factor por correo."
      }
    },
    {
      "name": "tilopay_remove_saved_card",
      "title": "Eliminar una tarjeta guardada de un cliente",
      "description": "Elimina una tarjeta guardada (token) de un cliente en Tilopay. Operación sensible: requiere segundo factor. Llámela primero sin `confirmation_code` y repítala luego con el código de 6 dígitos que llega al correo del comercio.",
      "group": "tarjetas-guardadas",
      "group_title": "Tarjetas guardadas y cobros masivos",
      "access": "destructive",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/tarjetas-guardadas",
      "api_endpoint": "POST /api/v1/user/card-remove",
      "input": {
        "parameters": [
          {
            "name": "email",
            "type": "string",
            "required": true,
            "description": "Correo del cliente dueño de la tarjeta"
          },
          {
            "name": "token",
            "type": "string",
            "required": true,
            "description": "Token de la tarjeta a eliminar"
          },
          {
            "name": "confirmation_code",
            "type": "string",
            "required": false,
            "description": "Código de 6 dígitos recibido por correo para autorizar la operación"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result }",
        "description": "result = respuesta del API al eliminar la tarjeta guardada del cliente. Exige segundo factor por correo."
      }
    },
    {
      "name": "tilopay_saved_cards_create_payments",
      "title": "Cobrar a tarjetas almacenadas",
      "description": "Crea cobros a afiliados y/o grupos con tarjetas almacenadas en Tilopay. Solo se permiten afiliados cuya tarjeta se guardó con el enlace de este asistente o del MCP (tilopay_tokenize_card); los demás se rechazan. Operación sensible: afecta dinero real y requiere segundo factor. Llámela primero sin `confirmation_code`: se envía un código de 6 dígitos al correo del comercio y la respuesta trae `requires_confirmation`. Repita la misma llamada, con los mismos parámetros, agregando `confirmation_code`.",
      "group": "tarjetas-guardadas",
      "group_title": "Tarjetas guardadas y cobros masivos",
      "access": "destructive",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/tarjetas-guardadas",
      "input": {
        "parameters": [
          {
            "name": "reason",
            "type": "string",
            "required": true,
            "description": "Motivo del cobro, ej. \"Cobro mensualidad\""
          },
          {
            "name": "capture",
            "type": "boolean",
            "required": false,
            "description": "Capturar de inmediato (por defecto true)"
          },
          {
            "name": "users",
            "type": "array<object>",
            "required": false,
            "description": "Afiliados individuales a cobrar"
          },
          {
            "name": "groups",
            "type": "array<object>",
            "required": false,
            "description": "Grupos a cobrar"
          },
          {
            "name": "confirmation_code",
            "type": "string",
            "required": false,
            "description": "Código de 6 dígitos recibido por correo para autorizar la operación"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result }",
        "description": "Respuesta cruda del API de Tilopay bajo la llave `result`."
      }
    },
    {
      "name": "tilopay_settlement_balance",
      "title": "Próxima liquidación y balance por liquidar",
      "description": "Dato OFICIAL de Tilopay: fecha del próximo depósito (next_settlement), frecuencia de liquidación, cuenta IBAN destino y, por moneda, el balance acumulado pendiente con su desglose (subtotal, commission, iva_commission, retention, retention_iva, cost, iva_tilopay, transfer, transfer_iva, total neto). Úsala para «¿cuándo me depositan?», «¿cuánto me van a liquidar?», «¿cuánto me cobran de comisión?».",
      "group": "liquidaciones",
      "group_title": "Liquidaciones, depósitos y facturación",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/liquidaciones",
      "input": {
        "parameters": []
      },
      "output": {}
    },
    {
      "name": "tilopay_settlements_list",
      "title": "Historial de liquidaciones",
      "description": "Liquidaciones ya procesadas por Tilopay: fecha de depósito (date_to_report), periodo, monto bruto, deducciones y total transferido. Úsala para «¿ya me depositaron lo del viernes?» o «¿cuánto me depositaron el mes pasado?».",
      "group": "liquidaciones",
      "group_title": "Liquidaciones, depósitos y facturación",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/liquidaciones",
      "input": {
        "parameters": [
          {
            "name": "page",
            "type": "integer",
            "required": false,
            "description": "Página (por defecto 1)"
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Registros por página (por defecto 20)"
          },
          {
            "name": "search",
            "type": "string",
            "required": false,
            "description": "Texto a buscar"
          }
        ]
      },
      "output": {}
    },
    {
      "name": "tilopay_settlement_transactions",
      "title": "Transacciones de una liquidación",
      "description": "Transacciones incluidas en una liquidación ya procesada (id obtenido de tilopay_settlements_list).",
      "group": "liquidaciones",
      "group_title": "Liquidaciones, depósitos y facturación",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/liquidaciones",
      "input": {
        "parameters": [
          {
            "name": "settlement_id",
            "type": "string",
            "required": true,
            "description": "Id de la liquidación"
          }
        ]
      },
      "output": {}
    },
    {
      "name": "tilopay_deposits_list",
      "title": "Depósitos de garantía (preautorizaciones)",
      "description": "Depósitos de garantía o preautorizaciones retenidas a clientes (renta de autos, hotelería, depósitos de seguridad): monto, estado y vencimiento. No confundir con liquidaciones.",
      "group": "liquidaciones",
      "group_title": "Liquidaciones, depósitos y facturación",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/liquidaciones",
      "input": {
        "parameters": [
          {
            "name": "page",
            "type": "integer",
            "required": false,
            "description": "Página (por defecto 1)"
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Registros por página (por defecto 20)"
          },
          {
            "name": "search",
            "type": "string",
            "required": false,
            "description": "Texto a buscar"
          }
        ]
      },
      "output": {}
    },
    {
      "name": "tilopay_deposit_detail",
      "title": "Detalle de un depósito de garantía",
      "description": "Detalle de un depósito de garantía (id de tilopay_deposits_list).",
      "group": "liquidaciones",
      "group_title": "Liquidaciones, depósitos y facturación",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/liquidaciones",
      "input": {
        "parameters": [
          {
            "name": "deposit_id",
            "type": "string",
            "required": true,
            "description": "Id del depósito"
          }
        ]
      },
      "output": {}
    },
    {
      "name": "tilopay_deposit_extend",
      "title": "Extender un depósito de garantía",
      "description": "Extiende la vigencia de la autorización de un depósito de garantía. Requiere el código de seis dígitos que llega por correo.",
      "group": "liquidaciones",
      "group_title": "Liquidaciones, depósitos y facturación",
      "access": "write",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/liquidaciones",
      "input": {
        "parameters": [
          {
            "name": "deposit_id",
            "type": "string",
            "required": true,
            "description": "Id del depósito"
          }
        ]
      },
      "output": {}
    },
    {
      "name": "tilopay_billing_list",
      "title": "Facturas del servicio Tilopay",
      "description": "Facturas que Tilopay le emite al comercio por el uso de la plataforma (no son ventas del comercio). Úsala para «¿cuánto me cobró Tilopay este mes?» o «¿dónde está mi factura de Tilopay?».",
      "group": "liquidaciones",
      "group_title": "Liquidaciones, depósitos y facturación",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/liquidaciones",
      "input": {
        "parameters": [
          {
            "name": "page",
            "type": "integer",
            "required": false,
            "description": "Página (por defecto 1)"
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Registros por página (por defecto 20)"
          },
          {
            "name": "search",
            "type": "string",
            "required": false,
            "description": "Texto a buscar"
          }
        ]
      },
      "output": {}
    },
    {
      "name": "tilopay_switch_commerce",
      "title": "Comercio seleccionado",
      "description": "Muestra el comercio activo de la cuenta de Tilopay vinculada y permite cambiarlo cuando la cuenta tiene varios.",
      "group": "cuenta",
      "group_title": "Cuenta, comercio y equipo",
      "access": "write",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/cuenta",
      "input": {
        "parameters": [
          {
            "name": "commerce_id",
            "type": "string",
            "required": false,
            "description": "Comercio que se quiere activar. Si se omite, solo se muestra el actual."
          }
        ]
      },
      "output": {}
    },
    {
      "name": "tilopay_unlink_account",
      "title": "Desvincular mi cuenta",
      "description": "Desvincula la cuenta de Tilopay del asistente: revoca TODO el acceso (WhatsApp, Claude y otras aplicaciones), borra las claves guardadas (incluidas las del banco) y cierra las sesiones bancarias. Antes de llamarla con confirm=true, repítele al comercio ese alcance y pide confirmación. Úsela cuando el comercio pida desvincular, desconectar o quitar tu cuenta del asistente.",
      "group": "cuenta",
      "group_title": "Cuenta, comercio y equipo",
      "access": "destructive",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/cuenta",
      "input": {
        "parameters": [
          {
            "name": "confirm",
            "type": "boolean",
            "required": true,
            "description": "Debe ser true: el comercio confirmó que quiere desvincular tu cuenta."
          },
          {
            "name": "all_channels",
            "type": "boolean",
            "required": false,
            "description": "true solo si el comercio pidió expresamente desvincular también el otro canal (WhatsApp y clientes MCP)."
          }
        ]
      },
      "output": {}
    },
    {
      "name": "tilopay_send_link_flow",
      "title": "Vincular mi cuenta",
      "description": "Envía al WhatsApp del comercio el botón para vincular (o volver a vincular) tu cuenta de Tilopay con el asistente. Úsela ante cualquier petición de vincular, conectar o activar el asistente con la cuenta de Tilopay.",
      "group": "cuenta",
      "group_title": "Cuenta, comercio y equipo",
      "access": "write",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/cuenta",
      "input": {
        "parameters": []
      },
      "output": {}
    },
    {
      "name": "tilopay_invite_employee",
      "title": "Dar acceso a un empleado",
      "description": "Invita a un empleado a usar el asistente con su propio usuario de Tilopay (solo el dueño). Pide nombre y teléfono de WhatsApp del empleado. Devuelve un enlace wa.me para que el dueño le envíe la invitación. En tu respuesta, repite primero la línea `prerequisito` tal cual y luego entrega el enlace. El empleado puede consultar ventas, crear cobros y enviar comprobantes; no puede reembolsar, cobrar tarjetas guardadas, crear o borrar productos, cambiar precios ni cambiar la configuración.",
      "group": "cuenta",
      "group_title": "Cuenta, comercio y equipo",
      "access": "write",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/cuenta",
      "input": {
        "parameters": [
          {
            "name": "name",
            "type": "string",
            "required": true,
            "description": "Nombre del empleado"
          },
          {
            "name": "phone",
            "type": "string",
            "required": true,
            "description": "WhatsApp del empleado, ej. 8888-8888"
          }
        ]
      },
      "output": {}
    },
    {
      "name": "tilopay_list_employees",
      "title": "Ver mis empleados",
      "description": "Lista los empleados con acceso al asistente y las invitaciones pendientes (solo el dueño).",
      "group": "cuenta",
      "group_title": "Cuenta, comercio y equipo",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/cuenta",
      "input": {
        "parameters": []
      },
      "output": {}
    },
    {
      "name": "tilopay_remove_employee",
      "title": "Quitar acceso a un empleado",
      "description": "Quita el acceso de un empleado al asistente (solo el dueño): revoca toda su sesión, o cancela la invitación si no se había vinculado. Antes de llamarla con confirm=true, confirma con el dueño a quién se quita.",
      "group": "cuenta",
      "group_title": "Cuenta, comercio y equipo",
      "access": "destructive",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/cuenta",
      "input": {
        "parameters": [
          {
            "name": "name",
            "type": "string",
            "required": false,
            "description": "Nombre del empleado"
          },
          {
            "name": "phone",
            "type": "string",
            "required": false,
            "description": "Teléfono del empleado"
          },
          {
            "name": "confirm",
            "type": "boolean",
            "required": true,
            "description": "true: el dueño confirmó quitarle el acceso"
          }
        ]
      },
      "output": {}
    },
    {
      "name": "tilopay_accepted_payment_methods",
      "title": "Métodos de pago y monedas habilitados",
      "description": "Métodos de pago que el comercio tiene habilitados en Tilopay (marcas de tarjeta, SINPE, etc.), monedas configuradas y configuración PayFac. Úsala para «¿qué tarjetas acepto?», «¿tengo SINPE activo?», «¿puedo cobrar en dólares?».",
      "group": "cuenta",
      "group_title": "Cuenta, comercio y equipo",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/cuenta",
      "input": {
        "parameters": []
      },
      "output": {}
    },
    {
      "name": "tilopay_panel_users",
      "title": "Usuarios del panel de Tilopay",
      "description": "Usuarios que tienen acceso al panel web de Tilopay del comercio y sus módulos. Distinto de los empleados del asistente (tilopay_list_employees).",
      "group": "cuenta",
      "group_title": "Cuenta, comercio y equipo",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/cuenta",
      "input": {
        "parameters": [
          {
            "name": "page",
            "type": "integer",
            "required": false,
            "description": "Página (por defecto 1)"
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Registros por página (por defecto 20)"
          },
          {
            "name": "search",
            "type": "string",
            "required": false,
            "description": "Texto a buscar"
          }
        ]
      },
      "output": {}
    },
    {
      "name": "tilopay_diagnostics",
      "title": "Diagnóstico de conexión con Tilopay",
      "description": "Verifica las credenciales del usuario y prueba un endpoint de cada grupo (ventas/transacciones, catálogo, recurrentes, tarjetas almacenadas). Úsalo cuando una herramienta falle para saber qué parte del API responde.",
      "group": "soporte",
      "group_title": "Soporte y diagnóstico",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/soporte",
      "input": {
        "parameters": [
          {
            "name": "environment",
            "type": "string",
            "required": false,
            "description": "Ambiente para la prueba de transacciones (por defecto production)",
            "enum": [
              "production",
              "test"
            ]
          }
        ]
      },
      "output": {
        "structuredContent": "{ checks, failed }",
        "description": "checks es una lista con check, ok y detail por cada prueba: credenciales, transacciones, catálogo, recurrentes y tarjetas almacenadas. failed es la cantidad de pruebas con error. Las credenciales se devuelven enmascaradas."
      }
    },
    {
      "name": "tilopay_help_guides",
      "title": "Ayuda con las guías y tutoriales de Tilopay",
      "description": "Responde dudas de uso del panel de Tilopay (links de pago, catálogo, suscripciones, depósitos de garantía, reembolsos, API/SDK) usando las guías oficiales de tilopay.com/guias. Devuelve extractos y los enlaces a las guías.",
      "group": "soporte",
      "group_title": "Soporte y diagnóstico",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/soporte",
      "input": {
        "parameters": [
          {
            "name": "question",
            "type": "string",
            "required": true,
            "description": "Pregunta del comercio, tal como la escribió"
          }
        ]
      },
      "output": {
        "structuredContent": "{ articles }",
        "description": "Hasta 3 artículos con title, url y excerpt, tomados de tilopay.com/guias. Si no hay coincidencia devuelve articles vacío y un texto con las guías disponibles."
      }
    },
    {
      "name": "tilopay_debug_code",
      "title": "Depurar código",
      "description": "Analiza un fragmento de código o stack trace que envía el usuario y devuelve diagnóstico, causa raíz, corrección concreta y riesgos. No lee repositorios ni ejecuta código.",
      "group": "soporte",
      "group_title": "Soporte y diagnóstico",
      "access": "read",
      "availability": "default",
      "documentation": "https://tilopay.com/developers/agentes/mcp/soporte",
      "input": {
        "parameters": [
          {
            "name": "code",
            "type": "string",
            "required": true,
            "description": "Fragmento de código, log o stack trace tal como lo envió el usuario"
          },
          {
            "name": "error",
            "type": "string",
            "required": false,
            "description": "Mensaje de error o comportamiento observado, si lo hay"
          },
          {
            "name": "language",
            "type": "string",
            "required": false,
            "description": "Lenguaje o stack (ej. typescript, php, react). Si no se indica, se detecta"
          },
          {
            "name": "context",
            "type": "string",
            "required": false,
            "description": "Qué debería hacer el código o en qué momento falla"
          }
        ]
      },
      "output": {
        "structuredContent": "{ report, truncated, redacted, model }",
        "description": "report es el diagnóstico en texto (diagnóstico, causa raíz, corrección y riesgos). truncated indica si el código se recortó a 12.000 caracteres; redacted, si se ocultaron posibles credenciales antes del análisis; model, el modelo usado. No lee repositorios ni ejecuta el código."
      }
    },
    {
      "name": "baas_list_assignments",
      "title": "Contextos (assignments) del API BaaS",
      "description": "Lista los contextos tenant/cuenta (assignments) disponibles para las credenciales BaaS del usuario. Úsalo cuando otra herramienta pida assignmentId.",
      "group": "api-bancario",
      "group_title": "Herramientas bancarias",
      "access": "read",
      "availability": "on-request",
      "requires": "baas-credentials",
      "requires_note": "Credenciales del API bancario de Tilopay registradas por Tilopay para ese usuario.",
      "documentation": "https://tilopay.com/developers/agentes/mcp/api-bancario/otras-operaciones",
      "input": {
        "parameters": []
      },
      "output": {
        "structuredContent": "{ assignments[] }",
        "description": "assignments = contextos disponibles con assignment_id, tenant_code, owner_type, country_code y status."
      }
    },
    {
      "name": "baas_diagnostics",
      "title": "Diagnóstico del API BaaS",
      "description": "Verifica las credenciales BaaS del usuario, el login, el intercambio de token y el acceso a cuentas. Úsalo cuando una consulta BaaS falle.",
      "group": "api-bancario",
      "group_title": "Herramientas bancarias",
      "access": "read",
      "availability": "on-request",
      "requires": "baas-credentials",
      "requires_note": "Credenciales del API bancario de Tilopay registradas por Tilopay para ese usuario.",
      "documentation": "https://tilopay.com/developers/agentes/mcp/api-bancario/otras-operaciones",
      "input": {
        "parameters": [
          {
            "name": "assignmentId",
            "type": "string",
            "required": false,
            "description": "Contexto a probar (opcional)"
          }
        ]
      },
      "output": {
        "structuredContent": "{ checks[], failed }",
        "description": "checks = una fila por verificación (credenciales, login + assignments, cuentas) con ok y detalle; failed = cuántas fallaron. El correo de la credencial se devuelve enmascarado."
      }
    },
    {
      "name": "baas_list_accounts",
      "title": "Listar cuentas BaaS",
      "description": "Lista las cuentas accesibles del API BaaS (sin saldos): tipo de identificador, valor y moneda.",
      "group": "api-bancario",
      "group_title": "Herramientas bancarias",
      "access": "read",
      "availability": "on-request",
      "requires": "baas-credentials",
      "requires_note": "Credenciales del API bancario de Tilopay registradas por Tilopay para ese usuario.",
      "documentation": "https://tilopay.com/developers/agentes/mcp/api-bancario/otras-operaciones",
      "api_endpoint": "GET /api/public/v1/accounts",
      "input": {
        "parameters": [
          {
            "name": "accountType",
            "type": "string",
            "required": false,
            "description": "Filtro por esquema (IBAN)"
          },
          {
            "name": "accountValue",
            "type": "string",
            "required": false,
            "description": "Filtro por identificador"
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false
          },
          {
            "name": "offset",
            "type": "integer",
            "required": false,
            "description": "Desplazamiento de paginación"
          },
          {
            "name": "assignmentId",
            "type": "string",
            "required": false,
            "description": "Contexto BaaS (opcional)"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result }",
        "description": "result = respuesta del API bancario tal cual."
      }
    },
    {
      "name": "baas_list_balances",
      "title": "Saldos de las cuentas BaaS",
      "description": "Lista los saldos en tiempo real de las cuentas accesibles del API BaaS (cuenta, montos y fecha de corte).",
      "group": "api-bancario",
      "group_title": "Herramientas bancarias",
      "access": "read",
      "availability": "on-request",
      "requires": "baas-credentials",
      "requires_note": "Credenciales del API bancario de Tilopay registradas por Tilopay para ese usuario.",
      "documentation": "https://tilopay.com/developers/agentes/mcp/api-bancario/list-balances",
      "api_endpoint": "GET /api/public/v1/accounts/balances",
      "input": {
        "parameters": [
          {
            "name": "accountType",
            "type": "string",
            "required": false,
            "description": "Filtro por esquema (IBAN)"
          },
          {
            "name": "accountValue",
            "type": "string",
            "required": false,
            "description": "Filtro por identificador"
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false
          },
          {
            "name": "offset",
            "type": "integer",
            "required": false,
            "description": "Desplazamiento de paginación"
          },
          {
            "name": "assignmentId",
            "type": "string",
            "required": false,
            "description": "Contexto BaaS (opcional)"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result }",
        "description": "result = respuesta del API bancario tal cual."
      }
    },
    {
      "name": "baas_get_balance",
      "title": "Saldo de una cuenta BaaS",
      "description": "Obtiene el saldo actual de una cuenta BaaS identificada por IBAN.",
      "group": "api-bancario",
      "group_title": "Herramientas bancarias",
      "access": "read",
      "availability": "on-request",
      "requires": "baas-credentials",
      "requires_note": "Credenciales del API bancario de Tilopay registradas por Tilopay para ese usuario.",
      "documentation": "https://tilopay.com/developers/agentes/mcp/api-bancario/otras-operaciones",
      "api_endpoint": "GET /api/public/v1/accounts/balance",
      "input": {
        "parameters": [
          {
            "name": "currency",
            "type": "string",
            "required": false,
            "description": "Moneda de la cuenta (CRC o USD)"
          },
          {
            "name": "accountIndex",
            "type": "integer",
            "required": false,
            "description": "Número de la cuenta en la lista"
          },
          {
            "name": "accountValue",
            "type": "string",
            "required": false,
            "description": "Solo si una herramienta ya lo devolvió. No escribe números de cuenta de memoria: indica la moneda (CRC/USD) o el número de la cuenta en la lista; el sistema resuelve el IBAN real."
          },
          {
            "name": "assignmentId",
            "type": "string",
            "required": false,
            "description": "Contexto BaaS (opcional)"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result }",
        "description": "result = respuesta del API bancario tal cual."
      }
    },
    {
      "name": "baas_get_account_number",
      "title": "Número de cuenta completo del comercio",
      "description": "Muestra el IBAN COMPLETO de una cuenta propia del comercio. Úsala SOLO cuando el comercio pide explícitamente tu número de cuenta (por ejemplo para dárselo a un cliente o proveedor) y con confirm=true. Queda registrada en la auditoría. En cualquier otra respuesta se usa el número enmascarado.",
      "group": "api-bancario",
      "group_title": "Herramientas bancarias",
      "access": "read",
      "availability": "on-request",
      "requires": "baas-credentials",
      "requires_note": "Credenciales del API bancario de Tilopay registradas por Tilopay para ese usuario.",
      "documentation": "https://tilopay.com/developers/agentes/mcp/api-bancario/otras-operaciones",
      "input": {
        "parameters": [
          {
            "name": "confirm",
            "type": "boolean",
            "required": true,
            "description": "true solo si el comercio pidió explícitamente tu número de cuenta completo"
          },
          {
            "name": "currency",
            "type": "string",
            "required": false,
            "description": "Moneda de la cuenta (CRC o USD)"
          },
          {
            "name": "accountIndex",
            "type": "integer",
            "required": false,
            "description": "Número de la cuenta en la lista"
          },
          {
            "name": "assignmentId",
            "type": "string",
            "required": false,
            "description": "Contexto BaaS (opcional)"
          }
        ]
      },
      "output": {}
    },
    {
      "name": "baas_list_payments",
      "title": "Listar pagos BaaS",
      "description": "Consulta (solo lectura) los movimientos/pagos de una cuenta bancaria propia. Indica la moneda (CRC/USD) o el número de cuenta de la lista: no escribe el IBAN. Filtros de fecha, estado, moneda, método y dirección, con paginación por cursor.",
      "group": "api-bancario",
      "group_title": "Herramientas bancarias",
      "access": "read",
      "availability": "on-request",
      "requires": "baas-credentials",
      "requires_note": "Credenciales del API bancario de Tilopay registradas por Tilopay para ese usuario.",
      "documentation": "https://tilopay.com/developers/agentes/mcp/api-bancario/list-payments",
      "api_endpoint": "GET /api/public/v1/transactions/payments",
      "input": {
        "parameters": [
          {
            "name": "currency",
            "type": "string",
            "required": false,
            "description": "Moneda de la cuenta a consultar (CRC o USD). Forma recomendada."
          },
          {
            "name": "accountIndex",
            "type": "integer",
            "required": false,
            "description": "Número de la cuenta en la lista de cuentas del usuario"
          },
          {
            "name": "accountValue",
            "type": "string",
            "required": false,
            "description": "Solo si una herramienta ya lo devolvió. No escribe números de cuenta de memoria: indica la moneda (CRC/USD) o el número de la cuenta en la lista; el sistema resuelve el IBAN real."
          },
          {
            "name": "assignmentId",
            "type": "string",
            "required": false,
            "description": "Contexto BaaS (opcional)"
          },
          {
            "name": "dateFrom",
            "type": "string",
            "required": false,
            "description": "Desde, RFC 3339 (2026-01-01T00:00:00Z)"
          },
          {
            "name": "dateTo",
            "type": "string",
            "required": false,
            "description": "Hasta, RFC 3339"
          },
          {
            "name": "status",
            "type": "string",
            "required": false,
            "description": "Estado público del pago",
            "enum": [
              "pending",
              "processing",
              "confirmed",
              "posted",
              "failed"
            ]
          },
          {
            "name": "paymentMethodCode",
            "type": "string",
            "required": false,
            "enum": [
              "PIN",
              "SINPE_MOVIL"
            ]
          },
          {
            "name": "direction",
            "type": "string",
            "required": false,
            "description": "OUT = envío, IN = recibido",
            "enum": [
              "OUT",
              "IN"
            ]
          },
          {
            "name": "clientReference",
            "type": "string",
            "required": false,
            "description": "Referencia del comercio"
          },
          {
            "name": "limit",
            "type": "integer",
            "required": false,
            "description": "Tamaño de página (máx 50)"
          },
          {
            "name": "cursor",
            "type": "string",
            "required": false,
            "description": "Cursor de la página anterior"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result }",
        "description": "result = respuesta del API bancario tal cual, con su cursor de paginación."
      }
    },
    {
      "name": "baas_search_payment",
      "title": "Buscar un pago BaaS",
      "description": "Busca un pago BaaS dentro de una cuenta por exactamente uno de: paymentId (UUID), publicId (número) o clientReference. Identificadores solo de datos que una herramienta ya devolvió.",
      "group": "api-bancario",
      "group_title": "Herramientas bancarias",
      "access": "read",
      "availability": "on-request",
      "requires": "baas-credentials",
      "requires_note": "Credenciales del API bancario de Tilopay registradas por Tilopay para ese usuario.",
      "documentation": "https://tilopay.com/developers/agentes/mcp/api-bancario/search-payment",
      "api_endpoint": "POST /api/public/v1/transactions/payments/search",
      "input": {
        "parameters": [
          {
            "name": "currency",
            "type": "string",
            "required": false,
            "description": "Moneda de la cuenta a consultar (CRC o USD). Forma recomendada."
          },
          {
            "name": "accountIndex",
            "type": "integer",
            "required": false,
            "description": "Número de la cuenta en la lista de cuentas del usuario"
          },
          {
            "name": "accountValue",
            "type": "string",
            "required": false,
            "description": "Solo si una herramienta ya lo devolvió. No escribe números de cuenta de memoria: indica la moneda (CRC/USD) o el número de la cuenta en la lista; el sistema resuelve el IBAN real."
          },
          {
            "name": "assignmentId",
            "type": "string",
            "required": false,
            "description": "Contexto BaaS (opcional)"
          },
          {
            "name": "paymentId",
            "type": "string",
            "required": false,
            "description": "UUID interno del pago"
          },
          {
            "name": "publicId",
            "type": "string",
            "required": false,
            "description": "Identificador público numérico"
          },
          {
            "name": "clientReference",
            "type": "string",
            "required": false,
            "description": "Referencia del comercio"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result }",
        "description": "result = respuesta del API bancario tal cual."
      }
    },
    {
      "name": "baas_get_payment",
      "title": "Detalle de un pago BaaS",
      "description": "Obtiene el detalle de un pago BaaS por su UUID interno (solo lectura). Usa únicamente identificadores que otra herramienta devolvió en este mismo turno.",
      "group": "api-bancario",
      "group_title": "Herramientas bancarias",
      "access": "read",
      "availability": "on-request",
      "requires": "baas-credentials",
      "requires_note": "Credenciales del API bancario de Tilopay registradas por Tilopay para ese usuario.",
      "documentation": "https://tilopay.com/developers/agentes/mcp/api-bancario/get-payment",
      "api_endpoint": "GET /api/public/v1/transactions/payments/{payment_id}",
      "input": {
        "parameters": [
          {
            "name": "paymentId",
            "type": "string",
            "required": true,
            "description": "UUID interno del pago"
          },
          {
            "name": "assignmentId",
            "type": "string",
            "required": false,
            "description": "Contexto BaaS (opcional)"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result }",
        "description": "result = respuesta del API bancario tal cual."
      }
    },
    {
      "name": "baas_request_statement",
      "title": "Solicitar estado de cuenta BaaS",
      "description": "Solicita la generación de un estado de cuenta (rango máximo 60 días) para una cuenta BaaS. No mueve dinero: solo genera un documento de consulta. Devuelve request_id y status PENDING.",
      "group": "api-bancario",
      "group_title": "Herramientas bancarias",
      "access": "write",
      "availability": "on-request",
      "requires": "baas-credentials",
      "requires_note": "Credenciales del API bancario de Tilopay registradas por Tilopay para ese usuario.",
      "documentation": "https://tilopay.com/developers/agentes/mcp/api-bancario/request-statement",
      "api_endpoint": "POST /api/public/v1/accounts/statements",
      "input": {
        "parameters": [
          {
            "name": "currency",
            "type": "string",
            "required": false,
            "description": "Moneda de la cuenta (CRC o USD)"
          },
          {
            "name": "accountIndex",
            "type": "integer",
            "required": false,
            "description": "Número de la cuenta en la lista"
          },
          {
            "name": "accountValue",
            "type": "string",
            "required": false,
            "description": "Solo si una herramienta ya lo devolvió. No escribe números de cuenta de memoria: indica la moneda (CRC/USD) o el número de la cuenta en la lista; el sistema resuelve el IBAN real."
          },
          {
            "name": "dateFrom",
            "type": "string",
            "required": true,
            "description": "Desde, RFC 3339 (2026-01-01T00:00:00Z)"
          },
          {
            "name": "dateTo",
            "type": "string",
            "required": true,
            "description": "Hasta, RFC 3339 (máx 60 días después)"
          },
          {
            "name": "assignmentId",
            "type": "string",
            "required": false,
            "description": "Contexto BaaS (opcional)"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result }",
        "description": "result = respuesta del API bancario con request_id y status. La herramienta solicita el documento sin notificación por correo."
      }
    },
    {
      "name": "baas_get_statement_status",
      "title": "Estado de la solicitud de estado de cuenta",
      "description": "Consulta el estado de una solicitud de estado de cuenta BaaS. Cuando está DONE incluye el enlace de descarga firmado y su vencimiento.",
      "group": "api-bancario",
      "group_title": "Herramientas bancarias",
      "access": "read",
      "availability": "on-request",
      "requires": "baas-credentials",
      "requires_note": "Credenciales del API bancario de Tilopay registradas por Tilopay para ese usuario.",
      "documentation": "https://tilopay.com/developers/agentes/mcp/api-bancario/otras-operaciones",
      "api_endpoint": "GET /api/public/v1/accounts/statements/{request_id}",
      "input": {
        "parameters": [
          {
            "name": "requestId",
            "type": "string",
            "required": true,
            "description": "request_id devuelto al solicitarlo"
          },
          {
            "name": "assignmentId",
            "type": "string",
            "required": false,
            "description": "Contexto BaaS (opcional)"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result }",
        "description": "result = respuesta del API bancario tal cual."
      }
    },
    {
      "name": "baas_analyze_payments",
      "title": "Analista de pagos BaaS",
      "description": "Analiza (solo lectura) los pagos BaaS de una cuenta en un rango de fechas y devuelve un informe en lenguaje natural: éxito, fallas, reversiones, montos netos y recomendaciones verificables.",
      "group": "api-bancario",
      "group_title": "Herramientas bancarias",
      "access": "read",
      "availability": "on-request",
      "requires": "baas-credentials",
      "requires_note": "Credenciales del API bancario de Tilopay registradas por Tilopay para ese usuario.",
      "documentation": "https://tilopay.com/developers/agentes/mcp/api-bancario/analyze-payments",
      "input": {
        "parameters": [
          {
            "name": "accountIndex",
            "type": "integer",
            "required": false,
            "description": "Número de la cuenta en la lista"
          },
          {
            "name": "accountValue",
            "type": "string",
            "required": false,
            "description": "Solo si una herramienta ya lo devolvió. No escribe números de cuenta de memoria: indica la moneda (CRC/USD) o el número de la cuenta en la lista; el sistema resuelve el IBAN real."
          },
          {
            "name": "dateFrom",
            "type": "string",
            "required": true,
            "description": "Desde, RFC 3339"
          },
          {
            "name": "dateTo",
            "type": "string",
            "required": true,
            "description": "Hasta, RFC 3339"
          },
          {
            "name": "currency",
            "type": "string",
            "required": false,
            "description": "Moneda ISO 4217"
          },
          {
            "name": "direction",
            "type": "string",
            "required": false,
            "enum": [
              "OUT",
              "IN"
            ]
          },
          {
            "name": "question",
            "type": "string",
            "required": false,
            "description": "Enfoque específico del análisis"
          },
          {
            "name": "maxItems",
            "type": "integer",
            "required": false,
            "description": "Máximo de pagos (por defecto 300)"
          },
          {
            "name": "assignmentId",
            "type": "string",
            "required": false,
            "description": "Contexto BaaS (opcional)"
          }
        ]
      },
      "output": {
        "structuredContent": "{ summary }",
        "description": "summary trae account, range, totals {count, succeeded, failed, reversed, pending, successRate}, byCurrency con succeededAmount, reversedAmount, netAmount y averageTicket, failureReasons y sample. El informe redactado viene en el texto. Si no hay pagos en el rango, avisa y no analiza."
      }
    },
    {
      "name": "baas_validate_destination",
      "title": "Validar cuenta destino BaaS",
      "description": "Valida una cuenta destino antes de transferir: PHONE para SINPE Móvil o IBAN para transferencia a cuenta. Devuelve el nombre del titular que el banco confirma.",
      "group": "api-bancario",
      "group_title": "Herramientas bancarias",
      "access": "read",
      "availability": "on-request",
      "requires": "baas-credentials",
      "requires_note": "Credenciales del API bancario de Tilopay registradas por Tilopay para ese usuario.",
      "documentation": "https://tilopay.com/developers/agentes/mcp/api-bancario/validate-destination",
      "api_endpoint": "POST /api/public/v1/accounts/validate",
      "input": {
        "parameters": [
          {
            "name": "accountType",
            "type": "string",
            "required": true,
            "description": "Esquema del identificador: PHONE para SINPE Móvil, IBAN para cuenta.",
            "enum": [
              "PHONE",
              "IBAN"
            ]
          },
          {
            "name": "accountValue",
            "type": "string",
            "required": true,
            "description": "Número de teléfono E.164 o IBAN"
          },
          {
            "name": "assignmentId",
            "type": "string",
            "required": false,
            "description": "Contexto BaaS (opcional)"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result }",
        "description": "result = datos que devuelve el API bancario sobre la cuenta destino (titular, tipo de cuenta, moneda y estado) antes de enviar una transferencia. No mueve dinero."
      }
    },
    {
      "name": "baas_send_transfer",
      "title": "Enviar transferencia BaaS",
      "description": "Envía una transferencia desde la cuenta bancaria del comercio. Método por defecto: SINPE Móvil (destino por teléfono). Para transferencia a cuenta usa accountType=IBAN. El portal Banca Cliente envía el código de autorización al correo del comercio y aplica sus límites; el comercio responde el código y se confirma con baas_confirm_transfer.",
      "group": "api-bancario",
      "group_title": "Herramientas bancarias",
      "access": "destructive",
      "availability": "on-request",
      "requires": "baas-credentials",
      "requires_note": "Credenciales del API bancario de Tilopay registradas por Tilopay para ese usuario.",
      "documentation": "https://tilopay.com/developers/agentes/mcp/api-bancario/send-transfer",
      "api_endpoint": "POST /api/public/v1/transactions/payments",
      "input": {
        "parameters": [
          {
            "name": "amount",
            "type": "number",
            "required": true,
            "description": "Monto a transferir"
          },
          {
            "name": "currency",
            "type": "string",
            "required": true,
            "description": "Moneda ISO 4217 (CRC, USD)"
          },
          {
            "name": "contactName",
            "type": "string",
            "required": false,
            "description": "Nombre del contacto guardado (busca su teléfono/IBAN)"
          },
          {
            "name": "destinationAccountType",
            "type": "string",
            "required": false,
            "description": "PHONE = SINPE Móvil (por defecto), IBAN = transferencia a cuenta",
            "enum": [
              "PHONE",
              "IBAN"
            ]
          },
          {
            "name": "destinationAccountValue",
            "type": "string",
            "required": false,
            "description": "Teléfono E.164 o IBAN del destino (si no se usa contactName)"
          },
          {
            "name": "destinationName",
            "type": "string",
            "required": false,
            "description": "Nombre del destinatario (si no se valida via contacto)"
          },
          {
            "name": "detailReference",
            "type": "string",
            "required": false,
            "description": "Descripción del pago (si se omite, se genera una)"
          },
          {
            "name": "assignmentId",
            "type": "string",
            "required": false,
            "description": "Contexto BaaS (opcional)"
          },
          {
            "name": "allowDuplicate",
            "type": "boolean",
            "required": false,
            "description": "Solo true cuando el usuario confirmó literalmente que quiere repetir una transferencia idéntica reciente (por ejemplo 'sí, es otra'). Nunca lo pongas por tu cuenta."
          }
        ]
      },
      "output": {
        "structuredContent": "{ result: { payment, clientReference, detailReference, destinationName, destinationAccount } }",
        "description": "Envía una transferencia desde una cuenta BaaS del comercio: payment = el pago creado con su payment_id y estado; clientReference y detailReference = referencias para conciliar; destinationName y destinationAccount = a quién y a qué cuenta se envió. Valida la cuenta destino antes y exige código de confirmación por correo."
      }
    },
    {
      "name": "baas_get_transfer_status",
      "title": "Estado de transferencia BaaS",
      "description": "El resultado de una transferencia no se consulta: el banco lo avisa por aquí en cuanto lo tiene (evento del portal).",
      "group": "api-bancario",
      "group_title": "Herramientas bancarias",
      "access": "read",
      "availability": "on-request",
      "requires": "baas-credentials",
      "requires_note": "Credenciales del API bancario de Tilopay registradas por Tilopay para ese usuario.",
      "documentation": "https://tilopay.com/developers/agentes/mcp/api-bancario/get-transfer-status",
      "api_endpoint": "GET /api/public/v1/transactions/payments/{payment_id}",
      "input": {
        "parameters": [
          {
            "name": "paymentId",
            "type": "string",
            "required": false,
            "description": "Identificador del pago (opcional)"
          }
        ]
      },
      "output": {
        "structuredContent": "{ result }",
        "description": "result = estado actual de la transferencia consultada por su payment_id (estado, resultado, monto, moneda, destino y fecha)."
      }
    },
    {
      "name": "baas_confirm_transfer",
      "title": "Autorizar la transferencia pendiente",
      "description": "Autoriza la transferencia pendiente con el código de 6 dígitos que llegó AL CORREO DEL COMERCIO y fue respondido en el chat. Nunca escribas ni repitas el código en la respuesta.",
      "group": "api-bancario",
      "group_title": "Herramientas bancarias",
      "access": "destructive",
      "availability": "on-request",
      "requires": "baas-credentials",
      "requires_note": "Credenciales del API bancario de Tilopay registradas por Tilopay para ese usuario.",
      "documentation": "https://tilopay.com/developers/agentes/mcp/api-bancario/otras-operaciones",
      "input": {
        "parameters": [
          {
            "name": "code",
            "type": "string",
            "required": true,
            "description": "Código de 6 dígitos que respondió el comercio"
          },
          {
            "name": "intentId",
            "type": "string",
            "required": false,
            "description": "Identificador de la intención (si se omite, se usa la pendiente)"
          }
        ]
      },
      "output": {}
    },
    {
      "name": "baas_cancel_transfer",
      "title": "Cancelar la transferencia pendiente",
      "description": "Cancela la transferencia que está esperando el código de autorización. Úsala cuando el comercio diga que no la quiere hacer.",
      "group": "api-bancario",
      "group_title": "Herramientas bancarias",
      "access": "write",
      "availability": "on-request",
      "requires": "baas-credentials",
      "requires_note": "Credenciales del API bancario de Tilopay registradas por Tilopay para ese usuario.",
      "documentation": "https://tilopay.com/developers/agentes/mcp/api-bancario/otras-operaciones",
      "input": {
        "parameters": [
          {
            "name": "intentId",
            "type": "string",
            "required": false,
            "description": "Identificador de la intención (opcional)"
          }
        ]
      },
      "output": {}
    },
    {
      "name": "banca_decide_approval",
      "title": "Aprobar o rechazar una operación pendiente",
      "description": "Aprueba o rechaza una transferencia que quedó en doble control, con el código de 6 dígitos que llegó AL CORREO DEL APROBADOR. Nunca escribas el código en la respuesta.",
      "group": "api-bancario",
      "group_title": "Herramientas bancarias",
      "access": "destructive",
      "availability": "on-request",
      "requires": "baas-credentials",
      "requires_note": "Credenciales del API bancario de Tilopay registradas por Tilopay para ese usuario.",
      "documentation": "https://tilopay.com/developers/agentes/mcp/api-bancario/otras-operaciones",
      "input": {
        "parameters": [
          {
            "name": "decision",
            "type": "string",
            "required": true,
            "description": "Decisión del aprobador",
            "enum": [
              "aprobar",
              "rechazar"
            ]
          },
          {
            "name": "code",
            "type": "string",
            "required": true,
            "description": "Código de 6 dígitos del correo del aprobador"
          },
          {
            "name": "approvalId",
            "type": "string",
            "required": false,
            "description": "Identificador de la aprobación (si se omite, se usa la pendiente)"
          },
          {
            "name": "reason",
            "type": "string",
            "required": false,
            "description": "Motivo del rechazo (opcional)"
          }
        ]
      },
      "output": {}
    },
    {
      "name": "baas_close_session",
      "title": "Cerrar sesión bancaria",
      "description": "Cierra de inmediato la sesión bancaria activa del asistente de WhatsApp.",
      "group": "api-bancario",
      "group_title": "Herramientas bancarias",
      "access": "write",
      "availability": "on-request",
      "requires": "baas-credentials",
      "requires_note": "Credenciales del API bancario de Tilopay registradas por Tilopay para ese usuario.",
      "documentation": "https://tilopay.com/developers/agentes/mcp/api-bancario/otras-operaciones",
      "input": {
        "parameters": []
      },
      "output": {}
    }
  ]
}