cook-mcp-windy
Version:
HowToCook MCP Server - Intelligent Chinese recipe management and meal planning for AI assistants
83 lines • 4.88 kB
JavaScript
import { z } from 'zod';
import { Recipe } from './recipe.js';
// Meal combination types
export const CombinationType = z.enum([
'家常搭配', // home-style combination
'宴客搭配', // entertaining guests
'节日搭配', // holiday combination
'快手搭配', // quick meal combination
'营养搭配', // nutritional combination
'季节搭配', // seasonal combination
]);
// Dish role in a meal
export const DishRole = z.enum([
'主菜', // main dish
'配菜', // side dish
'汤品', // soup
'主食', // staple
'开胃菜', // appetizer
'甜品', // dessert
]);
// Combination preferences
export const CombinationPreferences = z.object({
numberOfPeople: z.number().min(1).describe('Number of diners'),
occasion: z.enum(['日常', '聚餐', '节日', '招待客人', '特殊场合']).optional().describe('Dining occasion'),
budgetLevel: z.enum(['经济', '中等', '高档']).optional().describe('Budget preference'),
dietaryRestrictions: z.array(z.string()).optional().describe('Dietary restrictions'),
preferredFlavors: z.array(z.string()).optional().describe('Preferred flavor profiles'),
cookingTime: z.string().optional().describe('Available cooking time'),
skillLevel: z.enum(['初学者', '中级', '高级']).optional().describe('Cooking skill level'),
seasonalPreference: z.boolean().optional().describe('Prefer seasonal ingredients'),
nutritionalBalance: z.boolean().optional().describe('Focus on nutritional balance'),
});
// Recommended dish in a combination
export const RecommendedDish = z.object({
recipe: Recipe.describe('The recommended recipe'),
role: DishRole.describe('Role of this dish in the meal'),
priority: z.enum(['必选', '推荐', '可选']).describe('Priority level of this dish'),
reason: z.string().describe('Reason for recommending this dish'),
preparationOrder: z.number().describe('Suggested preparation order (1 = prepare first)'),
servingOrder: z.number().describe('Suggested serving order (1 = serve first)'),
});
// Dish combination recommendation
export const DishCombination = z.object({
id: z.string().describe('Unique combination identifier'),
name: z.string().describe('Name of the combination'),
description: z.string().describe('Description of the combination'),
type: CombinationType.describe('Type of combination'),
dishes: z.array(RecommendedDish).describe('Recommended dishes in this combination'),
totalPrepTime: z.string().describe('Total preparation time'),
totalCookTime: z.string().describe('Total cooking time'),
difficulty: z.enum(['简单', '中等', '困难']).describe('Overall difficulty level'),
servings: z.number().describe('Number of people this combination serves'),
nutritionalBalance: z.object({
hasProtein: z.boolean().describe('Contains adequate protein'),
hasVegetables: z.boolean().describe('Contains vegetables'),
hasCarbs: z.boolean().describe('Contains carbohydrates'),
isBalanced: z.boolean().describe('Overall nutritional balance'),
}).describe('Nutritional balance analysis'),
flavorProfile: z.array(z.string()).describe('Flavor characteristics of the combination'),
cookingTips: z.array(z.string()).optional().describe('Tips for preparing this combination'),
alternatives: z.array(z.string()).optional().describe('Alternative dishes that can be substituted'),
estimatedCost: z.string().optional().describe('Estimated cost range'),
createdAt: z.string().describe('Creation timestamp'),
});
// Combination request
export const CombinationRequest = z.object({
preferences: CombinationPreferences.describe('User preferences for dish combination'),
excludeRecipeIds: z.array(z.string()).optional().describe('Recipe IDs to exclude from recommendations'),
includeRecipeIds: z.array(z.string()).optional().describe('Recipe IDs that must be included'),
maxDishes: z.number().optional().default(6).describe('Maximum number of dishes in combination'),
minDishes: z.number().optional().default(3).describe('Minimum number of dishes in combination'),
});
// Combination analysis
export const CombinationAnalysis = z.object({
nutritionalScore: z.number().min(0).max(10).describe('Nutritional balance score (0-10)'),
flavorHarmony: z.number().min(0).max(10).describe('Flavor harmony score (0-10)'),
difficultyBalance: z.number().min(0).max(10).describe('Cooking difficulty balance score (0-10)'),
timeEfficiency: z.number().min(0).max(10).describe('Time efficiency score (0-10)'),
overallScore: z.number().min(0).max(10).describe('Overall combination score (0-10)'),
strengths: z.array(z.string()).describe('Strengths of this combination'),
improvements: z.array(z.string()).describe('Suggested improvements'),
});
//# sourceMappingURL=dishCombination.js.map