Skip to main content
Glama
janetsep

TreePod Financial MCP Agent

by janetsep

calculate_tariff

Calculate booking tariffs based on season, number of guests, and booking channel using real configuration data from TreePod Financial MCP Agent.

Instructions

Calcula tarifas para reservas según temporada, personas y canal basado en configuración real

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
checkin_dateYes
checkout_dateYes
guestsYes
channelNodirecto

Implementation Reference

  • server.js:62-91 (registration)
    Registration of the 'calculate_tariff' tool with MCP server, including input schema, title, description, and a thin async handler that delegates to businessCalculator.calculateTariff with logging and error handling.
    server.registerTool(
      'calculate_tariff',
      {
        title: 'Calcular tarifa',
        description: 'Calcula tarifas para reservas según temporada, personas y canal basado en configuración real',
        inputSchema: z.object({
          checkin_date: z.string(),
          checkout_date: z.string(),
          guests: z.number().min(1).max(4),
          channel: z.string().optional().default('directo'),
        }),
      },
      async ({ checkin_date, checkout_date, guests, channel = 'directo' }) => {
        validator.log('info', `Iniciando cálculo de tarifa: ${guests} huéspedes, ${checkin_date} a ${checkout_date}, canal ${channel}`);
        
        try {
          // Usar módulo de cálculo sin hardcodeo
          const result = await businessCalculator.calculateTariff(checkin_date, checkout_date, guests, channel);
          
          validator.log('info', 'Cálculo de tarifa completado exitosamente');
          return result;
          
        } catch (error) {
          validator.log('error', `Error crítico en cálculo de tarifa: ${error.message}`);
          return validator.generateInsufficientDataResponse(
            'cálculo de tarifa',
            'Error interno del sistema. Contacta al administrador.'
          );
        }
      }
  • Core implementation of the tariff calculation: validates inputs and dates, loads financial configuration data, determines season, calculates base tariff and commission based on channel, computes total, and formats response.
    async calculateTariff(checkinDate, checkoutDate, guests, channel = 'directo') {
      // Validar parámetros de entrada
      const inputValidation = validator.validateUserInput({
        checkin_date: checkinDate,
        checkout_date: checkoutDate,
        guests: guests,
        channel: channel
      }, {
        checkin_date: { required: true, type: 'string' },
        checkout_date: { required: true, type: 'string' },
        guests: { required: true, type: 'number', min: 1, max: 4 },
        channel: { required: false, type: 'string', enum: ['directo', 'airbnb', 'booking', 'whatsapp'] }
      });
    
      if (!inputValidation.valid) {
        return validator.generateInsufficientDataResponse(
          'parámetros de tarifa', 
          `Errores: ${inputValidation.errors.join(', ')}`
        );
      }
    
      // Validar fechas
      const dateValidation = validator.validateDateRange(checkinDate, checkoutDate);
      if (!dateValidation.valid) {
        return validator.generateInsufficientDataResponse(
          'fechas de reserva',
          dateValidation.error
        );
      }
    
      // Cargar configuración de tarifas desde datos reales
      const financialData = await dataLoader.loadFinancialData();
      if (!financialData || !financialData.configuracion_negocio) {
        return validator.generateInsufficientDataResponse(
          'configuración de tarifas',
          'No se pudo acceder a la configuración de precios del sistema'
        );
      }
    
      const config = financialData.configuracion_negocio;
      
      // Verificar que existen las tarifas por temporada
      if (!config.tarifas_temporada) {
        return validator.generateInsufficientDataResponse(
          'tarifas por temporada',
          'La configuración no incluye tarifas por temporada'
        );
      }
    
      try {
        const season = this.determineSeason(dateValidation.checkin, config);
        const seasonData = config.tarifas_temporada[season];
        
        if (!seasonData) {
          return validator.generateInsufficientDataResponse(
            `tarifas para temporada ${season}`,
            'No se encontraron tarifas para la temporada solicitada'
          );
        }
    
        // Calcular tarifa base según número de huéspedes
        const baseTariff = this.calculateBaseTariff(guests, seasonData);
        const nights = dateValidation.nights;
        const subtotal = baseTariff * nights;
        
        // Calcular comisión según canal
        const commissionRate = this.getCommissionRate(channel, config);
        const commission = Math.round(subtotal * commissionRate);
        const total = subtotal + commission;
    
        validator.log('info', `Tarifa calculada: ${guests} huéspedes, ${nights} noches, temporada ${season}, canal ${channel}`);
    
        return {
          content: [{
            type: 'text',
            text: this.formatTariffResponse({
              checkinDate,
              checkoutDate,
              guests,
              channel,
              season,
              nights,
              baseTariff,
              subtotal,
              commissionRate: commissionRate * 100,
              commission,
              total
            })
          }]
        };
    
      } catch (error) {
        validator.log('error', `Error calculando tarifa: ${error.message}`);
        return validator.generateInsufficientDataResponse(
          'cálculo de tarifa',
          'Error interno en el cálculo. Contacta al administrador.'
        );
      }
    }
  • Helper method to determine the season (alta, media, etc.) for the given check-in date using business configuration or fallback logic.
    determineSeason(date, config) {
      if (!config.temporadas) {
        validator.log('warning', 'Configuración de temporadas no encontrada, usando lógica por defecto');
        // Lógica básica si no hay configuración
        const month = date.getMonth() + 1;
        if (month >= 12 || month <= 2) return 'alta';
        if (month >= 6 && month <= 8) return 'alta';
        return 'media';
      }
    
      // Usar configuración real de temporadas
      const month = date.getMonth() + 1;
      const day = date.getDate();
      
      for (const [seasonName, periods] of Object.entries(config.temporadas)) {
        for (const period of periods) {
          if (this.isDateInPeriod(month, day, period)) {
            return seasonName;
          }
        }
      }
      
      return 'media'; // temporada por defecto
    }
  • Helper method to compute the base nightly tariff based on number of guests and season data configuration.
    calculateBaseTariff(guests, seasonData) {
      if (seasonData.por_huesped && seasonData.tarifa_base_por_persona) {
        return seasonData.tarifa_base_por_persona * guests;
      }
      
      if (seasonData.tarifas_por_ocupacion) {
        const guestKey = `${guests}_personas`;
        return seasonData.tarifas_por_ocupacion[guestKey] || seasonData.tarifa_base || 80000;
      }
      
      return seasonData.tarifa_base || 80000;
    }
  • Helper method to get the commission rate for the booking channel from configuration or defaults.
    getCommissionRate(channel, config) {
      if (!config.comisiones_canal) {
        validator.log('warning', 'Configuración de comisiones no encontrada, usando valores por defecto');
        const defaultRates = {
          'directo': 0,
          'airbnb': 0.15,
          'booking': 0.18,
          'whatsapp': 0.05
        };
        return defaultRates[channel] || 0;
      }
      
      return config.comisiones_canal[channel] || 0;
    }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/janetsep/treepod-financial-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server