- Recupera el trabajo revertido (doble propuesta, retainer, niveles, API Python) desde el stash de GitHub Desktop - Dockerfile multi-stage para Next.js (migraciones automáticas al arrancar, seed opcional via RUN_SEED) - docker-compose.coolify.yml: postgres + web + api con healthchecks y SERVICE_FQDN_* - Endpoint público /api/health (verifica BD) para healthchecks - seed.ts parametrizado: conexión DB_* y credenciales SEED_* por entorno (sin passwords hardcodeadas) - .env.example, .dockerignore, uvicorn con --proxy-headers - Limpieza: .xlsx y __pycache__ fuera del repo Co-Authored-By: Claude Fable 5 <[email protected]>
306 lines
14 KiB
Python
306 lines
14 KiB
Python
"""MCP (Model Context Protocol) tool definitions for the Cotizador API.
|
|
|
|
Each tool is designed to be semantically clear for AI agents like OpenClaw, Claude, and ChatGPT.
|
|
"""
|
|
|
|
TOOLS = [
|
|
{
|
|
"name": "buscar_servicios",
|
|
"description": (
|
|
"Busca servicios del catálogo de marketing digital de Consultoría E3. "
|
|
"Útil cuando el cliente pregunta por servicios disponibles, precios, o por fase del proyecto. "
|
|
"Las fases son: 0=Auditoría (diagnóstico inicial), 1=Setup (infraestructura y configuración), "
|
|
"2=Publicidad (anuncios y manejo de redes), 3=Contenido/SEO (producción de contenido y posicionamiento). "
|
|
"Tipos de pago: 'unico' (pago único) o 'mensual' (recurso recurrente)."
|
|
),
|
|
"inputSchema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"fase": {
|
|
"type": "integer",
|
|
"enum": [0, 1, 2, 3],
|
|
"description": "Fase del proyecto: 0=Auditoría/Acompañamiento, 1=Setup/Infraestructura, 2=Publicidad/Manejo, 3=Contenido/SEO",
|
|
},
|
|
"tipo_pago": {
|
|
"type": "string",
|
|
"enum": ["unico", "mensual"],
|
|
"description": "Tipo de pago: 'unico' para pago único, 'mensual' para recurrente",
|
|
},
|
|
"categoria": {
|
|
"type": "string",
|
|
"description": "Nombre de categoría: SEO, Marketing, Paid Media, Desarrollo Web, Automatizaciones, CRM, Desarrollo Personalizado",
|
|
},
|
|
"busqueda": {
|
|
"type": "string",
|
|
"description": "Texto libre para buscar en nombre y descripción del servicio",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
"name": "crear_cotizacion",
|
|
"description": (
|
|
"Crea una cotización completa de servicios de marketing digital para un cliente. "
|
|
"El cliente se crea automáticamente si no existe (busca por nombre+empresa). "
|
|
"Incluye servicios del catálogo con precios personalizables, plan CRM Bucefalo opcional, "
|
|
"y configuración de moneda y esquema de pago. "
|
|
"La cotización se crea en estado 'borrador'. "
|
|
"Precios CRM Bucefalo: basico=$1,000/mes, estandar=$3,500/mes, premium=$4,500/mes, empresarial=$7,500/mes. "
|
|
"Soporta DOBLE PROPUESTA: con es_doble=true se presentan dos opciones comparables; cada servicio "
|
|
"se asigna a la opción '1', '2' o 'ambas' (compartido), y opciones_metadata define el título, "
|
|
"descripción y exclusiones de cada opción."
|
|
),
|
|
"inputSchema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"cliente": {
|
|
"type": "object",
|
|
"properties": {
|
|
"nombre": {"type": "string", "description": "Nombre completo del contacto"},
|
|
"empresa": {"type": "string", "description": "Nombre de la empresa (opcional)"},
|
|
"email": {"type": "string", "description": "Email de contacto"},
|
|
"telefono": {"type": "string", "description": "Teléfono de contacto"},
|
|
},
|
|
"required": ["nombre"],
|
|
},
|
|
"servicios": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"properties": {
|
|
"servicio_id": {"type": "string", "description": "ID del servicio del catálogo (obtener con buscar_servicios)"},
|
|
"precio_personalizado": {"type": "number", "description": "Precio personalizado (opcional, usa precio base si no se especifica)"},
|
|
"opcion": {"type": "string", "enum": ["1", "2", "ambas"], "description": "Solo en doble propuesta: opción a la que pertenece el servicio ('ambas' = compartido). Default 'ambas'."},
|
|
},
|
|
"required": ["servicio_id"],
|
|
},
|
|
"description": "Lista de servicios a incluir en la cotización",
|
|
},
|
|
"es_doble": {
|
|
"type": "boolean",
|
|
"description": "Si es true, la cotización presenta dos opciones comparables (doble propuesta).",
|
|
},
|
|
"opciones_metadata": {
|
|
"type": "object",
|
|
"description": "Solo en doble propuesta. Metadatos por opción, p.ej. {\"1\": {\"titulo\": \"...\", \"descripcion\": \"...\", \"noIncluye\": \"...\"}, \"2\": {...}}.",
|
|
"properties": {
|
|
"1": {"type": "object", "properties": {"titulo": {"type": "string"}, "descripcion": {"type": "string"}, "noIncluye": {"type": "string"}}},
|
|
"2": {"type": "object", "properties": {"titulo": {"type": "string"}, "descripcion": {"type": "string"}, "noIncluye": {"type": "string"}}},
|
|
},
|
|
},
|
|
"plan_bucefalo": {
|
|
"type": "string",
|
|
"enum": ["basico", "estandar", "premium", "empresarial"],
|
|
"description": "Nivel del plan CRM Bucefalo (opcional)",
|
|
},
|
|
"proyecto": {
|
|
"type": "string",
|
|
"description": "Nombre o descripción del proyecto (default: 'MKT Digital')",
|
|
},
|
|
"moneda": {
|
|
"type": "string",
|
|
"enum": ["MXN", "USD"],
|
|
"description": "Moneda de la cotización (default: MXN)",
|
|
},
|
|
"esquema_pago": {
|
|
"type": "string",
|
|
"enum": ["Pago Unico", "Mensual", "Pago Unico/Mensual"],
|
|
"description": "Esquema de pago (default: Pago Unico/Mensual)",
|
|
},
|
|
},
|
|
"required": ["cliente", "servicios"],
|
|
},
|
|
},
|
|
{
|
|
"name": "obtener_cotizacion",
|
|
"description": (
|
|
"Obtiene los detalles completos de una cotización existente incluyendo: "
|
|
"datos del cliente, servicios seleccionados con precios, estado actual, "
|
|
"plan CRM Bucefalo si aplica, observaciones, fechas y vigencia."
|
|
),
|
|
"inputSchema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"cotizacion_id": {"type": "string", "description": "ID de la cotización"},
|
|
},
|
|
"required": ["cotizacion_id"],
|
|
},
|
|
},
|
|
{
|
|
"name": "listar_cotizaciones",
|
|
"description": (
|
|
"Lista cotizaciones con filtros opcionales. "
|
|
"Útil para revisar el pipeline de ventas, cotizaciones pendientes, o historial de un cliente. "
|
|
"Estados: borrador (en proceso), enviada (esperando respuesta), aprobada (cerrada ganada), rechazada (cerrada perdida)."
|
|
),
|
|
"inputSchema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"estado": {
|
|
"type": "string",
|
|
"enum": ["borrador", "enviada", "aprobada", "rechazada"],
|
|
"description": "Filtrar por estado",
|
|
},
|
|
"cliente_nombre": {
|
|
"type": "string",
|
|
"description": "Buscar por nombre de cliente",
|
|
},
|
|
"busqueda": {
|
|
"type": "string",
|
|
"description": "Texto libre para buscar en número, proyecto o cliente",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
"name": "cambiar_estado_cotizacion",
|
|
"description": (
|
|
"Cambia el estado de una cotización. "
|
|
"Flujo normal: borrador → enviada → aprobada o rechazada. "
|
|
"Solo cambiar a 'enviada' cuando la cotización esté lista para el cliente. "
|
|
"Cambiar a 'aprobada' cuando el cliente acepte, o 'rechazada' cuando decline."
|
|
),
|
|
"inputSchema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"cotizacion_id": {"type": "string", "description": "ID de la cotización"},
|
|
"estado": {
|
|
"type": "string",
|
|
"enum": ["borrador", "enviada", "aprobada", "rechazada"],
|
|
"description": "Nuevo estado de la cotización",
|
|
},
|
|
},
|
|
"required": ["cotizacion_id", "estado"],
|
|
},
|
|
},
|
|
{
|
|
"name": "actualizar_precio_servicio",
|
|
"description": (
|
|
"Actualiza el precio de un servicio específico dentro de una cotización. "
|
|
"No modifica el precio base del catálogo, solo el precio en esta cotización. "
|
|
"Útil para negociar precios individuales sin recrear toda la cotización."
|
|
),
|
|
"inputSchema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"cotizacion_id": {"type": "string", "description": "ID de la cotización"},
|
|
"servicio_id": {"type": "string", "description": "ID del servicio cotizado (no el del catálogo)"},
|
|
"nuevo_precio": {"type": "number", "description": "Nuevo precio en la moneda de la cotización"},
|
|
},
|
|
"required": ["cotizacion_id", "servicio_id", "nuevo_precio"],
|
|
},
|
|
},
|
|
{
|
|
"name": "duplicar_cotizacion",
|
|
"description": (
|
|
"Duplica una cotización existente como nueva copia en estado 'borrador'. "
|
|
"Crea una copia exacta con nuevo ID y número. "
|
|
"Útil para crear variaciones de una propuesta o reenviar una cotización actualizada."
|
|
),
|
|
"inputSchema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"cotizacion_id": {"type": "string", "description": "ID de la cotización a duplicar"},
|
|
},
|
|
"required": ["cotizacion_id"],
|
|
},
|
|
},
|
|
{
|
|
"name": "calcular_financiamiento",
|
|
"description": (
|
|
"Calcula las mensualidades para financiar una cotización o monto específico. "
|
|
"Plazos disponibles: 3 meses (7.7% tasa), 6 meses (10.7%), 9 meses (13.7%), 12 meses (16.7%). "
|
|
"Todos incluyen 2.5% de comisión + 16% IVA. "
|
|
"Devuelve: pago mensual, IVA mensual, total mensual, comisión total, y gran total."
|
|
),
|
|
"inputSchema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"monto": {"type": "number", "description": "Monto total a financiar en MXN"},
|
|
"meses": {"type": "integer", "enum": [3, 6, 9, 12], "description": "Plazo en meses"},
|
|
},
|
|
"required": ["monto", "meses"],
|
|
},
|
|
},
|
|
{
|
|
"name": "generar_pdf_cotizacion",
|
|
"description": (
|
|
"Genera un PDF profesional de una cotización con: logo de la empresa, colores de marca, "
|
|
"tabla de servicios agrupados por fase, bonos incluidos, términos y condiciones, "
|
|
"y datos bancarios para transferencia. Devuelve el archivo PDF."
|
|
),
|
|
"inputSchema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"cotizacion_id": {"type": "string", "description": "ID de la cotización guardada"},
|
|
},
|
|
"required": ["cotizacion_id"],
|
|
},
|
|
},
|
|
{
|
|
"name": "obtener_configuracion",
|
|
"description": (
|
|
"Obtiene la configuración de la empresa Consultoría E3: "
|
|
"razón social, RFC, domicilio fiscal, datos bancarios (cuenta nacional, CLABE, cuenta internacional, SWIFT), "
|
|
"colores de marca, logo, y términos y condiciones. "
|
|
"Útil para generar documentos o verificar información fiscal."
|
|
),
|
|
"inputSchema": {"type": "object", "properties": {}},
|
|
},
|
|
{
|
|
"name": "listar_bonos",
|
|
"description": (
|
|
"Lista los bonos/disponibles que se pueden incluir en una cotización: "
|
|
"1) Servicio Centinela Web (monitoreo 30 min/mes), "
|
|
"2) Workshop Buyer Persona, "
|
|
"3) Workshop Propuesta de Valor, "
|
|
"4) Membresía Premium (1 año), "
|
|
"5) Mes Gratis CRM Bucefalo, "
|
|
"6) Script de Ventas (100+ complementos)."
|
|
),
|
|
"inputSchema": {"type": "object", "properties": {}},
|
|
},
|
|
{
|
|
"name": "listar_planes_bucefalo",
|
|
"description": (
|
|
"Lista los niveles del CRM Bucefalo con precios mensuales: "
|
|
"Básico ($1,000/mes), Estándar ($3,500/mes), Premium ($4,500/mes), Empresarial ($7,500/mes). "
|
|
"Bucefalo es un CRM para gestión de ventas y clientes."
|
|
),
|
|
"inputSchema": {"type": "object", "properties": {}},
|
|
},
|
|
]
|
|
|
|
RESOURCES = [
|
|
{
|
|
"uri": "cotizador://servicios",
|
|
"name": "Catálogo de Servicios",
|
|
"description": (
|
|
"Lista completa de servicios de marketing digital de Consultoría E3 organizados por fase: "
|
|
"Fase 0 (Auditorías), Fase 1 (Setup/Infraestructura), Fase 2 (Publicidad/Manejo), "
|
|
"Fase 3 (Contenido/SEO). Cada servicio incluye nombre, descripción, precio base, "
|
|
"tiempo de entrega, tipo de pago (único/mensual), y entregables."
|
|
),
|
|
"mimeType": "application/json",
|
|
},
|
|
{
|
|
"uri": "cotizador://categorias",
|
|
"name": "Categorías de Servicios",
|
|
"description": (
|
|
"Categorías disponibles para clasificar servicios: "
|
|
"SEO, Marketing, Paid Media, Desarrollo Web, Automatizaciones, CRM, Desarrollo Personalizado."
|
|
),
|
|
"mimeType": "application/json",
|
|
},
|
|
{
|
|
"uri": "cotizador://configuracion",
|
|
"name": "Configuración de la Empresa",
|
|
"description": (
|
|
"Datos fiscales, bancarios y de marca de Consultoría E3. "
|
|
"Incluye razón social, RFC, domicilio fiscal, cuentas bancarias nacionales e internacionales, "
|
|
"colores de marca, logo, y términos y condiciones."
|
|
),
|
|
"mimeType": "application/json",
|
|
},
|
|
]
|