Skip to main content
Glama
caleb-conner

Open Food Facts MCP Server

by caleb-conner

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

TableJSON Schema
NameRequiredDescriptionDefault
barcodesYesArray of product barcodes to compare (max 10)
focusNoFocus comparison on specific aspect

Implementation Reference

  • 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, }, ], }; }
  • 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);
  • 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'); }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/caleb-conner/open-food-facts-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server