index.ts•2.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);
});
}