Skip to main content
Glama

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

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

Implementation Reference

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

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