thermoworks_get_live_readings
Retrieve real-time temperature data from ThermoWorks BBQ probes to monitor your cook. Specify a device or get readings from all connected probes.
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:1230-1299 (handler)Main handler function for thermoworks_get_live_readings tool. Fetches live temperature readings from authenticated ThermoWorks devices, handles specific device or all devices, supports JSON/markdown output, includes alarms and timestamps.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 device_serial (optional) 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/index.ts:1204-1229 (registration)Tool registration in the main MCP server using server.registerTool with title, description, input schema, 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/services/thermoworks.ts:358-369 (helper)Key helper methods in ThermoWorksClient: getDeviceReadings and getAllReadings, which handle token refresh and fetch data from Firebase Realtime Database.async getDeviceReadings(serial: string): Promise<DeviceReading | null> { await this.ensureValidToken(); return getDeviceReadings(this.idToken!, this.userId!, serial, this.useSmokeLegacy); } /** * Get all device readings */ async getAllReadings(): Promise<DeviceReading[]> { await this.ensureValidToken(); return getAllDeviceReadings(this.idToken!, this.userId!, this.useSmokeLegacy); }
- src/services/thermoworks.ts:385-390 (helper)Singleton factory for ThermoWorksClient used by the handler to get the authenticated client instance.export function getThermoWorksClient(useSmokeLegacy = false): ThermoWorksClient { if (!globalClient) { globalClient = new ThermoWorksClient(useSmokeLegacy); } return globalClient; }