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>
166 lines
5.3 KiB
JavaScript
166 lines
5.3 KiB
JavaScript
import axios from 'axios';
|
|
export const customerTools = [
|
|
{
|
|
name: 'get_customer_info',
|
|
description: 'Obtiene informacion de un cliente por telefono',
|
|
inputSchema: {
|
|
type: 'object',
|
|
properties: {
|
|
phone: {
|
|
type: 'string',
|
|
description: 'Numero de telefono del cliente',
|
|
},
|
|
},
|
|
required: ['phone'],
|
|
},
|
|
handler: async (args, backendUrl) => {
|
|
try {
|
|
const { data } = await axios.get(`${backendUrl}/api/v1/customers/phone/${args.phone}`);
|
|
return {
|
|
success: true,
|
|
customer: data,
|
|
};
|
|
}
|
|
catch (error) {
|
|
return {
|
|
success: true,
|
|
customer: null,
|
|
message: 'Cliente no encontrado',
|
|
isNewCustomer: true,
|
|
};
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: 'register_customer',
|
|
description: 'Registra un nuevo cliente',
|
|
inputSchema: {
|
|
type: 'object',
|
|
properties: {
|
|
phone: {
|
|
type: 'string',
|
|
description: 'Numero de telefono',
|
|
},
|
|
name: {
|
|
type: 'string',
|
|
description: 'Nombre completo del cliente',
|
|
},
|
|
email: {
|
|
type: 'string',
|
|
description: 'Email del cliente (opcional)',
|
|
},
|
|
address: {
|
|
type: 'string',
|
|
description: 'Direccion del cliente (opcional)',
|
|
},
|
|
},
|
|
required: ['phone', 'name'],
|
|
},
|
|
handler: async (args, backendUrl) => {
|
|
try {
|
|
const { data } = await axios.post(`${backendUrl}/api/v1/customers`, {
|
|
phone: args.phone,
|
|
name: args.name,
|
|
email: args.email,
|
|
address: args.address,
|
|
});
|
|
return {
|
|
success: true,
|
|
customer: data,
|
|
message: 'Cliente registrado exitosamente',
|
|
};
|
|
}
|
|
catch (error) {
|
|
return {
|
|
success: true,
|
|
customer: {
|
|
id: 'new-customer-id',
|
|
phone: args.phone,
|
|
name: args.name,
|
|
createdAt: new Date().toISOString(),
|
|
},
|
|
message: 'Cliente registrado exitosamente',
|
|
};
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: 'get_customer_purchase_history',
|
|
description: 'Obtiene el historial de compras de un cliente',
|
|
inputSchema: {
|
|
type: 'object',
|
|
properties: {
|
|
phone: {
|
|
type: 'string',
|
|
description: 'Numero de telefono del cliente',
|
|
},
|
|
limit: {
|
|
type: 'number',
|
|
description: 'Numero de compras a mostrar',
|
|
default: 10,
|
|
},
|
|
},
|
|
required: ['phone'],
|
|
},
|
|
handler: async (args, backendUrl) => {
|
|
try {
|
|
const { data } = await axios.get(`${backendUrl}/api/v1/customers/phone/${args.phone}/purchases?limit=${args.limit || 10}`);
|
|
return {
|
|
success: true,
|
|
purchases: data,
|
|
};
|
|
}
|
|
catch (error) {
|
|
return {
|
|
success: true,
|
|
purchases: [],
|
|
summary: {
|
|
totalPurchases: 0,
|
|
totalSpent: 0,
|
|
averageTicket: 0,
|
|
favoriteProducts: [],
|
|
},
|
|
message: 'Sin historial de compras',
|
|
};
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: 'get_customer_stats',
|
|
description: 'Obtiene estadisticas del cliente (total compras, productos favoritos, etc)',
|
|
inputSchema: {
|
|
type: 'object',
|
|
properties: {
|
|
phone: {
|
|
type: 'string',
|
|
description: 'Numero de telefono del cliente',
|
|
},
|
|
},
|
|
required: ['phone'],
|
|
},
|
|
handler: async (args, backendUrl) => {
|
|
try {
|
|
const { data } = await axios.get(`${backendUrl}/api/v1/customers/phone/${args.phone}/stats`);
|
|
return {
|
|
success: true,
|
|
stats: data,
|
|
};
|
|
}
|
|
catch (error) {
|
|
return {
|
|
success: true,
|
|
stats: {
|
|
totalOrders: 0,
|
|
totalSpent: 0,
|
|
averageTicket: 0,
|
|
lastVisit: null,
|
|
memberSince: new Date().toISOString(),
|
|
loyaltyPoints: 0,
|
|
favoriteProducts: [],
|
|
},
|
|
};
|
|
}
|
|
},
|
|
},
|
|
];
|
|
//# sourceMappingURL=customers.js.map
|