send-command
Send commands like restart, update, or status to NodeMCU/ESP8266 IoT devices remotely via the MCP server. Specify device ID and optional parameters for efficient device management.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| command | Yes | The command to send (restart, update, status, etc.) | |
| deviceId | Yes | The ID of the device to send the command to | |
| params | No | Optional parameters for the command |
Implementation Reference
- services/DeviceManager.js:96-153 (handler)Core handler implementation that sends the command via WebSocket to the NodeMCU device, waits for response with timeout, and handles errors.async sendCommand(deviceId, command, params = {}) { const ws = this.connections.get(deviceId); if (!ws || ws.readyState !== 1) { // WebSocket.OPEN = 1 throw new Error('Device not connected'); } return new Promise((resolve, reject) => { try { // Generate unique command ID const commandId = Date.now().toString(36) + Math.random().toString(36).substr(2, 5); // Create message const message = { type: 'command', commandId, command, params }; // Set up one-time response handler const responseHandler = (event) => { try { const response = JSON.parse(event.data); if (response.type === 'commandResponse' && response.commandId === commandId) { ws.removeEventListener('message', responseHandler); resolve(response.data); } } catch (error) { // Ignore non-JSON messages } }; // Set timeout for command const timeout = setTimeout(() => { ws.removeEventListener('message', responseHandler); reject(new Error('Command timed out')); }, 5000); // Add response handler ws.addEventListener('message', responseHandler); // Send command ws.send(JSON.stringify(message)); // Notify listeners this._notifyListeners('commandSent', { deviceId, command, params, commandId }); } catch (error) { reject(error); } }); }
- mcp_server_sdk.js:84-118 (handler)MCP SDK tool handler for 'send-command', validates inputs, calls DeviceManager.sendCommand, and formats MCP response.server.tool( "send-command", { deviceId: z.string().describe("The ID of the device to send the command to"), command: z.string().describe("The command to send (restart, update, status, etc.)"), params: z.record(z.any()).optional().describe("Optional parameters for the command") }, async ({ deviceId, command, params = {} }) => { try { if (!deviceId) { throw new Error('Device ID is required'); } if (!command) { throw new Error('Command is required'); } const result = await deviceManager.sendCommand(deviceId, command, params); return { content: [{ type: "text", text: JSON.stringify({ success: true, deviceId, command, result }, null, 2) }] }; } catch (error) { console.error('Error sending command:', error); throw new Error(`Failed to send command: ${error.message}`); } }
- mcp_server.js:27-42 (schema)JSON schema definition for the send-command tool parameters."send-command": { description: "Send a command to a NodeMCU device", parameters: { deviceId: { type: "string", description: "The ID of the device to send the command to" }, command: { type: "string", description: "The command to send (restart, update, status, etc.)" }, params: { type: "object", description: "Optional parameters for the command" } }
- mcp_server.js:148-162 (handler)Custom MCP server wrapper handler for send-command tool.async sendCommand(deviceId, command, params) { if (!deviceId) { throw new Error('Device ID is required'); } if (!command) { throw new Error('Command is required'); } try { return await deviceManager.sendCommand(deviceId, command, params); } catch (error) { throw new Error(`Failed to send command: ${error.message}`); } }
- mcp_server.js:65-65 (registration)Tool definitions (including send-command) registered during MCP initialization.tools: this.toolDefinitions