MCP server for GPIO control on ESP32-C6 microcontroller, supporting digital I/O, ADC, and PWM operations via HTTP/JSON-RPC
14 tools with mixed quality. Naming is strong (verb-first, clear intent). Descriptions are present and detailed (100-200 chars typical), exceeding baseline. Schemas are well-structured with enums and constraints visible in code. However, critical gaps: (1) draw_path has no items schema for points array, LLM cannot infer point structure; (2) draw_rect, draw_line, draw_arc, draw_text lack minItems/maxItems on color params; (3) no output schemas documented for any tool; (4) no error handling guidance (e.g., what if ADC read fails? what if I2C scan times out?); (5) no idempotency hints on write operations. GPIO tools are stronger than display tools. Overall: solid naming and descriptions, but incomplete schemas and missing error recovery patterns.
Fill the entire 172x320 canvas with a solid colour. Call before drawing a new scene to erase previous content. Params: r, g, b (0-255 each, all optional, default 0).
Configure GPIO pins for INPUT, OUTPUT, ADC, or PWM mode. INPUT uses pull-up. OUTPUT starts LOW. ADC reads in millivolts (ADC-capable pins only). PWM requires prior setup.
Draw a circular arc. cx,cy: centre (x: 0-171, y: 0-319). radius: 1-160. start_angle/end_angle: 0-360 degrees (0=3-o-clock, increases clockwise). Full circle: start=0 end=360. r,g,b: colour 0-255 (default 255). width: stroke width 1-10 (optional, default 2).
Draw a straight line from (x1,y1) to (x2,y2). Coordinates: x 0-171, y 0-319. r,g,b: colour 0-255 (default 255). width: stroke width 1-10 pixels (optional, default 1).
Draw a polyline (open) or polygon (closed). points: array of {"x":N,"y":N} objects, 2 to 8 points. closed: false=polyline, true=polygon (default false). filled: true=solid fill, only effective when closed=true (default false). r,g,b: colour 0-255 (default 255). width: stroke 1-10 (optional, default 1).
draw_path points array lacks items schema, LLM cannot infer that each point is {x:int, y:int}. Schema shows array type but no items definition.
No output schemas documented for any of 14 tools. LLMs cannot plan downstream calls or extract required fields (e.g., what does i2c_scan return? array of ints? objects with address+name?). Violates pattern:tool.
No error handling guidance. What happens if configure_pins tries to set ADC on a non-ADC pin? If i2c_scan times out? If draw_text exceeds 127 chars? No recovery hints for LLM.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 68 | 2026-07-28+ | v2 |
Draw a filled or outlined rectangle. x,y: top-left corner (x: 0-171, y: 0-319). w,h: size in pixels (min 1). r,g,b: colour 0-255 (default 255). filled: true=solid, false=outline (default true). radius: corner rounding 0-20 (optional, default 0).
Render a text string. x,y: top-left of text box (x: 0-171, y: 0-319). r,g,b: colour 0-255 (default 255). font_size: must be exactly 14 or 20 (Montserrat, only these two sizes available). text: UTF-8 string up to 127 chars; wraps at screen edge.
Returns screen dimensions, draw queue depth, and available primitives. Call this first to understand the canvas before drawing. No parameters.
Captures the current canvas as a JPEG image (86x160 px, 2x downsampled) and returns it as a base64-encoded MCP image item so you can see the display. Encoding takes ~200 ms. Call after drawing to verify results. No parameters.
Returns the list of safe GPIO numbers available on this board, and which are ADC-capable.
Scan I2C bus for connected devices. Returns list of 7-bit slave addresses found (0x00–0x7F).
Read current state of GPIO pins. Returns 0/1 for INPUT/OUTPUT pins and millivolts for ADC pins. Do NOT poll this in a rapid loop — use it to snapshot current state.
Set PWM duty cycle (0-100%) on PWM-configured GPIO pins. 0 = always off (0V), 100 = always on (3.3V), 50 = half brightness.
Write logic levels (0 or 1) to OUTPUT-configured GPIO pins. Do NOT write to INPUT or ADC pins.
Write operations (write_digital_pins, set_pwm_duty, clear_canvas, draw_*) lack idempotency hints and confirmation patterns. No dry-run or confirmation step for destructive display operations.
Display tools (draw_rect, draw_line, draw_arc, draw_text) have optional color params (r, g, b) with no minItems/maxItems or range constraints in visible schema. Default 255 is stated in description but not enforced in schema.