Skip to main content
Glama

bbq_analyze_device_reading

Analyzes temperature readings from ThermoWorks BBQ devices to provide cooking insights, detect stalls, estimate cook times, and offer protein-specific recommendations.

Instructions

Analyze temperature readings from a ThermoWorks device (Signals, Smoke, BlueDOT).

Simulates integration with ThermoWorks Cloud to provide analysis of multi-probe readings.

Args:

  • device_type: Type of ThermoWorks device ('Signals', 'Smoke', 'BlueDOT')

  • probe_readings: Array of probe readings with {probe_id, name, temperature}

  • protein_type: Type of protein being cooked (optional)

  • target_temp: Target temperature (optional)

  • response_format: 'markdown' or 'json'

Examples:

  • "Signals reading: Probe 1 at 165°F, Ambient at 250°F"

  • "Smoke shows 180°F on the meat probe"

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
device_typeYesType of ThermoWorks device
probe_readingsYesTemperature readings from each probe
protein_typeNoType of protein being cooked (if known)
target_tempNoTarget temperature set on device
response_formatNoOutput formatmarkdown

Implementation Reference

  • The inline asynchronous handler function for the bbq_analyze_device_reading tool. It identifies the meat probe from readings, optionally performs temperature analysis if protein_type and target_temp are provided using analyzeTemperature, formats the output as markdown using formatDeviceReadingMarkdown or JSON, and handles errors.
    async (params: SimulateDeviceReadingInput) => { try { // Find the meat probe (not ambient) const meatProbe = params.probe_readings.find( (p) => !p.probe_id.toLowerCase().includes("ambient") && !p.name?.toLowerCase().includes("ambient") ); let analysis: ReturnType<typeof analyzeTemperature> | undefined; if (meatProbe && params.protein_type && params.target_temp) { analysis = analyzeTemperature( meatProbe.temperature, params.target_temp, params.protein_type ); } if (params.response_format === "json") { const output = { deviceType: params.device_type, probeReadings: params.probe_readings, proteinType: params.protein_type, targetTemp: params.target_temp, analysis: analysis ? { currentTemp: analysis.currentTemp, targetTemp: analysis.targetTemp, percentComplete: analysis.percentComplete, tempDelta: analysis.tempDelta, recommendations: analysis.recommendations, } : null, }; return { content: [{ type: "text", text: JSON.stringify(output, null, 2) }], structuredContent: output, }; } const markdown = formatDeviceReadingMarkdown( params.device_type, params.probe_readings, analysis ); 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 analyzing device reading: ${message}` }], }; }
  • src/index.ts:824-905 (registration)
    Registration of the bbq_analyze_device_reading tool on the MCP server, including title, description, input schema (SimulateDeviceReadingSchema), annotations, and reference to the inline handler.
    server.registerTool( "bbq_analyze_device_reading", { title: "Analyze ThermoWorks Device Reading", description: `Analyze temperature readings from a ThermoWorks device (Signals, Smoke, BlueDOT). Simulates integration with ThermoWorks Cloud to provide analysis of multi-probe readings. Args: - device_type: Type of ThermoWorks device ('Signals', 'Smoke', 'BlueDOT') - probe_readings: Array of probe readings with {probe_id, name, temperature} - protein_type: Type of protein being cooked (optional) - target_temp: Target temperature (optional) - response_format: 'markdown' or 'json' Examples: - "Signals reading: Probe 1 at 165°F, Ambient at 250°F" - "Smoke shows 180°F on the meat probe"`, inputSchema: SimulateDeviceReadingSchema, annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false, }, }, async (params: SimulateDeviceReadingInput) => { try { // Find the meat probe (not ambient) const meatProbe = params.probe_readings.find( (p) => !p.probe_id.toLowerCase().includes("ambient") && !p.name?.toLowerCase().includes("ambient") ); let analysis: ReturnType<typeof analyzeTemperature> | undefined; if (meatProbe && params.protein_type && params.target_temp) { analysis = analyzeTemperature( meatProbe.temperature, params.target_temp, params.protein_type ); } if (params.response_format === "json") { const output = { deviceType: params.device_type, probeReadings: params.probe_readings, proteinType: params.protein_type, targetTemp: params.target_temp, analysis: analysis ? { currentTemp: analysis.currentTemp, targetTemp: analysis.targetTemp, percentComplete: analysis.percentComplete, tempDelta: analysis.tempDelta, recommendations: analysis.recommendations, } : null, }; return { content: [{ type: "text", text: JSON.stringify(output, null, 2) }], structuredContent: output, }; } const markdown = formatDeviceReadingMarkdown( params.device_type, params.probe_readings, analysis ); 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 analyzing device reading: ${message}` }], }; } } );
  • Zod schema definition for input validation of the bbq_analyze_device_reading tool, defining parameters like device_type, probe_readings array, optional protein_type, target_temp, and response_format.
    export const SimulateDeviceReadingSchema = z .object({ device_type: z.enum(["Signals", "Smoke", "BlueDOT"]).describe("Type of ThermoWorks device"), probe_readings: z .array( z.object({ probe_id: z.string().describe("Probe identifier (e.g., 'probe1', 'ambient')"), name: z.string().optional().describe("Custom name for this probe"), temperature: z.number().describe("Temperature reading"), }) ) .min(1) .max(4) .describe("Temperature readings from each probe"), protein_type: ProteinTypeSchema.optional().describe("Type of protein being cooked (if known)"), target_temp: z.number().optional().describe("Target temperature set on device"), response_format: ResponseFormatSchema.describe("Output format"), }) .strict(); export type SimulateDeviceReadingInput = z.infer<typeof SimulateDeviceReadingSchema>;
  • Helper function to format the device readings and optional temperature analysis into a readable Markdown output for the tool response.
    export function formatDeviceReadingMarkdown( deviceType: string, probeReadings: Array<{ probe_id: string; name?: string; temperature: number }>, analysis?: TemperatureAnalysis ): string { let output = `## 📱 ThermoWorks ${deviceType} Reading\n\n`; for (const probe of probeReadings) { const name = probe.name || probe.probe_id; output += `**${name}:** ${probe.temperature}°F\n`; } if (analysis) { output += `\n---\n\n`; output += formatTemperatureAnalysisMarkdown(analysis); } return output; }

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