UNPKG

@atlas-kitchen/atlas-mcp

Version:

Model Context Protocol server for Atlas restaurant management system - enables Claude to interact with restaurant orders, menus, and reports

161 lines 6.34 kB
import { z } from 'zod'; const GetMenusSchema = z.object({ outletId: z.number().optional(), servingDate: z.string().optional(), timeslotType: z.string().optional(), }); const GetOptimizedMenusSchema = z.object({ outletId: z.number(), servingDate: z.string(), }); const GetItemsSchema = z.object({ search: z.string().optional(), brandId: z.number().optional(), archived: z.boolean().optional(), page: z.number().optional(), perPage: z.number().optional(), }); export function createMenuTools(client, authManager) { return [ { name: 'atlas_get_menus', description: 'List available menus for a specific outlet and/or serving date', inputSchema: { type: 'object', properties: { outletId: { type: 'number', description: 'Outlet ID to filter menus' }, servingDate: { type: 'string', description: 'Serving date in ISO format (YYYY-MM-DD)' }, timeslotType: { type: 'string', description: 'Timeslot type filter' }, }, }, handler: async (input) => { const { outletId, servingDate, timeslotType } = GetMenusSchema.parse(input); if (!authManager.isAuthenticated()) { return { success: false, error: 'Not authenticated. Please login first.', }; } try { const menus = await client.getMenus(outletId, servingDate, timeslotType); return { success: true, menus, }; } catch (error) { return { success: false, error: error.message || 'Failed to fetch menus', }; } }, }, { name: 'atlas_get_optimized_menus', description: 'Get optimized menu structure with sections and items for a specific outlet and date', inputSchema: { type: 'object', properties: { outletId: { type: 'number', description: 'Outlet ID (required)' }, servingDate: { type: 'string', description: 'Serving date in ISO format YYYY-MM-DD (required)' }, }, required: ['outletId', 'servingDate'], }, handler: async (input) => { const { outletId, servingDate } = GetOptimizedMenusSchema.parse(input); if (!authManager.isAuthenticated()) { return { success: false, error: 'Not authenticated. Please login first.', }; } try { const menus = await client.getOptimizedMenus(outletId, servingDate); return { success: true, menus, }; } catch (error) { return { success: false, error: error.message || 'Failed to fetch optimized menus', }; } }, }, { name: 'atlas_get_items', description: 'List items with optional filters', inputSchema: { type: 'object', properties: { search: { type: 'string', description: 'Search term for items' }, brandId: { type: 'number', description: 'Brand ID to filter items' }, archived: { type: 'boolean', description: 'Include archived items (default: false)' }, page: { type: 'number', description: 'Page number for pagination' }, perPage: { type: 'number', description: 'Items per page (default: 20)' }, }, }, handler: async (input) => { const filters = GetItemsSchema.parse(input); if (!authManager.isAuthenticated()) { return { success: false, error: 'Not authenticated. Please login first.', }; } try { const response = await client.getItems(filters); return { success: true, items: response.items, totalCount: response.totalCount, page: response.page, perPage: response.perPage, }; } catch (error) { return { success: false, error: error.message || 'Failed to fetch items', }; } }, }, { name: 'atlas_get_menu_sections', description: 'Get menu structure with sections', inputSchema: { type: 'object', properties: {}, }, handler: async () => { if (!authManager.isAuthenticated()) { return { success: false, error: 'Not authenticated. Please login first.', }; } try { // This would need a more detailed query in the client // For now, we'll return menus which can include sections const menus = await client.getMenus(); return { success: true, menus, message: 'Menu sections can be accessed through individual menu queries', }; } catch (error) { return { success: false, error: error.message || 'Failed to fetch menu sections', }; } }, }, ]; } //# sourceMappingURL=menu.js.map