Skip to main content
Glama

Open Food Facts MCP Server

by caleb-conner
index.ts2.53 kB
#!/usr/bin/env node import { Server } from '@modelcontextprotocol/sdk/server/index.js'; import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js'; import { OpenFoodFactsClient } from './client.js'; import { ToolHandlers } from './handlers.js'; import { tools } from './tools.js'; import { OpenFoodFactsConfig } from './types.js'; const config: OpenFoodFactsConfig = { baseUrl: process.env.OPEN_FOOD_FACTS_BASE_URL || 'https://world.openfoodfacts.net', userAgent: process.env.OPEN_FOOD_FACTS_USER_AGENT || 'OpenFoodFactsMCP/1.0 (https://github.com/user/open-food-facts-mcp)', rateLimits: { products: 100, // per minute search: 10, // per minute facets: 2, // per minute }, }; const client = new OpenFoodFactsClient(config); const handlers = new ToolHandlers(client); const server = new Server( { name: 'open-food-facts-mcp', version: '1.0.0', }, { capabilities: { tools: {}, }, } ); server.setRequestHandler(ListToolsRequestSchema, async () => { return { tools }; }); server.setRequestHandler(CallToolRequestSchema, async (request) => { const { name, arguments: args } = request.params; try { switch (name) { case 'get_product': return await handlers.handleGetProduct(args.barcode); case 'search_products': return await handlers.handleSearchProducts(args); case 'analyze_product': return await handlers.handleAnalyzeProduct(args.barcode); case 'compare_products': return await handlers.handleCompareProducts(args.barcodes, args.focus); case 'get_product_suggestions': return await handlers.handleGetProductSuggestions(args); default: throw new Error(`Unknown tool: ${name}`); } } catch (error) { const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred'; return { content: [ { type: 'text' as const, text: `Error: ${errorMessage}`, }, ], isError: true, }; } }); async function main() { const transport = new StdioServerTransport(); await server.connect(transport); console.error('Open Food Facts MCP Server running on stdio'); } if (import.meta.url === `file://${process.argv[1]}`) { main().catch((error) => { console.error('Server failed to start:', error); process.exit(1); }); }

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