Skip to main content
Glama
janetsep

TreePod Financial MCP Agent

by janetsep

compare_competition

Compare prices and services with competitors using real market data to analyze competitive positioning and identify opportunities for improvement.

Instructions

Compara precios y servicios con la competencia basado en datos reales

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
analysis_typeNoall

Implementation Reference

  • server.js:143-181 (registration)
    Registration of the 'compare_competition' tool, including input schema (analysis_type: string default 'all') and the handler function that loads competition data via dataLoader and calls businessCalculator.analyzeCompetition
    // --- Herramienta: compare_competition --- // ✅ IMPLEMENTA GUÍA DE TRABAJO FUNDAMENTAL: Sin hardcodeo, datos reales server.registerTool( 'compare_competition', { title: 'Comparar competencia', description: 'Compara precios y servicios con la competencia basado en datos reales', inputSchema: z.object({ analysis_type: z.string().default('all'), }), }, async ({ analysis_type = 'all' }) => { validator.log('info', `Iniciando análisis de competencia tipo: ${analysis_type}`); try { // Cargar datos reales de competencia const competitionData = await dataLoader.loadCompetitionData(); if (!competitionData) { return validator.generateInsufficientDataResponse( 'datos de competencia', 'El sistema de inteligencia competitiva no ha generado reportes recientes. Ejecuta el agente competitivo para obtener datos actualizados.' ); } const result = await businessCalculator.analyzeCompetition(competitionData, analysis_type); validator.log('info', 'Análisis de competencia completado exitosamente'); return result; } catch (error) { validator.log('error', `Error crítico en análisis de competencia: ${error.message}`); return validator.generateInsufficientDataResponse( 'análisis de competencia', 'Error interno del sistema. Contacta al administrador.' ); } } );
  • Core handler logic for competition analysis: processes competitionData, generates analysis using processCompetitionData and formatCompetitionAnalysis, handles errors and insufficient data
    async analyzeCompetition(competitionData, analysisType = 'all') { if (!competitionData) { return validator.generateInsufficientDataResponse( 'datos de competencia', 'No se encontraron datos de competencia válidos' ); } try { validator.log('info', `Analizando competencia tipo: ${analysisType}`); // Extraer datos relevantes según el tipo de análisis const analysis = this.processCompetitionData(competitionData, analysisType); return { content: [{ type: 'text', text: this.formatCompetitionAnalysis(analysis, analysisType) }] }; } catch (error) { validator.log('error', `Error en análisis de competencia: ${error.message}`); return validator.generateInsufficientDataResponse( 'análisis de competencia', 'Error interno en el análisis. Contacta al administrador.' ); } }
  • Supporting helper function processCompetitionData that extracts competitors, calculates price ranges, services frequency, positioning, and recommendations from raw competition data
    processCompetitionData(data, analysisType) { const analysis = { totalCompetitors: 0, priceRange: { min: null, max: null, average: null }, services: [], positioning: 'medio', recommendations: [] }; // Procesar diferentes estructuras de datos de competencia let competitors = []; if (data.competitors) { competitors = Array.isArray(data.competitors) ? data.competitors : Object.values(data.competitors); } else if (data.establishments) { competitors = Array.isArray(data.establishments) ? data.establishments : Object.values(data.establishments); } else if (Array.isArray(data)) { competitors = data; } analysis.totalCompetitors = competitors.length; if (competitors.length > 0) { // Analizar precios si están disponibles const prices = competitors .map(c => c.price || c.tarifa || c.precio) .filter(p => p && typeof p === 'number') .sort((a, b) => a - b); if (prices.length > 0) { analysis.priceRange.min = prices[0]; analysis.priceRange.max = prices[prices.length - 1]; analysis.priceRange.average = Math.round(prices.reduce((a, b) => a + b, 0) / prices.length); } // Analizar servicios comunes const allServices = competitors .flatMap(c => c.services || c.servicios || []) .filter(s => s); const serviceCount = {}; allServices.forEach(service => { serviceCount[service] = (serviceCount[service] || 0) + 1; }); analysis.services = Object.entries(serviceCount) .sort(([,a], [,b]) => b - a) .slice(0, 5) .map(([service, count]) => ({ service, count })); // Determinar posicionamiento if (analysis.priceRange.average) { const treepodPrice = 80000; // Precio base estimado if (treepodPrice < analysis.priceRange.average * 0.8) { analysis.positioning = 'económico'; } else if (treepodPrice > analysis.priceRange.average * 1.2) { analysis.positioning = 'premium'; } } // Generar recomendaciones analysis.recommendations = this.generateCompetitionRecommendations(analysis); } return analysis; }

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