serper-productos
Version:
MCP server para búsqueda de productos usando la API de Google Serper
67 lines (66 loc) • 2.94 kB
JavaScript
import axios from 'axios';
import dotenv from 'dotenv';
// Cargar variables de entorno
dotenv.config();
// Cargar variables de entorno
const API_KEY = process.env.SERPER_API_KEY;
const DEFAULT_GL = process.env.SERPER_GL || 'pe';
const DEFAULT_HL = process.env.SERPER_HL || 'es-419';
const DEFAULT_TBS = process.env.SERPER_TBS;
// Simplificación del manejo de SERPER_NUM
const DEFAULT_NUM = process.env.SERPER_NUM ? Number(process.env.SERPER_NUM) : 10; // Valor por defecto: 10 resultados
// Verificar que la API key esté definida
if (!API_KEY) {
console.error('Error: SERPER_API_KEY no está definida en el archivo .env');
process.exit(1);
}
/**
* Busca productos en internet utilizando la API de Google Serper.
* @param query Término de búsqueda para encontrar productos.
* @param options Opciones para la búsqueda (gl, hl, tbs, num).
* @returns Una cadena con los productos encontrados, formateados como texto.
*/
export const searchProducts = async (query, options) => {
try {
// Construir el cuerpo de la petición con parámetros obligatorios
const requestBody = {
q: query,
gl: options?.gl || DEFAULT_GL, // Usar valor de options si existe, sino usar variable de entorno
hl: options?.hl || DEFAULT_HL // Usar valor de options si existe, sino usar variable de entorno
};
// Añadir parámetros opcionales solo si están definidos en options o en variables de entorno
const tbs = options?.tbs || DEFAULT_TBS;
if (tbs) {
requestBody.tbs = tbs;
}
// Simplificación del manejo del número de resultados
requestBody.num = options?.num || DEFAULT_NUM; // Usar el valor de options o el valor por defecto
const response = await axios.post('https://google.serper.dev/shopping', requestBody, {
headers: {
'X-API-KEY': API_KEY,
'Content-Type': 'application/json',
},
});
// Obtener los productos
const products = response.data.shopping || [];
// Verificar si hay productos
if (products.length === 0) {
return `No se encontraron productos para "${query}"`;
}
// Formatear cada producto
const formattedProducts = products.map((product) => {
// Convertir todas las propiedades del producto a formato de texto
const productEntries = Object.entries(product);
const productLines = productEntries.map(([key, value]) => {
return `${key}: ${value}`;
});
return productLines.join('\n') + '\n---';
});
// Devolver el resultado formateado
return `Productos encontrados para "${query}":\n\n${formattedProducts.join("\n")}`;
}
catch (error) {
console.error('Error searching products:', error);
throw new Error('Failed to search products');
}
};