compare_products
Compare nutritional information, ingredients, environmental impact, or processing details between multiple food products using barcodes to make informed purchasing decisions.
Instructions
Compare nutritional information between multiple products
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| barcodes | Yes | Array of product barcodes to compare (max 10) | |
| focus | No | Focus comparison on specific aspect |
Implementation Reference
- src/handlers.ts:89-114 (handler)Main handler function that fetches products by barcodes, validates at least 2 products, and generates comparison using helper.
async handleCompareProducts(barcodes: string[], focus: string = 'nutrition') { const responses = await this.client.getProductsByBarcodes(barcodes); const validProducts = responses.filter(r => r.status !== 0 && r.product); if (validProducts.length < 2) { return { content: [ { type: "text" as const, text: "Need at least 2 valid products to compare.", }, ], }; } const comparison = this.compareProductsByFocus(validProducts.map(r => r.product!), focus); return { content: [ { type: "text" as const, text: comparison, }, ], }; } - src/tools.ts:82-104 (schema)Input schema definition for the compare_products tool, specifying barcodes array (min 2, max 10) and optional focus enum.
{ name: "compare_products", description: "Compare nutritional information between multiple products", inputSchema: { type: "object", properties: { barcodes: { type: "array", items: { type: "string", }, description: "Array of product barcodes to compare (max 10)", maxItems: 10, minItems: 2, }, focus: { type: "string", description: "Focus comparison on specific aspect", enum: ["nutrition", "ingredients", "environmental", "processing"], }, }, required: ["barcodes"], }, - src/index.ts:54-55 (registration)Tool dispatch registration in the switch statement for CallToolRequestHandler.
case 'compare_products': return await handlers.handleCompareProducts(args.barcodes, args.focus); - src/handlers.ts:250-292 (helper)Private helper method that generates the comparison string based on focus (nutrition, ingredients, etc.) for the products.
private compareProductsByFocus(products: Product[], focus: string): string { const comparison = [`**Product Comparison (${focus})**\n`]; products.forEach((product, index) => { comparison.push(`**${index + 1}. ${product.product_name || 'Unknown'}**`); switch (focus) { case 'nutrition': if (product.nutriscore_grade) { comparison.push(`Nutri-Score: ${product.nutriscore_grade.toUpperCase()}`); } if (product.nutriments) { const keyNutrients = this.extractKeyNutrients(product.nutriments); if (keyNutrients) comparison.push(`Nutrients:\n${keyNutrients}`); } break; case 'environmental': if (product.ecoscore_grade) { comparison.push(`Eco-Score: ${product.ecoscore_grade.toUpperCase()}`); } if (product.packaging) { comparison.push(`Packaging: ${product.packaging}`); } break; case 'processing': if (product.nova_group) { comparison.push(`NOVA Group: ${product.nova_group} (${this.getNovaDescription(String(product.nova_group))})`); } break; case 'ingredients': if (product.ingredients_text) { comparison.push(`Ingredients: ${product.ingredients_text.substring(0, 200)}${product.ingredients_text.length > 200 ? '...' : ''}`); } break; } comparison.push(''); }); return comparison.join('\n'); }