analyze_finances
Analyze current TreePod Glamping finances using key metrics from real data to assess business performance and identify trends.
Instructions
Analiza las finanzas actuales de TreePod Glamping con métricas clave basado en datos reales
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| period | No | current |
Implementation Reference
- server.js:29-58 (registration)Registers the analyze_finances tool with the MCP server. Defines input schema (period: string, default 'current') and handler that logs, calls businessCalculator.analyzeFinancialMetrics(period), handles errors with validator.// --- Herramienta: analyze_finances --- // ✅ IMPLEMENTA GUÍA DE TRABAJO FUNDAMENTAL: Sin hardcodeo, validación, trazabilidad server.registerTool( 'analyze_finances', { title: 'Analizar finanzas', description: 'Analiza las finanzas actuales de TreePod Glamping con métricas clave basado en datos reales', inputSchema: z.object({ period: z.string().default('current'), }), }, async ({ period }) => { validator.log('info', `Iniciando análisis financiero para período: ${period}`); try { // Usar módulo de cálculo sin hardcodeo const result = await businessCalculator.analyzeFinancialMetrics(period); validator.log('info', 'Análisis financiero completado exitosamente'); return result; } catch (error) { validator.log('error', `Error crítico en análisis financiero: ${error.message}`); return validator.generateInsufficientDataResponse( 'análisis financiero', 'Error interno del sistema. Contacta al administrador.' ); } } );
- src/business/calculator.js:236-275 (handler)Main handler logic for analyze_finances: Loads financial data from dataLoader.loadFinancialData(), validates essential fields (ingresos_total, gastos_total), computes analysis via calculateFinancialAnalysis, formats output with formatFinancialAnalysis, handles errors.async analyzeFinancialMetrics(period = 'current') { const financialData = await dataLoader.loadFinancialData(); if (!financialData) { return validator.generateInsufficientDataResponse( 'datos financieros', 'No se pudo acceder a los datos financieros del sistema' ); } // Verificar campos esenciales const requiredFields = ['ingresos_total', 'gastos_total']; const missingFields = requiredFields.filter(field => !(field in financialData)); if (missingFields.length > 0) { return validator.generateInsufficientDataResponse( 'métricas financieras', `Faltan datos esenciales: ${missingFields.join(', ')}` ); } try { const analysis = this.calculateFinancialAnalysis(financialData, period); validator.log('info', `Análisis financiero completado para período: ${period}`); return { content: [{ type: 'text', text: this.formatFinancialAnalysis(analysis) }] }; } catch (error) { validator.log('error', `Error en análisis financiero: ${error.message}`); return validator.generateInsufficientDataResponse( 'análisis financiero', 'Error interno en el análisis. Contacta al administrador.' ); } }
- src/business/calculator.js:280-301 (helper)Helper method that computes key financial metrics from loaded data: revenue (ingresos), expenses (gastos), profit (utilidad), margin, occupancy, reservations, average revenue per reservation, and goal achievements.calculateFinancialAnalysis(data, period) { const ingresos = data.ingresos_total || 0; const gastos = data.gastos_total || 0; const utilidad = ingresos - gastos; const margen = ingresos > 0 ? ((utilidad / ingresos) * 100).toFixed(1) : 0; const ocupacion = data.ocupacion_promedio || 0; const reservas = data.reservas_totales || 0; return { periodo: period, ingresos, gastos, utilidad, margen, ocupacion, reservas, ingresoPromedioPorReserva: reservas > 0 ? Math.round(ingresos / reservas) : 0, metaIngresos: ingresos >= 6000000, metaUtilidad: utilidad >= 2000000, metaOcupacion: ocupacion >= 70 }; }
- src/business/calculator.js:306-322 (helper)Helper method that formats the financial analysis into a structured text response with emojis, status indicators, key metrics, and goal achievements.formatFinancialAnalysis(analysis) { const estado = this.determineBusinessStatus(analysis); return `📊 **ANÁLISIS FINANCIERO TREEPOD GLAMPING**\n\n` + `📅 **Período:** ${analysis.periodo}\n` + `💰 **Estado General:** ${estado}\n\n` + `**💵 FINANZAS:**\n` + `• Ingresos: ${this.formatCurrency(analysis.ingresos)} ${analysis.metaIngresos ? '✅' : '⚠️'}\n` + `• Gastos: ${this.formatCurrency(analysis.gastos)}\n` + `• Utilidad: ${this.formatCurrency(analysis.utilidad)} ${analysis.metaUtilidad ? '✅' : '⚠️'}\n` + `• Margen: ${analysis.margen}% ${analysis.margen > 30 ? '✅' : '⚠️'}\n\n` + `**🏠 OPERACIONES:**\n` + `• Ocupación: ${analysis.ocupacion}% ${analysis.metaOcupacion ? '✅' : '⚠️'}\n` + `• Reservas totales: ${analysis.reservas}\n` + `• Ingreso promedio/reserva: ${this.formatCurrency(analysis.ingresoPromedioPorReserva)}\n\n` + `*Análisis basado en datos reales del sistema TreePod*`; }
- server.js:36-38 (schema)Zod input schema for analyze_finances tool: period as string with default 'current'.inputSchema: z.object({ period: z.string().default('current'), }),