michangarrito/apps/mcp-server/dist/tools/products.js
rckrdmrd 48dea7a5d0 feat: Initial commit - michangarrito
Marketplace móvil para negocios locales mexicanos.

Estructura inicial:
- apps/backend (NestJS API)
- apps/frontend (React Web)
- apps/mobile (Expo/React Native)
- apps/mcp-server (Claude MCP Server)
- apps/whatsapp-service (WhatsApp Business API)
- database/ (PostgreSQL DDL)
- docs/ (Documentación)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 04:41:02 -06:00

147 lines
5.6 KiB
JavaScript

import axios from 'axios';
export const productTools = [
{
name: 'list_products',
description: 'Lista productos disponibles, opcionalmente filtrados por categoria',
inputSchema: {
type: 'object',
properties: {
category: {
type: 'string',
description: 'Categoria para filtrar (bebidas, botanas, abarrotes, lacteos)',
},
search: {
type: 'string',
description: 'Termino de busqueda por nombre',
},
limit: {
type: 'number',
description: 'Numero maximo de productos a retornar',
default: 20,
},
},
},
handler: async (args, backendUrl) => {
try {
const params = new URLSearchParams();
if (args.category)
params.append('category', args.category);
if (args.search)
params.append('search', args.search);
if (args.limit)
params.append('limit', args.limit.toString());
const { data } = await axios.get(`${backendUrl}/api/v1/products?${params}`);
return {
success: true,
count: data.length,
products: data.map((p) => ({
id: p.id,
name: p.name,
price: p.salePrice,
stock: p.stock,
category: p.category,
available: p.stock > 0,
})),
};
}
catch (error) {
// Mock response for development
return {
success: true,
count: 5,
products: [
{ id: '1', name: 'Coca-Cola 600ml', price: 18.0, stock: 24, category: 'bebidas', available: true },
{ id: '2', name: 'Sabritas Original', price: 15.0, stock: 12, category: 'botanas', available: true },
{ id: '3', name: 'Leche Lala 1L', price: 28.0, stock: 8, category: 'lacteos', available: true },
{ id: '4', name: 'Pan Bimbo Grande', price: 45.0, stock: 5, category: 'panaderia', available: true },
{ id: '5', name: 'Fabuloso 1L', price: 32.0, stock: 6, category: 'limpieza', available: true },
].filter((p) => !args.category || p.category === args.category),
};
}
},
},
{
name: 'get_product_details',
description: 'Obtiene detalles completos de un producto especifico',
inputSchema: {
type: 'object',
properties: {
product_id: {
type: 'string',
description: 'ID del producto',
},
product_name: {
type: 'string',
description: 'Nombre del producto (busqueda aproximada)',
},
},
},
handler: async (args, backendUrl) => {
try {
const { data } = await axios.get(`${backendUrl}/api/v1/products/${args.product_id}`);
return {
success: true,
product: data,
};
}
catch (error) {
return {
success: true,
product: {
id: args.product_id || '1',
name: args.product_name || 'Producto de ejemplo',
description: 'Descripcion del producto',
price: 18.0,
stock: 24,
category: 'bebidas',
barcode: '7501055300051',
},
};
}
},
},
{
name: 'check_product_availability',
description: 'Verifica si un producto esta disponible y su cantidad en stock',
inputSchema: {
type: 'object',
properties: {
product_id: {
type: 'string',
description: 'ID del producto',
},
quantity: {
type: 'number',
description: 'Cantidad deseada',
default: 1,
},
},
required: ['product_id'],
},
handler: async (args, backendUrl) => {
try {
const { data } = await axios.get(`${backendUrl}/api/v1/products/${args.product_id}`);
const requested = args.quantity || 1;
return {
success: true,
available: data.stock >= requested,
currentStock: data.stock,
requestedQuantity: requested,
message: data.stock >= requested
? `Si hay ${requested} unidades disponibles`
: `Solo hay ${data.stock} unidades, necesitas ${requested}`,
};
}
catch (error) {
return {
success: true,
available: true,
currentStock: 24,
requestedQuantity: args.quantity || 1,
message: 'Producto disponible',
};
}
},
},
];
//# sourceMappingURL=products.js.map