Skip to main content
Glama

Get Target Temperature

bbq_get_target_temperature
Read-onlyIdempotent

Retrieve target cooking temperatures for BBQ proteins, including pull temperatures to account for carryover cooking, ensuring proper doneness levels.

Instructions

Get the target internal temperature for a specific protein and doneness level.

Returns both the target serving temperature and the pull temperature (when to remove from heat) accounting for carryover cooking.

Args:

  • protein_type: Type of protein

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

  • include_pull_temp: Whether to include pull temperature (default: true)

  • response_format: 'markdown' or 'json'

Examples:

  • "What temp for medium-rare ribeye?" -> protein_type='beef_ribeye', doneness='medium_rare'

  • "When is chicken done?" -> protein_type='chicken_whole'

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
protein_typeYesType of protein
donenessNoDesired doneness level
include_pull_tempNoWhether to include pull temperature (accounting for carryover)
response_formatNoOutput formatmarkdown

Implementation Reference

  • Primary handler function for bbq_get_target_temperature tool, registers the tool and implements logic using getTargetTemperature helper with JSON/markdown output support
      "bbq_get_target_temperature",
      {
        title: "Get Target Temperature",
        description: `Get the target internal temperature for a specific protein and doneness level.
    
    Returns both the target serving temperature and the pull temperature (when to remove from heat) accounting for carryover cooking.
    
    Args:
      - protein_type: Type of protein
      - doneness: Desired doneness level (optional, uses recommended if not specified)
      - include_pull_temp: Whether to include pull temperature (default: true)
      - response_format: 'markdown' or 'json'
    
    Examples:
      - "What temp for medium-rare ribeye?" -> protein_type='beef_ribeye', doneness='medium_rare'
      - "When is chicken done?" -> protein_type='chicken_whole'`,
        inputSchema: GetTargetTemperatureSchema,
        annotations: {
          readOnlyHint: true,
          destructiveHint: false,
          idempotentHint: true,
          openWorldHint: false,
        },
      },
      async (params: GetTargetTemperatureInput) => {
        try {
          const profile = getProteinProfile(params.protein_type);
          const { targetTemp, pullTemp, doneness } = getTargetTemperature(
            params.protein_type,
            params.doneness
          );
    
          if (params.response_format === "json") {
            const output = {
              proteinType: params.protein_type,
              displayName: profile.displayName,
              doneness: {
                level: doneness,
                displayName: DONENESS_INFO[doneness].displayName,
                description: DONENESS_INFO[doneness].description,
              },
              temperatures: {
                target: targetTemp,
                pull: params.include_pull_temp ? pullTemp : undefined,
                carryover: profile.carryoverDegrees,
                usdaSafeMin: profile.usdaSafeTemp,
              },
              allDonenessOptions: Object.entries(profile.donenessTemps).map(([level, temp]) => ({
                level,
                displayName: DONENESS_INFO[level as DonenessLevel]?.displayName || level,
                temperature: temp,
              })),
            };
    
            return {
              content: [{ type: "text", text: JSON.stringify(output, null, 2) }],
              structuredContent: output,
            };
          }
    
          const markdown = formatTargetTempMarkdown(profile, targetTemp, pullTemp, doneness);
          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 target temperature: ${message}` }],
          };
        }
      }
    );
  • Smithery-specific handler for bbq_get_target_temperature tool using inline Zod schema and markdown output
    server.tool(
      "bbq_get_target_temperature",
      "Get target and pull temps for a protein",
      {
        protein_type: z.string().describe("Type of protein"),
        doneness: z.string().optional().describe("Desired doneness"),
      },
      async ({ protein_type, doneness }) => {
        try {
          const { targetTemp, pullTemp, doneness: actualDoneness } = getTargetTemperature(
            protein_type as ProteinType,
            doneness as DonenessLevel | undefined
          );
          const profile = getProteinProfile(protein_type as ProteinType);
          const text = `## ${profile.displayName}\n\n**Target:** ${targetTemp}°F\n**Pull At:** ${pullTemp}°F\n**Doneness:** ${DONENESS_INFO[actualDoneness]?.displayName || actualDoneness}`;
          return { content: [{ type: "text", text }] };
        } catch (error) {
          const message = error instanceof Error ? error.message : "Unknown error";
          return { content: [{ type: "text", text: `Error: ${message}` }], isError: true };
        }
      }
    );
  • Zod input schema for bbq_get_target_temperature tool parameters including protein_type, doneness, include_pull_temp, and response_format
    export const GetTargetTemperatureSchema = z
      .object({
        protein_type: ProteinTypeSchema.describe("Type of protein"),
        doneness: DonenessLevelSchema.optional().describe("Desired doneness level"),
        include_pull_temp: z
          .boolean()
          .default(true)
          .describe("Whether to include pull temperature (accounting for carryover)"),
        response_format: ResponseFormatSchema.describe("Output format"),
      })
      .strict();
    
    export type GetTargetTemperatureInput = z.infer<typeof GetTargetTemperatureSchema>;
  • Core helper function that implements the temperature calculation logic based on protein profiles and doneness levels, used by both handlers
     * Get the target temperature for a protein at a specific 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 };
    }
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, but the description adds valuable behavioral context beyond annotations by explaining that it 'returns both the target serving temperature and the pull temperature (when to remove from heat) accounting for carryover cooking.' This provides important operational details about the tool's behavior that annotations don't cover.

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

Conciseness5/5

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

The description is perfectly structured and front-loaded: the first sentence states the core purpose, followed by key behavioral details, then parameter explanations with practical examples. Every sentence serves a clear purpose with zero waste, making it highly efficient for an AI agent to parse.

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, rich annotations, and complete schema coverage, the description provides excellent contextual completeness. It explains the tool's purpose, key behavioral aspects (carryover cooking consideration), and includes practical examples. The only minor gap is the lack of output schema, but the description adequately compensates by describing what the tool returns.

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?

With 100% schema description coverage, the schema already documents all parameters thoroughly. The description adds minimal additional parameter semantics beyond what's in the schema - mainly clarifying that doneness is optional and uses recommended defaults if not specified, which is already implied by the schema's structure. This meets the baseline expectation when schema coverage is complete.

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 specific action ('Get the target internal temperature') and resource ('for a specific protein and doneness level'), distinguishing it from siblings like bbq_analyze_temperature or bbq_estimate_cook_time. It precisely defines what the tool does without being tautological.

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 about when to use this tool (to get target temperatures with carryover cooking considerations) and includes examples that illustrate typical use cases. However, it doesn't explicitly state when NOT to use it or name specific alternatives among the sibling tools.

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