bbq_get_cooking_tips
Get expert BBQ cooking tips for specific proteins, methods, and cooking phases to improve your grilling and smoking results.
Instructions
Get cooking tips and best practices for a specific protein and situation.
Args:
protein_type: Type of protein
cook_method: Specific cooking method (optional)
current_phase: Current cooking phase for targeted tips (optional)
'prep': Preparation and seasoning
'cooking': Active cooking
'stall': Temperature stall
'wrapping': Texas crutch / wrapping
'final_push': End of cook
'resting': Rest period
'serving': Slicing and serving
response_format: 'markdown' or 'json'
Examples:
"Tips for smoking brisket" -> protein_type='beef_brisket', cook_method='smoke_low_slow'
"Help with the stall" -> protein_type='beef_brisket', current_phase='stall'
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| protein_type | Yes | Type of protein | |
| cook_method | No | Specific cooking method for targeted tips | |
| current_phase | No | Current phase of the cook for phase-specific tips | |
| response_format | No | Output format | markdown |
Implementation Reference
- src/index.ts:720-749 (handler)The inline handler function passed to server.registerTool that executes the tool logic: retrieves tips using getCookingTips, formats as JSON or Markdown, handles errors.async (params: GetCookingTipsInput) => { try { const tips = getCookingTips(params.protein_type, params.cook_method, params.current_phase); if (params.response_format === "json") { const output = { proteinType: params.protein_type, cookMethod: params.cook_method, currentPhase: params.current_phase, tips, }; return { content: [{ type: "text", text: JSON.stringify(output, null, 2) }], structuredContent: output, }; } const markdown = formatTipsMarkdown(tips, params.protein_type); return { content: [{ type: "text", text: markdown }], }; } catch (error) { const message = error instanceof Error ? error.message : "Unknown error occurred"; return { isError: true, content: [{ type: "text", text: `Error getting cooking tips: ${message}` }], }; } }
- src/schemas/index.ts:201-213 (schema)Zod schema for input validation: requires protein_type, optional cook_method, current_phase, response_format.export const GetCookingTipsSchema = z .object({ protein_type: ProteinTypeSchema.describe("Type of protein"), cook_method: CookMethodSchema.optional().describe("Specific cooking method for targeted tips"), current_phase: z .enum(["prep", "cooking", "stall", "wrapping", "final_push", "resting", "serving"]) .optional() .describe("Current phase of the cook for phase-specific tips"), response_format: ResponseFormatSchema.describe("Output format"), }) .strict(); export type GetCookingTipsInput = z.infer<typeof GetCookingTipsSchema>;
- src/index.ts:690-719 (registration)Registration of the 'bbq_get_cooking_tips' tool with server.registerTool, including metadata, description, input schema reference, and annotations.server.registerTool( "bbq_get_cooking_tips", { title: "Get Cooking Tips", description: `Get cooking tips and best practices for a specific protein and situation. Args: - protein_type: Type of protein - cook_method: Specific cooking method (optional) - current_phase: Current cooking phase for targeted tips (optional) - 'prep': Preparation and seasoning - 'cooking': Active cooking - 'stall': Temperature stall - 'wrapping': Texas crutch / wrapping - 'final_push': End of cook - 'resting': Rest period - 'serving': Slicing and serving - response_format: 'markdown' or 'json' Examples: - "Tips for smoking brisket" -> protein_type='beef_brisket', cook_method='smoke_low_slow' - "Help with the stall" -> protein_type='beef_brisket', current_phase='stall'`, inputSchema: GetCookingTipsSchema, annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false, }, },
- src/services/cooking.ts:452-497 (helper)Core helper function that generates cooking tips based on protein profile, cook method, and current phase by combining base tips with contextual additions.export function getCookingTips( proteinType: ProteinType, cookMethod?: CookMethod, currentPhase?: string ): string[] { const profile = getProteinProfile(proteinType); const tips: string[] = [...profile.tips]; // Add method-specific tips if (cookMethod) { const methodInfo = COOK_METHOD_INFO[cookMethod]; tips.push(`For ${methodInfo.displayName}: Cook at ${methodInfo.tempRange}`); if (cookMethod === "reverse_sear") { tips.push("Start at 225°F until 10-15°F below target, then sear at high heat for 1-2 minutes per side."); } else if (cookMethod === "spatchcock") { tips.push( "Remove backbone with kitchen shears, flatten bird for more even cooking and crispier skin." ); } } // Add phase-specific tips if (currentPhase) { switch (currentPhase) { case "prep": tips.push("Season liberally - salt enhances flavor and aids bark formation."); tips.push("Let meat come to room temperature (30-60 min) for more even cooking."); break; case "stall": tips.push("The stall is caused by evaporative cooling - moisture on the surface keeps temps flat."); tips.push("Options: Wrap in butcher paper/foil (Texas crutch) or ride it out."); break; case "wrapping": tips.push("Butcher paper allows some smoke penetration while speeding the cook."); tips.push("Foil is faster but can soften the bark."); break; case "resting": tips.push("Don't skip the rest! It allows juices to redistribute."); tips.push("Large cuts can rest in a cooler for hours without losing much heat."); break; } } return tips; }
- src/services/formatting.ts:264-274 (helper)Helper function to format the array of cooking tips into Markdown bullet list with protein title.export function formatTipsMarkdown(tips: string[], proteinType: ProteinType): string { const profile = PROTEIN_PROFILES[proteinType]; let output = `## 💡 Cooking Tips: ${profile.displayName}\n\n`; for (const tip of tips) { output += `- ${tip}\n`; } return output; }