Skip to main content
Glama

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

TableJSON Schema
NameRequiredDescriptionDefault
device_serialNoSerial number of specific device to query. If not provided, returns readings from all devices.
response_formatNoOutput formatmarkdown

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, }, },
  • 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}` }], }; } }
  • 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>;
  • 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", }; }

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