Skip to main content
Glama

bbq_get_cooking_guidance

Plan BBQ cooks by getting target temperatures, time estimates, and expert tips for specific proteins based on weight, desired doneness, and cooking method.

Instructions

Get comprehensive cooking guidance for a specific protein including target temperatures, time estimates, and tips.

This is the primary tool for planning a cook. It provides:

  • Target internal temperature based on desired doneness

  • Pull temperature (accounting for carryover)

  • Estimated cook time based on weight and method

  • Timeline for when to start if serving time is specified

  • Stall warnings for large cuts

  • Resting instructions

  • Pro tips for the specific protein

Args:

  • protein_type: Type of meat (e.g., 'beef_brisket', 'pork_shoulder', 'chicken_whole')

  • weight_pounds: Weight in pounds (e.g., 12.5)

  • target_doneness: Desired doneness level (optional, uses recommended if not specified)

  • cook_method: Cooking method (optional, uses recommended if not specified)

  • serving_time: Target serving time in ISO 8601 format (optional)

  • response_format: 'markdown' or 'json'

Examples:

  • "How should I cook a 14 lb brisket?" -> protein_type='beef_brisket', weight_pounds=14

  • "I want to serve pulled pork at 6pm" -> protein_type='pork_butt', serving_time='2024-12-25T18:00:00'

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
protein_typeYesType of protein being cooked (e.g., 'beef_brisket', 'pork_shoulder', 'chicken_whole')
weight_poundsYesWeight of the protein in pounds (e.g., 12.5 for a 12.5 lb brisket)
target_donenessNoDesired doneness level. If not specified, will use the recommended doneness for the protein type.
cook_methodNoCooking method to use. If not specified, will recommend the best method for this protein.
serving_timeNoTarget serving time in ISO 8601 format (e.g., '2024-12-25T18:00:00'). Used to calculate when to start cooking.
response_formatNoOutput format: 'markdown' for human-readable or 'json' for structured datamarkdown

