MCP Server for ESP32-S3 Task VM — AI-Defined Hardware bridge. Bridges Claude Code to ESP32 via MQTT, exposing every hardware capability as a typed MCP tool. AI speaks natural language → MCP tool → MQTT → ESP32.
30 tools with mixed quality. Most have basic descriptions (50-150 chars) and JSON Schema input definitions, but lack depth in parameter documentation and output schema specification. No tool annotations (readOnlyHint/destructiveHint). Error handling is minimal, most tools return raw MQTT responses without recovery guidance. Parameter descriptions are often generic ('GPIO pin number') without constraints, ranges, or format hints. Output schemas are not documented; LLMs cannot predict response structure. Naming is mostly verb_noun (gpio_write, read_dht) but some tools are vague (store, config). No pagination support despite tools like instr_list and fw_list that could return multiple items. Security concern: fw_download accepts arbitrary URLs without validation hints.
Get metadata about available actions, sensors, and pins for discoverability
Play multiple beeps with configurable count, frequency, duration, and gap
Clear all pending tasks from the queue
Update device configuration remotely without reflashing
Confirm current firmware and cancel automatic rollback
Download and flash new firmware from a URL to an OTA partition
List all firmware partitions and their status
No output schemas documented. LLMs cannot predict response structure for any tool. Tools like fw_list, instr_list, get_telemetry return arrays/objects but no schema is visible.
Parameter descriptions lack constraints, ranges, and formats. E.g., 'pin' is 'GPIO pin number' but no valid range (0-48 for ESP32-S3?). 'duty' is 0-255 but no mention of units or default behavior.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). LLMs cannot distinguish safe reads from destructive writes without explicit hints. fw_download, instr_delete, clear are irreversible but unmarked.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 55 | 2026-07-28+ | v2 |
Restart the ESP32 device
Switch the boot partition for next restart
Get the latest cached telemetry data from the ESP32
Read a digital value from a GPIO pin
Write a digital value to a GPIO pin
Delete a saved composite instruction
Get the currently configured auto-run instruction
List all saved composite instructions
Execute a saved composite instruction
Save a composite instruction (sequence of steps) for later execution
Set an instruction to automatically run on device boot
Control the built-in LED on the ESP32
Play a musical note by name and duration
Check device connectivity and get device status
Write a PWM signal to a pin with specified duty cycle and frequency
Read analog value from an ADC pin
Read temperature and humidity from a DHT sensor
Read a variable value from the ESP32 variable store
Execute a task with steps, priority, and optional scheduling
Write an angle to a servo motor
Store a value or expression result in the variable store
Play a tone at specified frequency and duration
Write a value to the ESP32 variable store
Vague tool names: 'store' and 'config' lack verb clarity. 'store' could mean cache, persist, or queue. 'config' could mean read or write. Should be 'write_variable' (exists) and 'update_config' or 'set_config'.
No error recovery guidance. Tools return raw MQTT responses (timeout, error) without actionable next steps. E.g., 'fw_download timeout', should suggest 'Check URL accessibility or retry with a smaller firmware file.'