UsbServoController
OfficialControl and monitor a USB servo controller, including motion, poses/sequences, sensing, protection, faults, and on-board scripting.
Inspect board status: rail current/voltage, faults, limits, and all channel state.
Move servos by channel number/name with optional coordinated duration, clamped to limits.
Disable selected servos or panic-stop all channels.
List saved poses, move to a pose, and play the GUI-saved sequence with loop count.
Read analog inputs on channels 0–7 and sample peak/mean/min servo-rail current.
Set overcurrent/undervoltage trips and clear latched faults.
Upload, inspect, run, and stop on-board scripts, including autorun at power-up.
Release the serial port so the GUI or flash tool can use the board.
USB-C 12-Channel Servo Controller
12-channel USB-C servo controller, Pololu Maestro compatible, with an MCP server so AI agents (Claude, etc.) can drive servos. $18 on Tindie · product page.
Open-source alternative to the Pololu Mini Maestro 12 that speaks the Maestro serial protocols, so Maestro libraries work unchanged — plus USB-C, servo-rail current and voltage sensing, on-board scripts. Built for JLCPCB turnkey assembly, ≈ $4.43 per board at 100 units against $29.95 for the Maestro.
MCU | WCH CH32V203C8T6, RISC-V 96 MHz, LQFP-48 |
Channels | 12 hardware PWM, 50 Hz, 0.5 µs; travel limits per channel (64–4080 µs, 500–2500 default); analog input on 0–7 |
Host interface | USB-C, CDC serial (no driver); ASCII protocol and the Pololu Maestro Compact / Pololu / Mini SSC protocols |
Servo power | separate rail on a 5.08 mm screw terminal, 5–13.2 V full function, ~5 A total |
Sensing | rail current (5 mΩ + INA180A2) and voltage (÷4), overcurrent / LiPo undervoltage cut-off |
PCB | 66 × 38 mm, 2 layers, all parts top side, 4 × M3 |
Status | first board verified on hardware 2026-09-28 — |
Document | For |
using the board: wiring, power, tools, command reference, flashing | |
host tools: library, CLI, GUI, scripts, MCP server, release builds | |
this file | design: why each choice, BOM and cost, limitations, what is left before fab |
AI agents (MCP server)
tools/servo_mcp.py is an MCP server that lets an AI agent move servos,
run poses and sequences, and read rail current/voltage, with guardrails: per-channel limits,
ramped moves, overcurrent stop. pip install -r tools/requirements.txt, then:
Claude Code
claude mcp add servo -- python /path/to/UsbServoController/tools/servo_mcp.pyClaude Desktop (claude_desktop_config.json)
{
"mcpServers": {
"servo": {
"command": "python",
"args": ["/path/to/UsbServoController/tools/servo_mcp.py"]
}
}
}Add "--port", "COM5" to pick a port, or "--mock" to try it without hardware.
Close the GUI first: only one program can hold the serial port.
The server is also on PyPI, so any MCP client can run it without cloning the repo:
command uvx, args ["ucan-servo-mcp"] (plus --config path/to/servogui.json
to use the limits, poses and sequences saved by the GUI).
Related MCP server: SO-ARM100 Robot Control MCP
1. Quick start
pip install -r tools/requirements.txt
python tools/servogui.py # GUI (or --mock with no hardware)
python tools/servoctl.py set 0 1500 # CLI
cd embedded-ch32 && make flash # build + flash over USB, ~3 s, no jumperDownloads: firmware images and the prebuilt GUI for Windows and Linux are on the
Releases page.
To build the GUI yourself: python tools/build_release.py → tools/dist/.
2. Why the CH32V203C8T6
The hard requirement was a USB bootloader in ROM, so a blank chip can be flashed over USB-C with no programmer. That rules out the STM32F103 the design started on (USART-only bootloader). Of LQFP-48 parts that have one and are stocked at JLCPCB:
Candidate | USB boot on blank chip | Stock | $@100 |
CH32V203C8T6 (chosen) | ✅ | 8,643 | 0.877 |
CH32X035C8T6 / CH32F203C8T6 | ✅ | ~500 | 0.72 / 1.02 |
AT32F415CBT7 | ✅ | 10,518 | 1.319 |
STM32F072C8T6 | ✅ | 2,945 | 2.495 |
Cheapest part with real inventory, a third the price of the STM32F072, and pin-compatible with the STM32F103 layout (32 of 33 connected pins identical).
Costs of the choice:
RISC-V firmware, WCH HAL, no CubeMX.
An ST-Link will not work. Debug is WCH 2-wire SDI on J9 — needs a WCH-LinkE. Routine flashing is over USB, so the probe is only for debugging.
PB2 is BOOT1 on this chip, so it is tied low by R17 (5.1 kΩ).
3. Hardware
U4 INA180A2 (Kelvin across R18) ─► PA5 I_SENSE
J2 Servo V+ ── R18 5mΩ ──┬────────► servo header V+ rail (unfused)
(VSRV_RAW) ├─ R19..R22 ÷4 ─► PA4 V_SENSE
└─ JP1 ──D2──┐
├─► HT7533-1 ─► 3V3 ─► CH32V203, LED
USB-C VBUS 5V ─────────────D1──────────┘
GND: one continuous plane, common to both suppliesTwo supply domains, one ground. D1/D2 are a diode-OR so neither feeds the other. Every servo amp crosses R18, so the current reading covers the whole board.
JP1 (2-pin header, open by default): fit a shunt cap to run the logic from the servo supply with no USB — the Maestro's
VSRV=VINblock.JP2 (2-pin header): BOOT0 high, for first flash / recovery only.
Logic draw ≈ 15 mA, so the HT7533-1 (100 mA, 2.5 µA quiescent) dissipates 0.07 W even from 2S LiPo.
USB-C: CC pull-downs R14/R15, SRV05-4 clamps D+, D−, CC1, CC2.
Servo signals are 3.3 V through 220 Ω (R1–R12). Headers are SIG / V+ / GND.
Channel map
Ch | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
Pin | PA0 | PA1 | PA2 | PA3 | PA6 | PA7 | PB0 | PB1 | PA8 | PA9 | PA10 | PB8 |
Timer | T2C1 | T2C2 | T2C3 | T2C4 | T3C1 | T3C2 | T3C3 | T3C4 | T1C1 | T1C2 | T1C3 | T4C3 |
Analog | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — | — | — | — |
Reserved: PA4/PA5 rail sensing · PA11/PA12 USB · PA13/PA14 SDI · PD0/PD1 crystal · PC13 LED · PB2 BOOT1. LQFP-48 has only 10 ADC pins, and PA4/PA5 went to sensing, so analog is 8 of 12 — the Maestro 12 has all twelve.
Rail sensing
Current (R18 + U4) | Voltage (R19–R22) | |
Parts | 5 mΩ 1 W shunt, INA180A2 gain 50, high side | 4 × 5.1 kΩ, ÷4, 100 nF |
Full scale | 13.2 A | 13.2 V |
Resolution | ≈ 3.2 mA | ≈ 3.2 mV |
High side keeps the ground plane unbroken. It measures total rail current, not per channel. The ADC reference is VDDA = the LDO output (no VREF+ on LQFP-48), so readings are good for thresholds, not calibrated metering. The firmware trips all channels off after 5 bad readings (~50 ms): 5 A default overcurrent, and undervoltage chosen automatically (2S → 6.4 V, 3S → 9.6 V, anything else off). Details in USER.md §4.4.
Power limits
Limit | Set by | Value |
Absolute max on J2 | C15/C16, 16 V electrolytics | 16 V |
Full function (voltage sense) | ÷4 divider | 13.2 V |
Continuous current | 2.4 mm pour between header rows | ~5 A (6.1 A at 20 °C rise) |
The 24 A terminal is not the limit; the copper behind it is.
PCB
2 × 1 oz, 1.6 mm, 0.2 mm min trace/space, 0.3/0.6 mm vias. GND is a solid pour on both layers; SERVO_V+ is carried by three priority-ordered top-layer zones. Headers along the bottom edge, USB-C right, screw terminal left, MCU centre.
⚠️ F8 (Update PCB from Schematic) deletes H1–H4 — they have no schematic symbol. Untick Delete footprints with no symbols, or re-add them at (16, 4), (61.5, 4), (16, 33), (61.5, 33).
⚠️ HT7533-1 is not pin-compatible with the AMS1117 it replaced (SOT-89: GND / VIN+tab / VOUT). The tab is VIN.
4. Bill of materials and cost
Class: B Basic · P Preferred (both fee-free) · E Extended ($3.07 feeder fee if SMT).
Ref | Part | LCSC | Class | Qty | $/board |
U1 | CH32V203C8T6, LQFP-48 | C3001172 | E | 1 | 0.8770 |
U2 | HT7533-1, SOT-89-3 | C14289 | B | 1 | 0.1430 |
U3 | SRV05-4 ESD, SOT-23-6 | C558418 | E | 1 | 0.0270 |
U4 | INA180A2, SOT-23-5 | C192764 | E | 1 | 0.1920 |
J1 | USB-C 16P TYPE-C-31-M-12 | C165948 | E | 1 | 0.1860 |
J2 | Screw terminal 5.08 mm 2P | C474952 | E (THT) | 1 | 0.1920 |
J3–J8 | Pin header 1×6 2.54 mm | C37208 | E (THT) | 6 | 0.2520 |
JP1, JP2 | Pin header 1×2 2.54 mm | C358684 | E (THT) | 2 | 0.0180 |
Y1 | Crystal 8 MHz SMD5032 | C115962 | B | 1 | 0.2450 |
D1–D2 | B5819W, SOD-123 | C7420330 | P | 2 | 0.0340 |
D3 | LED red 0603 | C2286 | B | 1 | 0.0070 |
R1–R13 | 220 Ω 0603 (servo series + LED) | C22962 | B | 13 | 0.0650 |
R14–R17, R19–R22 | 5.1 kΩ 0603 | C23186 | B | 8 | 0.0160 |
R18 | 5 mΩ 1 W shunt, 1206 | C7419996 | E | 1 | 0.0370 |
C1–C8, C17–C18 | 100 nF 0603 X7R | C14663 | B | 10 | 0.1200 |
C9–C11 | 10 µF 0603 X5R | C19702 | B | 3 | 0.0960 |
C12 | 1 µF 0603 | C15849 | B | 1 | 0.0170 |
C13–C14 | 30 pF 0603 C0G | C1658 | B | 2 | 0.0160 |
C15–C16 | 470 µF 16 V electrolytic | C46550400 | E | 2 | 0.2140 |
58 | $2.7540 |
J9 (SDI) is not fitted. Shunt caps (C100114, two per board) cannot be fitted
by JLCPCB — order them loose, ≈ $1.80 per 100.
100 units | Total | Per board |
Components | $275.40 | $2.754 |
Assembly: setup $8.18, stencil $1.53, SMT 167 joints $26.72, THT 42 joints $68.88 + $3.58, 6 feeder fees $18.42 | $127.31 | $1.273 |
PCB fabrication (est.) | ~$40 | ~$0.40 |
Total | ≈ $443 | ≈ $4.43 |
Excludes shipping and duties. Prices are LCSC qty-100; stock checked 2026-09-19/20 (CH32V203 the thinnest at 8,643) — re-verify before ordering.
What drives cost:
Through-hole soldering is 57 % of assembly. J3–J8 cost $0.25 in parts and $0.59 in hand soldering. SMT-only with loose headers would cut assembly to $0.55/board.
Unique Extended SMT parts, not unit price. Hence 220 Ω doubles as the LED resistor, 5.1 kΩ serves CC1/CC2/BOOT0/BOOT1/divider, one SRV05-4 replaces discrete TVS diodes, and JP1/JP2 share one header part.
5. Firmware (embedded-ch32/)
RISC-V, WCH ch32v20x HAL and USB device library, xPack riscv-none-elf-gcc
15.2 (make GCC_PATH=... to override). Version USBServoController 0.4.
Flash region | Address | Size | Contents |
Bootloader | 0x0000 | 12 KB | own USB CDC bootloader ( |
Application | 0x3000 | 48 KB | servo firmware |
Script | 0xF000 | 2 KB | stored board script |
Settings | 0xF800 | 256 B used | travel limits, Maestro speed/accel ( |
Layout lives in User/flash_layout.h and both Link.ld files.
make # build/USBServoController-ch32.{elf,hex,bin}
make flash # BOOT command -> bootloader -> write, CRC-32 check, restart (~3 s)
make hosttest # on the PC: sense.c protection (21 supply scenarios), maestro.c protocol, ramps and limits (11)
python tools/verify_pinmap_ch32.py # schematic <-> pin table <-> firmwareBlank chip or recovery: make full, fit JP2, plug in USB,
wchisp flash build/USBServoController-ch32-full.bin, remove JP2, replug.
Jumping to the ROM bootloader from firmware does not work on this chip (tested),
which is why the board has its own.
Timing: 96 MHz timers, PSC 47 → 0.5 µs ticks, ARR 39999 → 20 ms frame. 0.25 µs would need a 4 MHz tick, which only fits 16 bits at ≥ 100 Hz.
Protocol: one ASCII command per line, one OK / OK <value> / ERR <reason>
reply. Servo (S G E X A), rail sensing (I U F L P C Z N), stored script
(QC QA QS QI QG QR QX), system (V BOOT). Full reference: USER.md §4.3.
Maestro protocols (User/maestro.c): bytes of 0x80 and above are Pololu
Maestro commands — Compact, Pololu (device 12) and Mini SSC framings, with
on-board speed and acceleration ramps in the Maestro's units. Both protocols
share the port. Reference: USER.md §4.3b.
Script engine (User/script.c): up to 254 instructions — move with ramp
time, wait, sync, loop, jump, analog wait/branch — compiled from text by
tools/servoscript.py, runs without a PC, optionally at power-up.
Toolchain traps
interrupt("WCH-Interrupt-fast")is silently dropped by upstream GCC — one warning, then ISRs end inretinstead ofmret. Useinterrupt("machine").GCC 15 defaults to C23, where
boolis a keyword; WCH'susb_type.htypedefs it. Built with-std=gnu11and a patched header.-march=rv32imac_zicsr_zifencei— GCC 15 split CSR and fence.i out.No
printfat runtime. A WCH exampleprintfin the USB suspend hook hung the ISR at bring-up, and PA9 (USART1 TX) is a servo output.
Modified vendor files: usb_endp.c (OUT endpoint → parser), usb_prop.c
(line coding via User/cdc_glue.c), ch32v20x_it.c (TIM2 drives servos).
6. Limitations and Maestro 12 comparison
Maestro 12 | This board | Fix |
mini-USB | USB-C | better |
no rail sensing | current + voltage, overcurrent and LiPo cut-off | better |
$29.95 | ≈ $4.43 | better |
5–16 V servo supply | 5–16 V (13.2 V full function) | parity |
12 analog inputs | 8 | respin (pin limit) |
5 V signals, 5 V user pin | 3.3 V, no 5 V rail | respin |
TTL serial, daisy-chain, | USB only, 1 LED | respin |
Pololu / Compact / Mini SSC protocols | supported (0.4): set target(s), speed, acceleration, get position / moving state / errors, go home | parity |
per-channel min/max 64–4080 µs, 1–333 Hz | per-channel limits 64–4080 µs, saved with | rate: firmware |
0.25 µs resolution | 0.5 µs | firmware, at ≥ 100 Hz |
Speed + acceleration in firmware | supported through the Maestro protocol | parity |
Settings, home positions, startup behaviour in flash | limits and speed/accel stored; no home positions, all channels boot off | firmware |
Error register, serial-timeout failsafe | protocol-error bit only; no serial timeout | firmware |
8 KB script language | 254-instruction motion script | simpler |
Maestro Control Center | own GUI ( | Pololu VID-locked |
28 × 36 mm | 66 × 38 mm | — |
Other known gaps: no reverse-polarity protection on J2 — a reversed pack
kills U4 and can vent C15/C16 (a P-FET ideal diode, ≈ $0.19, was deliberately
left out); the current-sense zero (Z) is lost at power-off.
Joining the Maestro ecosystem
Maestro software splits in two. Runtime control — nearly every community
library (FRC4564/Maestro, maestro-servo, ROS 1/2 drivers, Node, C++) — opens
the CDC port and speaks the Pololu/Compact/Mini SSC byte protocols without
checking USB IDs. Configuration (Control Center, UscCmd) uses control
transfers bound to Pololu's VID 0x1FFB and can never work here.
Firmware 0.4 implements those serial protocols, so the runtime libraries work
unchanged: verified on hardware with an unmodified FRC4564 maestro.py
(targets, speed, acceleration, position, moving state). One dispatch on the
first byte serves everything: 0xAA Pololu, 0xFF Mini SSC, 0x80–0xFE
Compact, printable ASCII the existing protocol.
Still different from a Maestro: 0.5 µs output steps (0.25 µs needs ≥ 100 Hz
frames), a fixed 50 Hz rate, no home positions, CRC or serial timeout.
Per-channel travel limits (64–4080 µs) and start-up speed/acceleration are
stored on the board with W — the GUI's gear button sets the limits. Next steps: configurable frame rate →
serial-timeout failsafe → home positions.
7. Design notes
JP1 is a header, not a power-mux IC. Automatic muxing above 6 V needs an ideal-diode controller plus FETs (LM5050 +$2.12/board); TPS2116 stops at 5.5 V. The diode-OR costs $0.03 and JP1 carries only the ~15 mA logic current. A header and shunt cap ($0.05) beat slide switches on price and have no voltage limit of their own.
JP2 is a header too, so the one jumper every board needs for its first flash needs no soldering iron.
HT7533-1 replaced the AMS1117, which was 66× oversized, drew 5 mA quiescent and wanted 22 µF tantalum. The HT7533 is cheaper, takes 30 V, and is stable with the existing 10 µF ceramics.
8. Repository layout
Path | Contents |
| KiCad 10 schematic and board; |
| application firmware ( |
|
|
| host tools — see |
| user manual |
The Fabrication Toolkit reads
LCSCfrom footprints, not symbols. After a schematic sync, checkgrep -c 'property "LCSC"' usbservocontroller.kicad_pcb(58 today) — a missing field shows as "part not found" at JLCPCB.
9. Before the next fab run
Checked against the files on 2026-09-29: ERC 0, DRC 11 errors, all the inherent header courtyard overlaps (three rows on a 2.54 mm grid), 0 unconnected.
Fix JP2's board reference. The footprint is labelled
BOOT0_SELinstead ofJP2, so DRC reports JP2 missing plus an extra footprint, and fab files would carry the wrong designator. Run F8 (with Delete footprints with no symbols unticked).Set DNP on J9 and exclude H1–H4 from BOM/position files. Neither flag is set yet, so
EXCLUDE DNPinfabrication-toolkit-options.jsondoes nothing.R13 220 Ω → 1 kΩ (C21190, Basic). PC13 is rated 3 mA; 220 Ω drives the LED at ~6 mA. Works on the first board, but out of spec.
Remove the 3 duplicated vias (GND at 11.5, 35.2; I_SENSE and V_SENSE near 32, 16–18) and decide on the courtyard errors — shrink the courtyards or add DRC exclusions so a real error cannot hide among them.
Regenerate
production/— it dates from 2026-09-20, before the last board edit. Then check that H1–H4 and J9 are gone frombom.csvandpositions.csv.Re-verify JLCPCB stock (§4).
Re-run the checks with kicad-cli sch erc usbservocontroller.kicad_sch and
kicad-cli pcb drc --schematic-parity usbservocontroller.kicad_pcb.
License
MIT — hardware design files, firmware and host tools.
Files carrying a WCH (Nanjing Qinheng Microelectronics) copyright header — the
ch32v20x HAL, USB library, startup code and the WCH-derived files in
embedded-ch32/User/ — remain under WCH's own terms, which limit their use to
WCH microcontrollers.
Available Tools
16 toolsboard_statusB
Rail current/voltage, faults, protection limits, and every channel's name, mode, travel limits, speed and current position (0 = off).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It usefully discloses the returned fields and clarifies that position 0 means off, but it does not explicitly state that the tool is read-only, has no side effects, or requires any specific connection state. The 'status' framing implies a read, but explicit behavioral guarantees are absent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence that lists the relevant status categories without filler. It is appropriately sized, though it opens with a noun list rather than a clear 'Returns...' verb, which slightly reduces front-loading.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter status tool with no output schema and no annotations, the description gives a comprehensive inventory of returned data, including the important '0 = off' meaning. It lacks an explicit read-only/no-side-effects statement, but otherwise contains what an agent needs to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics to document. The baseline for a parameterless tool is 4, and the description does not introduce confusing parameter-like details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Lists exactly what board status data is returned: rail current/voltage, faults, protection limits, and per-channel name, mode, travel limits, speed, and current position. The verb is implicit rather than stated, but the resource and scope are specific enough to distinguish it from focused tools like read_analog or measure_current.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides no guidance on when to call this versus siblings such as measure_current, read_analog, list_poses, or script_status. The agent must infer that this is a broad board overview rather than a targeted measurement or pose listing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clear_faultsA
Clear a latched overcurrent/undervoltage fault so channels can move again.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses the fault types and the outcome, but does not mention safety preconditions, side effects, permissions, or what happens if no fault is latched.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no wasted words. It states the action and its purpose immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter hardware command with an output schema, the description gives enough to invoke it correctly. It could be more complete by stating preconditions or safety implications, but the core behavior is covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there are no parameter semantics to clarify. The baseline score of 4 is appropriate because the empty schema is fully self-explanatory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Clear a latched overcurrent/undervoltage fault.' It also states the resulting effect, 'so channels can move again,' which distinguishes it from sibling tools like set_protection or stop_all.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the condition 'latched overcurrent/undervoltage fault' and the goal of restoring channel movement. However, the description does not explicitly say when not to use it or name alternatives such as board_status or set_protection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
disable_servosB
Stop driving the given channels (numbers or names); the servos go limp.
| Name | Required | Description | Default |
|---|---|---|---|
| channels | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and usefully discloses that the servos go limp, which is meaningful beyond the schema. However, it does not mention safety implications, whether torque can be restored, or whether disabling while moving is safe.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence with the action front-loaded and no wasted words. The parenthetical clarifying channel identifiers is compact and useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool with an output schema, the description is adequate but thin. It omits safety context, invalid-channel behavior, and its relationship to stop_all, which matters for correct selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It adds that channels may be numbers or names, which is useful, but it does not specify valid ranges, naming format, or examples.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: stopping the driving of given channels, with a clear physical effect that the servos go limp. It is easy to distinguish from move_servos, but it does not explicitly distinguish itself from stop_all or clarify its place among siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the action but gives no explicit when-to-use guidance, prerequisites, or alternatives. In particular, it does not explain when to use disable_servos rather than stop_all or move_servos.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
go_to_poseB
Move to a saved pose (see list_poses) and wait until it arrives.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| duration_s | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses blocking behavior via 'wait until it arrives', which is important for a motion tool. But it omits failure modes, timeout behavior, whether motion is interruptible, and safety implications.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence with zero waste. The key blocking behavior is front-loaded alongside the primary action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a motion tool with no annotations, no output schema, and undocumented parameters, the description is too thin. It covers the core action and blocking wait but leaves duration semantics, failure behavior, and return expectations unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for both parameters. It indirectly implies that 'name' refers to a saved pose from list_poses, but it says nothing about duration_s, its default, or its effect on motion timing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource ('Move to a saved pose') and distinguishes it from list_poses by pointing there for pose names. It is more specific than a tautology, but lacks detail on what a 'pose' entails in this robot context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies the prerequisite of having a saved pose by saying 'see list_poses', which is useful routing. However, it gives no explicit when-to-use or when-not-to-use guidance relative to siblings such as move_servos or play_sequence.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_posesC
Poses and the sequence saved from the GUI (servogui.json).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden, yet it says nothing about read-only safety, the return shape, or whether the sequence is included or just its name. Only the origin of the data (servogui.json) is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single short fragment with no padding, but it is not a complete sentence and is under-specified rather than concise. Nothing is front-loaded because there is no verb clause to lead with.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, zero-parameter read tool this could be complete in one sentence, but with no output schema the description should at least say what a caller gets back (pose names, coordinates, stored sequence). That essential information is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the schema has nothing to document and there is no parameter semantics to compensate for. Baseline 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The name supplies the verb ('list') while the description only names the resource: 'Poses and the sequence saved from the GUI (servogui.json).' The reference to the GUI-saved file is a useful distinguishing detail beyond a pure restatement of the name, but the fragment never states that it lists or returns anything.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no indication of when to call this versus go_to_pose or play_sequence, which operate on the same pose/sequence data. The agent is left to infer that this is the retrieval counterpart to those action tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
measure_currentB
Sample the servo-rail current continuously; returns peak, mean and min mA.
| Name | Required | Description | Default |
|---|---|---|---|
| seconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden; it does disclose the sampling mode ('continuously') and the return statistics, which is genuine behavioral value. However, it omits whether the call blocks for the sampling window, sampling rate, error/overflow behavior, or permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with no filler, but it is arguably too terse for a tool whose only parameter and blocking behavior need explaining.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Reasonable for a single-parameter tool with no output schema, since the description covers the return statistics. Still missing the meaning/units of 'seconds' and how long the call actually takes, which an agent needs to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single 'seconds' parameter (default 1), and the description never mentions a duration argument at all — 'continuously' only weakly implies a sampling window. The description fails to compensate for the undocumented parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Sample the servo-rail current') and describes the return payload (peak, mean, min mA). It is distinguishable from generic siblings like read_analog, though it never names them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No indication of when to use this versus read_analog, nor any prerequisite such as servos needing to be enabled or the port being open. Usage is only implied by the tool name and 'continuously'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_servosA
Move one or more servos and wait until they arrive.
positions: {channel number or name: pulse width in us}, e.g. {"0": 1200}.
duration_s: time for all to arrive together (0 = each channel's own speed).
Positions are clamped to each channel's limits. Turns channels on if off.| Name | Required | Description | Default |
|---|---|---|---|
| positions | Yes | ||
| duration_s | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that the call waits until arrival, that positions are clamped to channel limits, and that channels are turned on if off. It does not mention error handling or permission requirements, but the core behavioral traits are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the primary action and followed by essential parameter details. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description explains the nested positions object, the blocking wait, clamping, and power-on side effect. For a tool with no output schema and no annotations, this is nearly complete. Minor gaps include error behavior for unknown channels and confirmation of the default duration.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the description compensates by explaining the nested positions object format, giving an example, and clarifying duration_s semantics (0 means each channel's own speed). It does not mention the default duration of 1, but otherwise adds substantial meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Move one or more servos and wait until they arrive.' It is clear what the tool does, though it does not explicitly distinguish itself from siblings like go_to_pose or play_sequence.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by describing the blocking wait and the effect of turning channels on. However, there is no explicit guidance on when to use this tool versus go_to_pose, play_sequence, or stop_all, nor any stated preconditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_sequenceA
Play the GUI's saved sequence of poses (move and hold times as saved),
repeated loops times. Stops early on a fault; capped at 120 s.
| Name | Required | Description | Default |
|---|---|---|---|
| loops | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does add real behavioral facts: it repeats the saved move/hold times, aborts early on a fault, and is capped at 120 s. It omits whether the call blocks for up to that 120 s and whether stop_all can interrupt it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, with the core action front-loaded and the constraints second. No filler or restatement of the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, no-annotation, no-output-schema tool, the description supplies the essentials an agent needs: loop count semantics, fault behavior, and a hard time cap. Missing only call-blocking/return behavior and failure modes such as no sequence being saved.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the single `loops` parameter has only a default of 1, so the description does the work by explaining it means the sequence is repeated that many times. That fully covers the one parameter; a 5 would need edge cases like loops=0 or a maximum.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('play') plus resource ('the GUI's saved sequence of poses'), which clearly distinguishes it from single-pose tools like go_to_pose and script tools like run_script. It does not explicitly name a sibling as an alternative, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the resource: play a previously saved sequence. It gives no explicit guidance on when to prefer this over run_script, go_to_pose, or list_poses, and no prerequisites such as needing a sequence already saved or the port being open.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_analogB
Read channel 0-7 as an analog input (0-4095 counts, 0-3.3 V).
| Name | Required | Description | Default |
|---|---|---|---|
| channel | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden; it does disclose the meaningful behavioral trait that readings are 0-4095 counts mapping to 0-3.3 V, which tells the agent how to interpret results. It does not state that the operation is side-effect free or describe the response shape, leaving gaps for an annotation-free tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the verb and resource, with the range and voltage mapping as compact parenthetical detail. Nothing is redundant or wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read tool with no output schema, the description covers the input range and the units of the returned value, which is the most important missing piece. It still omits the response structure and error behavior for invalid channels, so it is adequate rather than complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the single parameter is an undescribed string type, so the description must compensate. It partially does by giving the valid range "0-7", but it never clarifies the expected string encoding versus an integer or what happens with out-of-range values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description pairs a specific verb ("Read") with a specific resource ("channel 0-7 as an analog input") and even states the value encoding, so the agent knows exactly what operation occurs. It is clearly distinguishable from siblings like measure_current or board_status, though it doesn't explicitly name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to choose this tool over alternatives such as measure_current or board_status, nor any preconditions or exclusions. The only implicit usage cue is the channel range 0-7.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
release_portA
Close the serial port now (servos keep holding) so the GUI or flash.py can use the board. It reopens automatically on the next tool call.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers: the side effect on servo state ('servos keep holding'), the lifecycle behavior ('reopens automatically on the next tool call'), and the reason the operation exists. It omits failure semantics — what happens if the port is already released or if a command is in flight.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, imperative and front-loaded with the action, followed by the state consequence and the auto-reopen behavior. Every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter lifecycle tool with an output schema available, the description covers action, side effect, and re-acquisition behavior. Only error/edge-case handling is absent, which is minor given the output schema can carry the result detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the schema-level baseline is 4. The description correctly implies no arguments are needed, and there is nothing further to disambiguate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (close the serial port) with immediate scope ('now') and a concrete consequence ('servos keep holding'). No sibling tool in the list does anything similar, and the description makes that exclusivity obvious by naming the external consumers (GUI, flash.py) that need the port.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear trigger condition — release when the GUI or flash.py needs the board — which effectively says when to use it. It does not state exclusions explicitly (e.g., don't bother calling if you are about to make another tool call), though the auto-reopen note implies that.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_scriptB
Start the stored script from the top.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. "From the top" adds one useful execution detail, but it does not disclose whether the call blocks, what happens if no script is stored, or how execution interacts with stop_script.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no wasted words. The key action and starting point are stated immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema can cover return values, and the zero-parameter schema is simple. However, for an action tool with no annotations, the description omits prerequisites, error behavior, and how it relates to upload_script or stop_script, leaving meaningful operational context missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema is empty with 100% description coverage, so there are no parameter semantics to explain. Baseline 4 is appropriate for a parameterless tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb, "Start," and names the resource, "the stored script," plus scope, "from the top." It is clearly distinguishable from stop_script and script_status, though it does not explicitly name siblings or prerequisites.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies the tool executes a stored script, but gives no when-to-use guidance, no when-not-to-use guidance, and no prerequisites such as whether upload_script must run first. The relationship to stop_script and script_status is left for the agent to infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
script_statusB
What script is stored on the board, and whether it is running.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It implies a harmless query (nothing about mutation, permissions, or side effects) and does name the return contents, but it says nothing about cost, latency, or failure modes when no script is uploaded.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence with zero filler, and the core information (stored script + running state) is front-loaded. Nothing would be gained by trimming it further.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description is the only source of return-value information, and it only sketches the shape (a script identity and a running flag) without stating the format or what happens when nothing is stored. Adequate for a zero-arg query but not fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. There are no arguments whose semantics the description would need to clarify.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the two facts the tool retrieves: which script is stored on the board and whether it is currently running. That is a specific resource (board script state), though it never names how it differs from the sibling board_status, which an agent may see as overlapping.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance and no mention of alternatives such as board_status or run_script. The read-only intent is only implied by the interrogative phrasing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_protectionA
Set the rail trip limits (0 disables either). Overcurrent is capped at 7500 mA: the board's continuous budget is ~5 A. Resets at power-up.
| Name | Required | Description | Default |
|---|---|---|---|
| overcurrent_ma | Yes | ||
| undervoltage_mv | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does substantive work: it discloses the 7500 mA hard cap, the ~5 A continuous budget as practical context, and that settings reset at power-up (non-persistent). It stops short of saying what happens on a trip or who consumes the resulting fault, but the safety-critical behavior is well conveyed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with zero filler; the disable rule and safety cap are front-loaded and the persistence note closes cleanly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A hardware-mutating, no-annotation, no-output-schema tool needs strong behavioral coverage. The description covers caps and persistence but omits trip behavior, undervoltage semantics, and any return/confirmation detail an agent might want.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It clarifies overcurrent_ma's cap (7500 mA) and that 0 disables both limits, but adds nothing about undervoltage_mv's range or behavior beyond the disable case, leaving one parameter largely undocumented by the name alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Set) and resource (rail trip limits), making clear it configures protection thresholds rather than measuring or clearing faults like its siblings. It doesn't explicitly name a sibling alternative, but the purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical '(0 disables either)' gives a useful operating hint on how to turn off a limit, but there is no guidance on when to call this versus siblings like clear_faults or measure_current, nor any prerequisite context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stop_allA
Panic stop: every channel off immediately.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral load: it discloses that all channels are switched off and that the effect is immediate. It does not state the resulting state, whether motion halts abruptly or smoothly, or whether recovery is needed afterward.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero waste; the urgent intent is apparent from the first word.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless tool with an output schema present, the description covers the essentials of what happens and how fast. Minor gaps remain around post-stop state and recovery, but nothing critical to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description correctly conveys that no arguments are involved in this blanket stop action.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and scope: stopping every channel immediately. The phrase 'every channel' distinguishes it from the sibling stop_script, though it never names that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Panic stop' implies emergency use, giving context for when to reach for it. However, it never states when-not to use it or points at alternatives like stop_script or disable_servos, leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stop_scriptA
Stop the stored script; servos keep their positions (stop_all to let go).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and usefully discloses the key post-condition: servos keep their positions. It does not describe idempotency or error behavior, but the central side effect is made clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single compact sentence with the main action front-loaded. The parenthetical alternative is placed efficiently and every clause adds useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter action tool with an output schema, the description provides enough context to invoke it correctly. It covers the action, the relevant servo behavior, and the closest alternative.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there are no parameter semantics to explain. The baseline score for a no-parameter tool is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: "Stop the stored script." It also distinguishes this from the sibling stop_all by explaining that servos keep their positions here, while stop_all lets go.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly implies when to use this tool: stop the script without releasing servos. It also names the alternative stop_all for releasing servos, though it does not explicitly cover failure or no-script conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_scriptA
Compile a servo script and store it in the board's flash, where the firmware runs it without a PC (autorun: also start at every power-up).
One statement per line; channels by number or name; times in ms or '1.5s':
label: jump/loop target
move <ch> <us> [<time>] ramp there; does not wait: moves on different
channels run together, a repeat move of the
same channel waits for the previous one
pose <name> [<time>] move every channel of a GUI pose
sync wait until all moves arrive
wait <time>
off <ch>|all
loop <label> [<n>] block runs n times in total; no n = forever
jump <label>
waitin <ch> >|< <0-4095> wait for analog input ch (0-7)
ifin <ch> >|< <0-4095> run next statement only if true
end
Positions are clamped to the channel limits. Max 254 instructions.| Name | Required | Description | Default |
|---|---|---|---|
| run | No | ||
| script | Yes | ||
| autorun | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden well: it discloses compilation, flash persistence, autorun-across-power-ups, clamping to channel limits, and a hard 254-instruction cap. It omits whether an upload overwrites the existing stored script and whether a board connection/port is required, which matters for a write tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose sentence, then a scannable grammar block with per-instruction semantics and edge cases (non-blocking move, repeat-move waiting, loop count semantics). Dense but every line carries information an agent needs to author valid input.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and no annotations, so the description must stand alone; it does so for the script DSL and limits, which is the hard part. The remaining gap is the unexplained 'run' flag and the absence of overwrite/idempotency behavior for the stored flash content.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry all parameter meaning. It does explain 'autorun' ('also start at every power-up') but leaves 'run' completely unaddressed and never connects script-text format to the script parameter beyond the grammar listing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('compile a servo script and store it in the board's flash') plus the distinguishing consequence: the firmware executes it without a PC. That scope separates it from play_sequence/run_script at a glance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the flash/autorun framing (persistent, PC-independent execution) but no sibling is named, so the agent gets no explicit rule for choosing upload_script over run_script, play_sequence, or go_to_pose. The autorun parenthetical hints at a persistence decision but doesn't route the call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
16 tool updates
v0.1.0- First observed
board_status - First observed
clear_faults - First observed
disable_servos - First observed
go_to_pose - First observed
list_poses - First observed
measure_current - First observed
move_servos - First observed
play_sequence - First observed
read_analog - First observed
release_port - First observed
run_script - First observed
script_status - First observed
set_protection - First observed
stop_all - First observed
stop_script - First observed
upload_script
TDQS
Scored across 16 tools
Each tool targets a fairly distinct action: motion (move_servos, go_to_pose, play_sequence), lifecycle (upload/run/stop script), and hardware ops (read_analog, measure_current, set_protection). The only mild overlaps are disable_servos vs stop_all and board_status vs measure_current, but the descriptions clarify panic-stop vs selective release and status snapshot vs continuous sampling.
Nearly everything follows a snake_case verb_noun pattern (move_servos, clear_faults, upload_script, release_port). The small deviations are noun-first status reads (board_status, script_status) which break the verb-first convention but are still readable and predictable.
16 tools is slightly on the heavy side but justified: motion control, pose/sequence playback, analog sensing, current measurement, protection/fault handling, on-board scripting, and port management are all genuine subdomains. Nothing looks redundant enough to clearly cut.
The surface covers motion, playback, sensing, protection, and scripting well. However, board_status exposes channel names, modes, travel limits, and speed with no corresponding setter tools, so an agent cannot configure channels—a notable gap that likely forces reliance on the GUI.
Maintenance
Related MCP Connectors
Persistent memory, hybrid search and a goal graph for AI agents, over stdio or remote HTTP.
Operate Linux, macOS and Windows from your LLM. Every action runs through an auditable allowlist.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to control Unreal E…
Open-source AI agent control plane and software factory: govern every tool and model call.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables LLM-based AI agents to control SO-ARM100 and SO-101 robots through natural language commands and camera feedback. It supports various transport protocols and provides tools for both autonomous robotic movement and manual keyboard operation.86Apache 2.0
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to control SO-ARM100 and LeKiwi robots using natural language instructions and integrated camera vision. It supports multiple communication transports and includes a CLI agent compatible with Claude, Gemini, and GPT models.Apache 2.0
- AlicenseNot gradedqualityAmaintenanceConnects embodied devices (like StackChan, Raspberry Pi, ESP32) to AI via MCP protocol, enabling motion control with zero API cost, no PC required, and fully self-hosted.MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI systems to control the Reachy Mini robot—speak, listen, see, and express emotions through physical movement. Compatible with Claude, GPT, Grok, and other MCP-compatible AIs.MIT