@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
JavaScript
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