bbq_get_cooking_tips
Get cooking tips and best practices for specific BBQ proteins and cooking phases to improve your grilling or 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)Inline MCP handler function that processes input parameters, calls helper functions for tips and formatting, supports JSON or markdown output, and 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/index.ts:686-750 (registration)Registration of the bbq_get_cooking_tips tool with MCP server, including title, description, input schema reference, annotations, and inline handler./** * Tool: bbq_get_cooking_tips * Get cooking tips for a protein */ 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, }, }, 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:199-213 (schema)Zod schema defining input validation for the tool: protein_type (required), cook_method and current_phase (optional), response_format.* Schema for getting cooking tips */ 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/services/cooking.ts:451-497 (helper)Main helper function that retrieves base tips from protein profile, adds method-specific and phase-specific tips, returns array of strings.*/ 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:263-274 (helper)Helper function that formats the array of tips into a markdown string with header using protein display name.*/ 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; }