UNPKG

domotz-mcp

Version:

MCP server for Domotz API and BMS (Building Management System) integration with IoT device monitoring

110 lines (109 loc) 4.53 kB
import { z } from "zod"; import { MCPTool } from "mcp-framework"; import { mqttPersistentManager } from "./MQTTPersistentManager.js"; export default class MQTTSubscribeTool extends MCPTool { name = "mqtt_subscribe"; description = "Subscribe to MQTT topics with persistent message storage"; schema = { connection_id: { type: z.string(), description: "The connection ID from mqtt_connect" }, topic: { type: z.string(), description: "MQTT topic to subscribe to (supports wildcards: + and #)" }, qos: { type: z.number().optional(), description: "Quality of Service level (0, 1, or 2, default: 0)" }, persistent: { type: z.boolean().optional(), description: "Enable persistent subscription with database storage (default: true)" } }; async execute(params) { try { const { connection_id, topic, qos = 0, persistent = true } = params; if (persistent) { // Use persistent subscription manager const result = mqttPersistentManager.startPersistentSubscription(connection_id, topic, qos); if (result.success) { // Get current statistics const db = mqttPersistentManager.getDatabaseManager(); const stats = db.getStatistics(); const subscriptions = db.getActiveSubscriptions(connection_id); return { success: true, message: "Persistent subscription started", subscription: { id: result.subscription_id, connection_id, topic, qos, persistent: true }, info: { total_messages_stored: stats.total_messages, active_subscriptions: subscriptions.length, retention_days: stats.retention_days, help: "Use mqtt_query to retrieve stored messages, mqtt_subscriptions to manage subscriptions" } }; } else { return { success: false, error: result.error }; } } else { // Legacy non-persistent subscription (just adds to active client) const { mqttConnections } = await import("./MQTTConnectionTool.js"); const client = mqttConnections.get(connection_id); if (!client) { return { success: false, error: "No active connection found with the specified ID" }; } if (!client.connected) { return { success: false, error: "MQTT client is not connected" }; } return new Promise((resolve) => { client.subscribe(topic, { qos: qos }, (err) => { if (err) { resolve({ success: false, error: `Failed to subscribe: ${err.message}` }); } else { resolve({ success: true, message: "Non-persistent subscription active", subscription: { connection_id, topic, qos, persistent: false }, warning: "Non-persistent mode: messages are not stored. Use persistent=true for message storage." }); } }); }); } } catch (error) { return { success: false, error: error.message || "Failed to subscribe to topic" }; } } }