Skip to main content
Glama

Get Cooking Tips

bbq_get_cooking_tips
Read-onlyIdempotent

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

TableJSON Schema
NameRequiredDescriptionDefault
protein_typeYesType of protein
cook_methodNoSpecific cooking method for targeted tips
current_phaseNoCurrent phase of the cook for phase-specific tips
response_formatNoOutput formatmarkdown

Implementation Reference

  • 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}` }],
          };
        }
      }
    );
  • 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>;
  • 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;
    }
  • 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;
    }
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate read-only, non-destructive, and idempotent behavior, which the description doesn't contradict. The description adds valuable context beyond annotations by specifying the tool's focus on 'tips and best practices' and providing usage examples, though it doesn't detail rate limits or authentication needs. With annotations covering safety, this earns a strong score for added practical guidance.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear purpose statement, arg explanations, and examples, all in a compact format. Every sentence adds value, but the inclusion of a full enum list for current_phase in the description is slightly redundant given the schema, preventing a perfect score for optimal conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity (4 parameters, no output schema), the description is largely complete. It covers purpose, parameters via examples, and usage context. However, it doesn't detail output behavior (e.g., format of tips returned) or potential errors, which could enhance completeness for an agent, though annotations help mitigate this gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with each parameter well-documented in the schema (e.g., enums and descriptions). The description adds minimal semantics beyond the schema, mainly through examples that illustrate parameter usage (e.g., mapping 'Help with the stall' to current_phase='stall'). This meets the baseline of 3 for high schema coverage without significant extra value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose as 'Get cooking tips and best practices for a specific protein and situation,' which is a specific verb (get) + resource (cooking tips) with clear scope. It effectively distinguishes itself from siblings like bbq_get_cooking_guidance (likely more general) or bbq_analyze_temperature (technical measurement).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for usage through examples (e.g., 'Tips for smoking brisket' maps to specific parameters) and implies when to use it—for targeted cooking advice. However, it lacks explicit guidance on when NOT to use it or direct alternatives among siblings (e.g., vs. bbq_get_cooking_guidance), keeping it from a perfect score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

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