thermoworks_get_live_readings
Retrieve real-time temperature data from ThermoWorks probes to monitor BBQ cooking progress. View current readings, alarm settings, and timestamps for specific devices or all connected units.
Instructions
Get current temperature readings from your ThermoWorks devices.
Requires authentication first via thermoworks_authenticate.
Args:
device_serial: Serial number of specific device (optional, defaults to all devices)
response_format: 'markdown' or 'json'
Returns: Current probe temperatures, alarm settings, and timestamps.
Examples:
"What are my current temperatures?" -> Gets all device readings
"Show me the Signals readings" -> Specify device_serial
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| device_serial | No | Serial number of specific device to query. If not provided, returns readings from all devices. | |
| response_format | No | Output format | markdown |
Implementation Reference
- src/index.ts:1204-1229 (registration)Registration of the thermoworks_get_live_readings tool with title, description, GetLiveReadingsSchema, and annotations.server.registerTool( "thermoworks_get_live_readings", { title: "Get Live Temperature Readings", description: `Get current temperature readings from your ThermoWorks devices. Requires authentication first via thermoworks_authenticate. Args: - device_serial: Serial number of specific device (optional, defaults to all devices) - response_format: 'markdown' or 'json' Returns: Current probe temperatures, alarm settings, and timestamps. Examples: - "What are my current temperatures?" -> Gets all device readings - "Show me the Signals readings" -> Specify device_serial`, inputSchema: GetLiveReadingsSchema, annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: false, // Readings change over time openWorldHint: true, }, },
- src/index.ts:1230-1299 (handler)The handler function that implements the tool logic: authenticates, fetches live readings from ThermoWorks devices (specific or all), formats output as markdown table or JSON.async (params: GetLiveReadingsInput) => { try { const client = getThermoWorksClient(); if (!client.isAuthenticated()) { return { isError: true, content: [ { type: "text", text: "Not authenticated. Use `thermoworks_authenticate` first.", }, ], }; } let readings; if (params.device_serial) { const reading = await client.getDeviceReadings(params.device_serial); readings = reading ? [reading] : []; } else { readings = await client.getAllReadings(); } if (readings.length === 0) { return { content: [ { type: "text", text: "No readings available. Make sure your devices are powered on and connected.", }, ], }; } if (params.response_format === "json") { return { content: [{ type: "text", text: JSON.stringify(readings, null, 2) }], structuredContent: { readings }, }; } let markdown = `## 🌡️ Live Temperature Readings\n\n`; markdown += `*Updated: ${new Date().toLocaleString()}*\n\n`; for (const reading of readings) { markdown += `### ${reading.name} (${reading.serial})\n\n`; for (const [probeId, probe] of Object.entries(reading.probes)) { const alarmStr = probe.alarm_high || probe.alarm_low ? ` (Alarm: ${probe.alarm_low || "—"}–${probe.alarm_high || "—"}°${reading.unit})` : ""; markdown += `- **${probe.name || `Probe ${probeId}`}:** ${probe.temp}°${reading.unit}${alarmStr}\n`; } markdown += "\n"; } return { content: [{ type: "text", text: markdown }], }; } catch (error) { const message = error instanceof Error ? error.message : "Failed to get readings"; return { isError: true, content: [{ type: "text", text: `Error: ${message}` }], }; } }
- src/schemas/auth.ts:44-54 (schema)Zod input schema for the tool defining optional device_serial and response_format parameters.export const GetLiveReadingsSchema = z .object({ device_serial: z .string() .optional() .describe("Serial number of specific device to query. If not provided, returns readings from all devices."), response_format: ResponseFormatSchema.describe("Output format"), }) .strict(); export type GetLiveReadingsInput = z.infer<typeof GetLiveReadingsSchema>;
- src/services/thermoworks.ts:193-231 (helper)Helper function that performs the actual Firebase API call to retrieve the most recent readings for a specific ThermoWorks device.export async function getDeviceReadings( idToken: string, userId: string, serial: string, useSmokeLegacy = false ): Promise<DeviceReading | null> { const config = useSmokeLegacy ? THERMOWORKS_SMOKE_FIREBASE_CONFIG : THERMOWORKS_FIREBASE_CONFIG; // Device readings are typically stored under a readings or data path const response = await fetch( `${config.databaseURL}/users/${userId}/devices/${serial}/readings.json?auth=${idToken}&orderBy="$key"&limitToLast=1` ); if (!response.ok) { throw new Error("Failed to fetch device readings."); } const data = await response.json(); if (!data) { return null; } // Get the most recent reading const entries = Object.entries(data); if (entries.length === 0) { return null; } const [timestamp, reading] = entries[0] as [string, Record<string, unknown>]; return { serial, name: (reading.name as string) || serial, probes: (reading.probes as Record<string, ProbeData>) || {}, timestamp: new Date(parseInt(timestamp)), unit: (reading.unit as "F" | "C") || "F", }; }