check_occupancy
Check current and future occupancy status for TreePod Glamping domes using real-time data to support financial planning and availability management.
Instructions
Verifica estado de ocupación actual y futura de los domos basado en datos reales
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| date_range | No | today |
Implementation Reference
- server.js:96-141 (registration)Registration of the 'check_occupancy' MCP tool, including Zod input schema and async handler wrapper that loads data and delegates to businessCalculator.analyzeOccupancyserver.registerTool( 'check_occupancy', { title: 'Verificar ocupación', description: 'Verifica estado de ocupación actual y futura de los domos basado en datos reales', inputSchema: z.object({ date_range: z.string().default('today'), }), }, async ({ date_range = 'today' }) => { validator.log('info', `Iniciando verificación de ocupación para período: ${date_range}`); try { // Cargar datos reales sin hardcodeo const businessData = await dataLoader.loadBusinessStatus(); const domosStatus = await dataLoader.loadDomosStatus(); // Validar que tenemos datos suficientes if (!businessData && !domosStatus) { return validator.generateInsufficientDataResponse( 'datos de ocupación', 'No se pudo acceder a los datos de estado del negocio ni de domos' ); } if (!domosStatus) { return validator.generateInsufficientDataResponse( 'estado de domos', 'No se pudo acceder al estado actual de los domos' ); } const result = await businessCalculator.analyzeOccupancy(businessData, domosStatus, date_range); validator.log('info', 'Verificación de ocupación completada exitosamente'); return result; } catch (error) { validator.log('error', `Error crítico en verificación de ocupación: ${error.message}`); return validator.generateInsufficientDataResponse( 'verificación de ocupación', 'Error interno del sistema. Contacta al administrador.' ); } } );
- server.js:98-104 (schema)Input schema for check_occupancy tool using Zod: optional date_range string defaulting to 'today'.{ title: 'Verificar ocupación', description: 'Verifica estado de ocupación actual y futura de los domos basado en datos reales', inputSchema: z.object({ date_range: z.string().default('today'), }), },
- src/business/calculator.js:342-382 (handler)Core handler logic for check_occupancy: validates domosStatus array, computes occupancy metrics (available, occupied, maintenance, cleaning, total), logs analysis, and returns formatted MCP text response using formatOccupancyAnalysis.async analyzeOccupancy(businessData, domosStatus, dateRange = 'today') { if (!domosStatus || !Array.isArray(domosStatus)) { return validator.generateInsufficientDataResponse( 'estado de domos', 'Los datos de estado de domos no tienen el formato esperado' ); } try { const periodText = this.getPeriodText(dateRange); const occupancyRate = businessData?.occupancy || 0; // Calcular métricas de ocupación const available = domosStatus.filter(d => d.status === 'available').length; const occupied = domosStatus.filter(d => d.status === 'occupied').length; const maintenance = domosStatus.filter(d => d.status === 'maintenance').length; const cleaning = domosStatus.filter(d => d.status === 'cleaning').length; const total = domosStatus.length; validator.log('info', `Análisis de ocupación: ${occupied}/${total} ocupados, ${available}/${total} disponibles`); return { content: [{ type: 'text', text: this.formatOccupancyAnalysis({ periodText, occupancyRate, domosStatus, metrics: { available, occupied, maintenance, cleaning, total } }) }] }; } catch (error) { validator.log('error', `Error en análisis de ocupación: ${error.message}`); return validator.generateInsufficientDataResponse( 'análisis de ocupación', 'Error interno en el análisis. Contacta al administrador.' ); } }
- src/data/dataLoader.js:133-174 (helper)Supporting utility to load real-time domo status data from multiple JSON sources (domos-status.json, sample-data.json, inter-agent-bus.json), with structure validation, caching (5min expiry), and graceful failure without fabricating data.async loadDomosStatus() { const cacheKey = 'domos_status'; if (this.isCacheValid(cacheKey)) { validator.log('info', 'Estado de domos obtenido del cache'); return this.cache.get(cacheKey); } // Intentar cargar desde múltiples fuentes const sources = [ { path: path.join(dataPath, 'domos-status.json'), name: 'estado de domos dedicado' }, { path: path.join(webAppPath, 'sample-data.json'), name: 'datos principales', field: 'domos_status' }, { path: path.join(dataPath, 'inter-agent-bus.json'), name: 'bus inter-agentes', field: 'domos' } ]; for (const source of sources) { const fileExists = await validator.validateFileExists(source.path, source.name); if (fileExists) { const validation = await validator.validateJsonData(source.path, [], source.name); if (validation.valid) { let domosData = validation.data; // Si necesita extraer un campo específico if (source.field && domosData[source.field]) { domosData = domosData[source.field]; } // Validar que tiene estructura de domos if (this.isValidDomosData(domosData)) { this.setCache(cacheKey, domosData); validator.log('info', `Estado de domos cargado desde: ${source.name}`); return domosData; } } } } validator.log('error', 'No se pudo cargar estado real de domos desde ninguna fuente'); return null; // NO devolver datos hardcodeados }
- src/data/dataLoader.js:63-90 (helper)Supporting utility to load business status data from inter-agent-bus.json with validation and caching, providing occupancy rate used in analysis.async loadBusinessStatus() { const cacheKey = 'business_status'; if (this.isCacheValid(cacheKey)) { validator.log('info', 'Estado del negocio obtenido del cache'); return this.cache.get(cacheKey); } const filePath = path.join(dataPath, 'inter-agent-bus.json'); const fileExists = await validator.validateFileExists(filePath, 'estado del negocio'); if (!fileExists) { validator.log('error', 'Archivo de estado del negocio no encontrado'); return null; } const validation = await validator.validateJsonData(filePath, [], 'estado del negocio'); if (!validation.valid) { validator.log('error', `Estado del negocio inválido: ${validation.error}`); return null; } this.setCache(cacheKey, validation.data); validator.log('info', 'Estado del negocio cargado exitosamente'); return validation.data; }