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>
147 lines
5.6 KiB
JavaScript
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
|