Skip to main content
Glama
ucandevices

UsbServoController

Official

USB-C 12-Channel Servo Controller

Buy on Tindie Product page

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 — selftest.py --rail --move 58/58; channels 1–11 not yet driven with a real servo

Document

For

USER.md

using the board: wiring, power, tools, command reference, flashing

tools/README.md

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.py

Claude 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 jumper

Downloads: 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 supplies
  • Two 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=VIN block.

  • 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 (bootloader/)

Application

0x3000

48 KB

servo firmware

Script

0xF000

2 KB

stored board script

Settings

0xF800

256 B used

travel limits, Maestro speed/accel (User/settings.c, W)

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 <-> firmware

Blank 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 in ret instead of mret. Use interrupt("machine").

  • GCC 15 defaults to C23, where bool is a keyword; WCH's usb_type.h typedefs it. Built with -std=gnu11 and a patched header.

  • -march=rv32imac_zicsr_zifencei — GCC 15 split CSR and fence.i out.

  • No printf at runtime. A WCH example printf in 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, ERR pin, 3 LEDs

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 W; fixed 50 Hz

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 (servogui.py)

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

PCB/usbservocontroller/

KiCad 10 schematic and board; production/ = Fabrication Toolkit output

embedded-ch32/

application firmware (User/), bootloader (bootloader/), host test (test/)

embedded-ch32/tools/

verify_pinmap_ch32.py; put a wchisp download here (not in the repo)

tools/

host tools — see tools/README.md

USER.md

user manual

The Fabrication Toolkit reads LCSC from footprints, not symbols. After a schematic sync, check grep -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.

  1. Fix JP2's board reference. The footprint is labelled BOOT0_SEL instead of JP2, 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).

  2. Set DNP on J9 and exclude H1–H4 from BOM/position files. Neither flag is set yet, so EXCLUDE DNP in fabrication-toolkit-options.json does nothing.

  3. 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.

  4. 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.

  5. Regenerate production/ — it dates from 2026-09-20, before the last board edit. Then check that H1–H4 and J9 are gone from bom.csv and positions.csv.

  6. 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 tools
board_statusB

Rail current/voltage, faults, protection limits, and every channel's name, mode, travel limits, speed and current position (0 = off).

NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
channelsYes

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault
nameYes
duration_sNo

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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).

NameRequiredDescriptionDefault

No parameters

TDQS

C2.7/5.0
Behavior2/5

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.

Conciseness3/5

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.

Completeness2/5

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.

Parameters4/5

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.

Purpose3/5

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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault
secondsNo

TDQS

B3/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.
NameRequiredDescriptionDefault
positionsYes
duration_sNo

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
loopsNo

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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).

NameRequiredDescriptionDefault
channelYes

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault
overcurrent_maYes
undervoltage_mvNo

TDQS

A3.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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).

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.
NameRequiredDescriptionDefault
runNo
scriptYes
autorunNo

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

  1. 16 tool updatesv0.1.0
    • First observedboard_status
    • First observedclear_faults
    • First observeddisable_servos
    • First observedgo_to_pose
    • First observedlist_poses
    • First observedmeasure_current
    • First observedmove_servos
    • First observedplay_sequence
    • First observedread_analog
    • First observedrelease_port
    • First observedrun_script
    • First observedscript_status
    • First observedset_protection
    • First observedstop_all
    • First observedstop_script
    • First observedupload_script

TDQS

B3.4/5.0

Scored across 16 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count4/5

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.

Completeness3/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables 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.
    86
    Apache 2.0
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables 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
  • A
    license
    Not graded
    quality
    A
    maintenance
    Connects 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