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
JavaScript
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"
};
}
}
}