Implementation Reference

  • Primary handler function for bbq_get_cooking_guidance tool. Computes cooking guidance using protein profile, target temps, cook time estimates, and optional timeline. Supports markdown and JSON output formats.
    async (params: GetCookingGuidanceInput) => { try { const profile = getProteinProfile(params.protein_type); const cookMethod = params.cook_method || getRecommendedCookMethod(params.protein_type); const { targetTemp, pullTemp, doneness } = getTargetTemperature( params.protein_type, params.target_doneness ); const estimate = estimateCookTime( params.protein_type, params.weight_pounds, cookMethod ); let startTimeInfo: { startTime: Date; restTime: number; bufferMinutes: number } | undefined; if (params.serving_time) { const servingDate = new Date(params.serving_time); startTimeInfo = calculateStartTime( params.protein_type, params.weight_pounds, cookMethod, servingDate ); } if (params.response_format === "json") { const output = { protein: { type: params.protein_type, displayName: profile.displayName, category: profile.category, weightPounds: params.weight_pounds, }, temperatures: { targetTemp, pullTemp, carryover: profile.carryoverDegrees, usdaSafeMin: profile.usdaSafeTemp, }, doneness: { level: doneness, displayName: DONENESS_INFO[doneness].displayName, description: DONENESS_INFO[doneness].description, }, cookMethod: { method: cookMethod, displayName: COOK_METHOD_INFO[cookMethod].displayName, tempRange: COOK_METHOD_INFO[cookMethod].tempRange, }, timeEstimate: { totalMinutes: estimate.totalMinutes, hoursAndMinutes: estimate.hoursAndMinutes, confidence: estimate.confidence, estimatedDoneTime: estimate.estimatedDoneTime.toISOString(), }, timeline: startTimeInfo ? { startTime: startTimeInfo.startTime.toISOString(), restTimeMinutes: startTimeInfo.restTime, bufferMinutes: startTimeInfo.bufferMinutes, } : null, rest: { required: profile.requiresRest, minutes: profile.restTimeMinutes, }, stall: profile.stallRange ? { expectedRange: profile.stallRange, warning: "Temperature may plateau for 2-4 hours in this range", } : null, tips: profile.tips, assumptions: estimate.assumptions, warnings: estimate.warnings, }; return { content: [{ type: "text", text: JSON.stringify(output, null, 2) }], structuredContent: output, }; } const markdown = formatCookingGuidanceMarkdown( profile, params.weight_pounds, targetTemp, pullTemp, doneness, cookMethod, estimate, startTimeInfo ); 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 guidance: ${message}` }], }; } }
  • Zod schema defining input parameters and validation for the bbq_get_cooking_guidance tool, including protein_type, weight, doneness, method, serving_time.
    export const GetCookingGuidanceSchema = z .object({ protein_type: ProteinTypeSchema.describe( "Type of protein being cooked (e.g., 'beef_brisket', 'pork_shoulder', 'chicken_whole')" ), weight_pounds: z .number() .positive() .max(50) .describe("Weight of the protein in pounds (e.g., 12.5 for a 12.5 lb brisket)"), target_doneness: DonenessLevelSchema.optional().describe( "Desired doneness level. If not specified, will use the recommended doneness for the protein type." ), cook_method: CookMethodSchema.optional().describe( "Cooking method to use. If not specified, will recommend the best method for this protein." ), serving_time: z .string() .optional() .describe( "Target serving time in ISO 8601 format (e.g., '2024-12-25T18:00:00'). Used to calculate when to start cooking." ), response_format: ResponseFormatSchema.describe("Output format: 'markdown' for human-readable or 'json' for structured data"), }) .strict();
  • src/index.ts:122-261 (registration)
    Registration of bbq_get_cooking_guidance tool in main index.ts entrypoint, linking schema and handler with metadata and annotations.
    server.registerTool( "bbq_get_cooking_guidance", { title: "Get BBQ Cooking Guidance", description: `Get comprehensive cooking guidance for a specific protein including target temperatures, time estimates, and tips. This is the primary tool for planning a cook. It provides: - Target internal temperature based on desired doneness - Pull temperature (accounting for carryover) - Estimated cook time based on weight and method - Timeline for when to start if serving time is specified - Stall warnings for large cuts - Resting instructions - Pro tips for the specific protein Args: - protein_type: Type of meat (e.g., 'beef_brisket', 'pork_shoulder', 'chicken_whole') - weight_pounds: Weight in pounds (e.g., 12.5) - target_doneness: Desired doneness level (optional, uses recommended if not specified) - cook_method: Cooking method (optional, uses recommended if not specified) - serving_time: Target serving time in ISO 8601 format (optional) - response_format: 'markdown' or 'json' Examples: - "How should I cook a 14 lb brisket?" -> protein_type='beef_brisket', weight_pounds=14 - "I want to serve pulled pork at 6pm" -> protein_type='pork_butt', serving_time='2024-12-25T18:00:00'`, inputSchema: GetCookingGuidanceSchema, annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false, }, }, async (params: GetCookingGuidanceInput) => { try { const profile = getProteinProfile(params.protein_type); const cookMethod = params.cook_method || getRecommendedCookMethod(params.protein_type); const { targetTemp, pullTemp, doneness } = getTargetTemperature( params.protein_type, params.target_doneness ); const estimate = estimateCookTime( params.protein_type, params.weight_pounds, cookMethod ); let startTimeInfo: { startTime: Date; restTime: number; bufferMinutes: number } | undefined; if (params.serving_time) { const servingDate = new Date(params.serving_time); startTimeInfo = calculateStartTime( params.protein_type, params.weight_pounds, cookMethod, servingDate ); } if (params.response_format === "json") { const output = { protein: { type: params.protein_type, displayName: profile.displayName, category: profile.category, weightPounds: params.weight_pounds, }, temperatures: { targetTemp, pullTemp, carryover: profile.carryoverDegrees, usdaSafeMin: profile.usdaSafeTemp, }, doneness: { level: doneness, displayName: DONENESS_INFO[doneness].displayName, description: DONENESS_INFO[doneness].description, }, cookMethod: { method: cookMethod, displayName: COOK_METHOD_INFO[cookMethod].displayName, tempRange: COOK_METHOD_INFO[cookMethod].tempRange, }, timeEstimate: { totalMinutes: estimate.totalMinutes, hoursAndMinutes: estimate.hoursAndMinutes, confidence: estimate.confidence, estimatedDoneTime: estimate.estimatedDoneTime.toISOString(), }, timeline: startTimeInfo ? { startTime: startTimeInfo.startTime.toISOString(), restTimeMinutes: startTimeInfo.restTime, bufferMinutes: startTimeInfo.bufferMinutes, } : null, rest: { required: profile.requiresRest, minutes: profile.restTimeMinutes, }, stall: profile.stallRange ? { expectedRange: profile.stallRange, warning: "Temperature may plateau for 2-4 hours in this range", } : null, tips: profile.tips, assumptions: estimate.assumptions, warnings: estimate.warnings, }; return { content: [{ type: "text", text: JSON.stringify(output, null, 2) }], structuredContent: output, }; } const markdown = formatCookingGuidanceMarkdown( profile, params.weight_pounds, targetTemp, pullTemp, doneness, cookMethod, estimate, startTimeInfo ); 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 guidance: ${message}` }], }; } } );
  • Alternative handler implementation for Smithery deployment with inline Zod schema. Logic mirrors main handler.
    server.tool( "bbq_get_cooking_guidance", "Get comprehensive cooking guidance for a protein", { protein_type: z.string().describe("Type of protein (e.g., 'beef_brisket')"), weight_pounds: z.number().positive().describe("Weight in pounds"), target_doneness: z.string().optional().describe("Target doneness level"), cook_method: z.string().optional().describe("Cooking method"), serving_time: z.string().optional().describe("Target serving time (ISO 8601)"), }, async ({ protein_type, weight_pounds, target_doneness, cook_method, serving_time }) => { try { const profile = getProteinProfile(protein_type as ProteinType); const method = (cook_method as CookMethod) || getRecommendedCookMethod(protein_type as ProteinType); const { targetTemp, pullTemp, doneness } = getTargetTemperature( protein_type as ProteinType, target_doneness as DonenessLevel | undefined ); const timeEstimate = estimateCookTime(protein_type as ProteinType, weight_pounds, method); let startTimeInfo: { startTime: Date; restTime: number; bufferMinutes: number } | undefined; if (serving_time) { const result = calculateStartTime( protein_type as ProteinType, weight_pounds, method, new Date(serving_time) ); startTimeInfo = { startTime: result.startTime, restTime: result.restTime, bufferMinutes: result.bufferMinutes, }; } const markdown = formatCookingGuidanceMarkdown( profile, weight_pounds, targetTemp, pullTemp, doneness, method, timeEstimate, startTimeInfo ); return { content: [{ type: "text", text: markdown }] }; } catch (error) { const message = error instanceof Error ? error.message : "Unknown error"; return { content: [{ type: "text", text: `Error: ${message}` }], isError: true }; } }
  • Key helper function getTargetTemperature used by the handler to compute target and pull temperatures based on protein and doneness.
    export function getTargetTemperature( proteinType: ProteinType, doneness?: DonenessLevel ): { targetTemp: number; pullTemp: number; doneness: DonenessLevel } { const profile = getProteinProfile(proteinType); // Determine the doneness to use let actualDoneness: DonenessLevel; if (doneness && profile.donenessTemps[doneness] !== undefined) { actualDoneness = doneness; } else { // Use the first available doneness (most common/recommended) const availableDoneness = Object.keys(profile.donenessTemps) as DonenessLevel[]; actualDoneness = availableDoneness[0]; } const targetTemp = profile.donenessTemps[actualDoneness] ?? profile.usdaSafeTemp; const pullTemp = targetTemp - profile.carryoverDegrees; return { targetTemp, pullTemp, doneness: actualDoneness }; }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/jweingardt12/bbq-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server